]>
Commit | Line | Data |
---|---|---|
c638a5d4 | 1 | #!/bin/sh |
2 | # inter-dependencies checker. | |
3 | ||
4 | with_mysqlnd=mysqlnd | |
5 | ||
77ab4842 ER |
6 | dep_session="" |
7 | dep_filter='' | |
c638a5d4 | 8 | dep_eaccelerator='session' |
77ab4842 | 9 | dep_mysqlnd='' |
cc302397 | 10 | dep_mysql="$dep_mysqlnd $with_mysqlnd" |
77ab4842 ER |
11 | dep_mysqli="$dep_mysqlnd $with_mysqlnd" |
12 | dep_pdo="" | |
c638a5d4 | 13 | dep_pdo_sqlite="$dep_pdo pdo" |
14 | dep_pdo_pgsql="$dep_pdo pdo" | |
15 | dep_pdo_oci="$dep_pdo pdo" | |
16 | dep_pdo_odbc="$dep_pdo pdo" | |
17 | dep_pdo_firebird="$dep_pdo pdo" | |
18 | dep_pdo_dblib="$dep_pdo pdo" | |
cc302397 | 19 | dep_pdo_mysql="$dep_pdo pdo $dep_mysqlnd $with_mysqlnd" |
77ab4842 ER |
20 | dep_simplexml="" |
21 | dep_imap="" | |
22 | dep_phar="" | |
c638a5d4 | 23 | dep_sqlite="$dep_pdo pdo" |
77ab4842 | 24 | dep_fileinfo="" |
c638a5d4 | 25 | dep_wddx='xml' |
26 | dep_xmlreader='dom' | |
27 | dep_xmlrpc='xml' | |
28 | dep_xsl='dom' | |
77ab4842 ER |
29 | dep_snmp="snmp" |
30 | dep_opcache='' | |
c638a5d4 | 31 | |
32 | php=${PHP:-$(php-config --php-binary)} | |
33 | ext_dir=${EXTENSION_DIR:-$(php-config --extension-dir)} | |
34 | conf_dir=${CONFIG_DIR:-$(php-config --sysconfdir)/conf.d $(php-config --sysconfdir)/cli.d} | |
93d946f2 ER |
35 | |
36 | test_deps() { | |
37 | tmpini=$(mktemp) | |
38 | ||
39 | # poldek --sn ac-ready -u php-* | |
40 | for ext in ${*:-$ext_dir/*.so}; do | |
41 | [ -f $ext ] || continue | |
42 | ext=${ext##*/}; ext=${ext%.so} | |
43 | ||
44 | deps=$(eval echo \$dep_$ext) | |
45 | # add ext itself, if already not in list (spl case) | |
46 | [[ $deps = *\ $ext\ * ]] || deps="$deps $ext" | |
47 | ||
48 | echo -n "$ext (deps: ${deps# })..." | |
49 | ||
50 | # special: opcache is listed as "Zend Opcache" | |
51 | [ "$ext" = "opcache" ] && ext="zend opcache" | |
52 | ||
f320f3d7 | 53 | grep -rlE '^(zend_)?extension=('$(echo "${deps# }" | tr ' ' '|')')$' $conf_dir | LC_ALL=C sort | xargs cat > $tmpini |
93d946f2 ER |
54 | $php -n -d extension_dir=$ext_dir -c $tmpini -r "exit(extension_loaded('${ext}') ? 0 : 1);" |
55 | rc=$? | |
56 | if [ $rc = 0 ]; then | |
57 | echo OK | |
58 | else | |
59 | echo FAIL | |
60 | echo "Failed config was:" | |
61 | cat $tmpini | |
62 | fi | |
63 | done | |
64 | } | |
65 | ||
f320f3d7 ER |
66 | _resolve_extension_deps() { |
67 | local name="$1" | |
68 | ||
69 | eval echo \$dep_$ext | |
70 | } | |
71 | ||
72 | # Prints a load order (0-based integer) for the given extension name. Extension | |
73 | # with lower load order should be loaded before exts with higher load order. | |
74 | # It's based on number of dependencies of the extension (with exception for | |
75 | # "imap"), which is flawed, but simple and good enough for now. | |
76 | # | |
77 | # _extension_load_order adopted from alpine linux: | |
78 | # https://github.com/alpinelinux/aports/blob/v3.10.1/community/php7/APKBUILD#L639-L653 | |
79 | _extension_load_order() { | |
80 | local name="$1" | |
81 | local deps=$(eval "echo \$dep_$name") | |
82 | ||
83 | case "$name" in | |
84 | # XXX: This must be loaded after recode, even though it does | |
85 | # not depend on it. So we must use this hack... | |
86 | imap) echo 1;; | |
87 | *) echo "${deps:=$(_resolve_extension_deps $name)}" | wc -w;; | |
88 | esac | |
89 | } | |
90 | ||
91 | generate_ini() { | |
92 | local load_order | |
93 | ||
94 | rm -rf conf.d | |
95 | install -d conf.d | |
96 | for module in ${*:-$ext_dir/*.so}; do | |
97 | [ -f $module ] || continue | |
98 | extname=${module##*/}; extname=${extname%.so} | |
99 | ||
100 | ext=extension | |
101 | # opcache.so is zend extension | |
102 | nm $module | grep -q zend_extension_entry && ext=zend_extension | |
103 | ||
104 | load_order=$(_extension_load_order "$extname") | |
105 | cat > conf.d/$(printf %02d $load_order)_$extname.ini <<-EOF | |
106 | ; Enable $extname $ext module | |
107 | $ext=$extname | |
108 | EOF | |
109 | done | |
110 | } | |
111 | ||
112 | if [ -n "$GENERATE_INI" ]; then | |
113 | generate_ini "$@" | |
114 | else | |
115 | test_deps "$@" | |
116 | fi |