コンテンツにスキップ

docker-php-ext-install

#!/bin/sh
set -e

# prefer user supplied CFLAGS, but default to our PHP_CFLAGS
: ${CFLAGS:=$PHP_CFLAGS}
: ${CPPFLAGS:=$PHP_CPPFLAGS}
: ${LDFLAGS:=$PHP_LDFLAGS}
export CFLAGS CPPFLAGS LDFLAGS

srcExists=
if [ -d /usr/src/php ]; then
        srcExists=1
fi
docker-php-source extract
if [ -z "$srcExists" ]; then
        touch /usr/src/php/.docker-delete-me
fi

cd /usr/src/php/ext

usage() {
        echo "usage: $0 [-jN] [--ini-name file.ini] ext-name [ext-name ...]"
        echo "   ie: $0 gd mysqli"
        echo "       $0 pdo pdo_mysql"
        echo "       $0 -j5 gd mbstring mysqli pdo pdo_mysql shmop"
        echo
        echo 'if custom ./configure arguments are necessary, see docker-php-ext-configure'
        echo
        echo 'Possible values for ext-name:'
        find . \
                        -mindepth 2 \
                        -maxdepth 2 \
                        -type f \
                        -name 'config.m4' \
                | xargs -n1 dirname \
                | xargs -n1 basename \
                | sort \
                | xargs
        echo
        echo 'Some of the above modules are already compiled into PHP; please check'
        echo 'the output of "php -i" to see which modules are already loaded.'
}

opts="$(getopt -o 'h?j:' --long 'help,ini-name:,jobs:' -- "$@" || { usage >&2 && false; })"
eval set -- "$opts"

j=1
iniName=
while true; do
        flag="$1"
        shift
        case "$flag" in
                --help|-h|'-?') usage && exit 0 ;;
                --ini-name) iniName="$1" && shift ;;
                --jobs|-j) j="$1" && shift ;;
                --) break ;;
                *)
                        {
                                echo "error: unknown flag: $flag"
                                usage
                        } >&2
                        exit 1
                        ;;
        esac
done

exts=
for ext; do
        if [ -z "$ext" ]; then
                continue
        fi
        if [ ! -d "$ext" ]; then
                echo >&2 "error: $PWD/$ext does not exist"
                echo >&2
                usage >&2
                exit 1
        fi
        exts="$exts $ext"
done

if [ -z "$exts" ]; then
        usage >&2
        exit 1
fi

pm='unknown'
if [ -e /lib/apk/db/installed ]; then
        pm='apk'
fi

apkDel=
if [ "$pm" = 'apk' ]; then
        if [ -n "$PHPIZE_DEPS" ]; then
                if apk info --installed .phpize-deps-configure > /dev/null; then
                        apkDel='.phpize-deps-configure'
                elif ! apk info --installed .phpize-deps > /dev/null; then
                        apk add --no-cache --virtual .phpize-deps $PHPIZE_DEPS
                        apkDel='.phpize-deps'
                fi
        fi
fi

popDir="$PWD"
for ext in $exts; do
        cd "$ext"

        [ -e Makefile ] || docker-php-ext-configure "$ext"

        make -j"$j"

        if ! php -n -d 'display_errors=stderr' -r 'exit(ZEND_DEBUG_BUILD ? 0 : 1);' > /dev/null; then
                # only "strip" modules if we aren't using a debug build of PHP
                # (none of our builds are debug builds, but PHP might be recompiled with "--enable-debug" configure option)
                # https://github.com/docker-library/php/issues/1268

                find modules \
                        -maxdepth 1 \
                        -name '*.so' \
                        -exec sh -euxc ' \
                                strip --strip-all "$@" || :
                        ' -- '{}' +
        fi

        make -j"$j" install

        find modules \
                -maxdepth 1 \
                -name '*.so' \
                -exec basename '{}' ';' \
                        | xargs -r docker-php-ext-enable ${iniName:+--ini-name "$iniName"}

        make -j"$j" clean

        cd "$popDir"
done

if [ "$pm" = 'apk' ] && [ -n "$apkDel" ]; then
        apk del --no-network $apkDel
fi

if [ -e /usr/src/php/.docker-delete-me ]; then
        docker-php-source delete
fi