mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-03-19 05:14:52 +08:00
Remove SPC_NO_MUSL_PATH, remove --libc, use SPC_LIBC instead (#642)
* Remove SPC_NO_MUSL_PATH, remove --libc, use SPC_LIBC instead * Fix tests * Internally use GNU_ARCH for unified * Update EXTENSION_DIR comments for env.ini * Remove redundant -fPIC cflags in curl
This commit is contained in:
parent
91a3a01c39
commit
b4f3657323
5
.github/workflows/tests.yml
vendored
5
.github/workflows/tests.yml
vendored
@ -100,14 +100,13 @@ jobs:
|
|||||||
path: vendor
|
path: vendor
|
||||||
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
|
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-php-
|
${{ runner.os }}-php
|
||||||
|
|
||||||
- name: "Install Dependencies"
|
- name: "Install Dependencies"
|
||||||
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
|
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
|
||||||
|
|
||||||
- name: "Run PHPUnit Tests"
|
- name: "Run PHPUnit Tests"
|
||||||
run: |
|
run: SPC_LIBC=glibc vendor/bin/phpunit tests/ --no-coverage
|
||||||
SPC_NO_MUSL_PATH=yes vendor/bin/phpunit tests/ --no-coverage
|
|
||||||
|
|
||||||
define-matrix:
|
define-matrix:
|
||||||
name: "Define Matrix"
|
name: "Define Matrix"
|
||||||
|
|||||||
@ -92,7 +92,7 @@ ADD ./bin/spc /app/bin/spc
|
|||||||
RUN /app/bin/setup-runtime
|
RUN /app/bin/setup-runtime
|
||||||
RUN /app/bin/php /app/bin/composer install --no-dev --classmap-authoritative
|
RUN /app/bin/php /app/bin/composer install --no-dev --classmap-authoritative
|
||||||
ENV PATH="/app/bin:/cmake/bin:/usr/local/go/bin:$PATH"
|
ENV PATH="/app/bin:/cmake/bin:/usr/local/go/bin:$PATH"
|
||||||
ENV SPC_SKIP_DOCTOR_CHECK_ITEMS="if musl-wrapper is installed,if musl-cross-make is installed"
|
ENV SPC_LIBC=glibc
|
||||||
|
|
||||||
ADD ./config/env.ini /app/config/env.ini
|
ADD ./config/env.ini /app/config/env.ini
|
||||||
RUN bin/spc doctor --auto-fix --debug
|
RUN bin/spc doctor --auto-fix --debug
|
||||||
@ -141,13 +141,12 @@ MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/pkgroot:/app/pkgroot"
|
|||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/frankenphp-dist:/frankenphp/dist"
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/frankenphp-dist:/frankenphp/dist"
|
||||||
|
|
||||||
# Apply env in temp env file
|
# Apply env in temp env file
|
||||||
echo 'SPC_SKIP_DOCTOR_CHECK_ITEMS=if musl-wrapper is installed,if musl-cross-make is installed' > /tmp/spc-gnu-docker.env
|
echo 'CC=/opt/rh/devtoolset-10/root/usr/bin/gcc' > /tmp/spc-gnu-docker.env
|
||||||
echo 'CC=/opt/rh/devtoolset-10/root/usr/bin/gcc' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'CXX=/opt/rh/devtoolset-10/root/usr/bin/g++' >> /tmp/spc-gnu-docker.env
|
echo 'CXX=/opt/rh/devtoolset-10/root/usr/bin/g++' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'AR=/opt/rh/devtoolset-10/root/usr/bin/ar' >> /tmp/spc-gnu-docker.env
|
echo 'AR=/opt/rh/devtoolset-10/root/usr/bin/ar' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'LD=/opt/rh/devtoolset-10/root/usr/bin/ld' >> /tmp/spc-gnu-docker.env
|
echo 'LD=/opt/rh/devtoolset-10/root/usr/bin/ld' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'SPC_DEFAULT_C_FLAGS=-fPIE -fPIC' >> /tmp/spc-gnu-docker.env
|
echo 'SPC_DEFAULT_C_FLAGS=-fPIE -fPIC' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'SPC_NO_MUSL_PATH=yes' >> /tmp/spc-gnu-docker.env
|
echo 'SPC_LIBC=glibc' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM="-Wl,-O1 -pie"' >> /tmp/spc-gnu-docker.env
|
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM="-Wl,-O1 -pie"' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS="-ldl -lpthread -lm -lresolv -lutil -lrt"' >> /tmp/spc-gnu-docker.env
|
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS="-ldl -lpthread -lm -lresolv -lutil -lrt"' >> /tmp/spc-gnu-docker.env
|
||||||
|
|
||||||
|
|||||||
@ -88,7 +88,7 @@ ADD ./bin/spc /app/bin/spc
|
|||||||
RUN /app/bin/setup-runtime
|
RUN /app/bin/setup-runtime
|
||||||
RUN /app/bin/php /app/bin/composer install --no-dev --classmap-authoritative
|
RUN /app/bin/php /app/bin/composer install --no-dev --classmap-authoritative
|
||||||
ENV PATH="/app/bin:/cmake/bin:$PATH"
|
ENV PATH="/app/bin:/cmake/bin:$PATH"
|
||||||
ENV SPC_SKIP_DOCTOR_CHECK_ITEMS="if musl-wrapper is installed,if musl-cross-make is installed"
|
ENV SPC_LIBC=glibc
|
||||||
|
|
||||||
ADD ./config/env.ini /app/config/env.ini
|
ADD ./config/env.ini /app/config/env.ini
|
||||||
RUN bin/spc doctor --auto-fix --debug
|
RUN bin/spc doctor --auto-fix --debug
|
||||||
@ -131,13 +131,12 @@ MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/downloads:/app/downloads"
|
|||||||
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/pkgroot:/app/pkgroot"
|
MOUNT_LIST="$MOUNT_LIST -v ""$(pwd)""/pkgroot:/app/pkgroot"
|
||||||
|
|
||||||
# Apply env in temp env file
|
# Apply env in temp env file
|
||||||
echo 'SPC_SKIP_DOCTOR_CHECK_ITEMS=if musl-wrapper is installed,if musl-cross-make is installed' > /tmp/spc-gnu-docker.env
|
echo 'CC=/opt/rh/devtoolset-10/root/usr/bin/gcc' > /tmp/spc-gnu-docker.env
|
||||||
echo 'CC=/opt/rh/devtoolset-10/root/usr/bin/gcc' >> /tmp/spc-gnu-docker.env
|
|
||||||
echo 'CXX=/opt/rh/devtoolset-10/root/usr/bin/g++' >> /tmp/spc-gnu-docker.env
|
echo 'CXX=/opt/rh/devtoolset-10/root/usr/bin/g++' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'AR=/opt/rh/devtoolset-10/root/usr/bin/ar' >> /tmp/spc-gnu-docker.env
|
echo 'AR=/opt/rh/devtoolset-10/root/usr/bin/ar' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'LD=/opt/rh/devtoolset-10/root/usr/bin/ld' >> /tmp/spc-gnu-docker.env
|
echo 'LD=/opt/rh/devtoolset-10/root/usr/bin/ld' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'SPC_DEFAULT_C_FLAGS=-fPIE -fPIC' >> /tmp/spc-gnu-docker.env
|
echo 'SPC_DEFAULT_C_FLAGS=-fPIE -fPIC' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'SPC_NO_MUSL_PATH=yes' >> /tmp/spc-gnu-docker.env
|
echo 'SPC_LIBC=glibc' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM="-Wl,-O1 -pie"' >> /tmp/spc-gnu-docker.env
|
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM="-Wl,-O1 -pie"' >> /tmp/spc-gnu-docker.env
|
||||||
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS="-ldl -lpthread -lm -lresolv -lutil -lrt"' >> /tmp/spc-gnu-docker.env
|
echo 'SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS="-ldl -lpthread -lm -lresolv -lutil -lrt"' >> /tmp/spc-gnu-docker.env
|
||||||
|
|
||||||
|
|||||||
@ -7,8 +7,11 @@
|
|||||||
;
|
;
|
||||||
; We need to use some pre-defined internal env vars, like `BUILD_ROOT_PATH`, `DOWNLOAD_PATH`, etc.
|
; We need to use some pre-defined internal env vars, like `BUILD_ROOT_PATH`, `DOWNLOAD_PATH`, etc.
|
||||||
; Please note that these vars cannot be defined in this file, they are only be defined before static-php-cli running.
|
; Please note that these vars cannot be defined in this file, they are only be defined before static-php-cli running.
|
||||||
; Here's a list of these pre-defined internal env vars, these vars are only be defined in the static-php-cli build process if not set in the shell environment:
|
|
||||||
;
|
;
|
||||||
|
; Here's a list of env vars, these value cannot be changed anywhere:
|
||||||
|
;
|
||||||
|
; WORKING_DIR: the working directory of the build process. (default: `$(pwd)`)
|
||||||
|
; ROOT_DIR: the root directory of static-php-cli. (default: `/path/to/static-php-cli`, when running in phar or micro mode: `phar://path/to/spc.phar`)
|
||||||
; BUILD_ROOT_PATH: the root path of the build process. (default: `$(pwd)/buildroot`)
|
; BUILD_ROOT_PATH: the root path of the build process. (default: `$(pwd)/buildroot`)
|
||||||
; BUILD_INCLUDE_PATH: the path of the include files. (default: `$BUILD_ROOT_PATH/include`)
|
; BUILD_INCLUDE_PATH: the path of the include files. (default: `$BUILD_ROOT_PATH/include`)
|
||||||
; BUILD_LIB_PATH: the path of the lib files. (default: `$BUILD_ROOT_PATH/lib`)
|
; BUILD_LIB_PATH: the path of the lib files. (default: `$BUILD_ROOT_PATH/lib`)
|
||||||
@ -17,21 +20,17 @@
|
|||||||
; SOURCE_PATH: the path of the source files. (default: `$(pwd)/source`)
|
; SOURCE_PATH: the path of the source files. (default: `$(pwd)/source`)
|
||||||
; DOWNLOAD_PATH: the path of the download files. (default: `$(pwd)/downloads`)
|
; DOWNLOAD_PATH: the path of the download files. (default: `$(pwd)/downloads`)
|
||||||
; CPU_COUNT: the count of the CPU cores. (default: `$(nproc)`)
|
; CPU_COUNT: the count of the CPU cores. (default: `$(nproc)`)
|
||||||
|
; SPC_ARCH: the arch of the current system, for some libraries needed `--host=XXX` args. (default: `$(uname -m)`, e.g. `x86_64`, `aarch64`, `arm64`)
|
||||||
; GNU_ARCH: the GNU arch of the current system. (default: `$(uname -m)`, e.g. `x86_64`, `aarch64`)
|
; GNU_ARCH: the GNU arch of the current system. (default: `$(uname -m)`, e.g. `x86_64`, `aarch64`)
|
||||||
; MAC_ARCH: the MAC arch of the current system. (default: `$(uname -m)`, e.g. `x86_64`, `arm64`)
|
; MAC_ARCH: the MAC arch of the current system. (default: `$(uname -m)`, e.g. `x86_64`, `arm64`)
|
||||||
;
|
;
|
||||||
; Here's a list of env vars, these value cannot be changed anywhere:
|
; * These vars are only be defined in Unix (macOS, Linux, FreeBSD)Builder and cannot be changed anywhere:
|
||||||
;
|
|
||||||
; WORKING_DIR: the working directory of the build process. (default: `$(pwd)`)
|
|
||||||
; ROOT_DIR: the root directory of static-php-cli. (default: `/path/to/static-php-cli`, when running in phar or micro mode: `phar://path/to/spc.phar`)
|
|
||||||
;
|
|
||||||
; * These vars are only be defined in Unix (macOS, Linux, FreeBSD)Builder *
|
|
||||||
; PATH: static-php-cli will add `$BUILD_BIN_PATH` to PATH.
|
; PATH: static-php-cli will add `$BUILD_BIN_PATH` to PATH.
|
||||||
; PKG_CONFIG: static-php-cli will set `$BUILD_BIN_PATH/pkg-config` to PKG_CONFIG.
|
; PKG_CONFIG: static-php-cli will set `$BUILD_BIN_PATH/pkg-config` to PKG_CONFIG.
|
||||||
; PKG_CONFIG_PATH: static-php-cli will set `$BUILD_LIB_PATH/pkgconfig` to PKG_CONFIG_PATH.
|
; PKG_CONFIG_PATH: static-php-cli will set `$BUILD_LIB_PATH/pkgconfig` to PKG_CONFIG_PATH.
|
||||||
; SPC_PHP_DEFAULT_OPTIMIZE_CFLAGS: the default optimization CFLAGS for compiling php. (if --no-strip option is set: `-g -O0`, else: `-g -Os`)
|
; SPC_PHP_DEFAULT_OPTIMIZE_CFLAGS: the default optimization CFLAGS for compiling php. (if --no-strip option is set: `-g -O0`, else: `-g -Os`)
|
||||||
;
|
;
|
||||||
; * These vars are only be defined in LinuxBuilder *
|
; * These vars are only be defined in LinuxBuilder and cannot be changed anywhere:
|
||||||
; SPC_LINUX_DEFAULT_CC: the default compiler for linux. (For alpine linux: `gcc`, default: `$GNU_ARCH-linux-musl-gcc`)
|
; SPC_LINUX_DEFAULT_CC: the default compiler for linux. (For alpine linux: `gcc`, default: `$GNU_ARCH-linux-musl-gcc`)
|
||||||
; SPC_LINUX_DEFAULT_CXX: the default c++ compiler for linux. (For alpine linux: `g++`, default: `$GNU_ARCH-linux-musl-g++`)
|
; SPC_LINUX_DEFAULT_CXX: the default c++ compiler for linux. (For alpine linux: `g++`, default: `$GNU_ARCH-linux-musl-g++`)
|
||||||
; SPC_LINUX_DEFAULT_AR: the default archiver for linux. (For alpine linux: `ar`, default: `$GNU_ARCH-linux-musl-ar`)
|
; SPC_LINUX_DEFAULT_AR: the default archiver for linux. (For alpine linux: `ar`, default: `$GNU_ARCH-linux-musl-ar`)
|
||||||
@ -45,7 +44,7 @@ SPC_SKIP_PHP_VERSION_CHECK="no"
|
|||||||
; Ignore some check item for bin/spc doctor command, comma separated (e.g. SPC_SKIP_DOCTOR_CHECK_ITEMS="if homebrew has installed")
|
; Ignore some check item for bin/spc doctor command, comma separated (e.g. SPC_SKIP_DOCTOR_CHECK_ITEMS="if homebrew has installed")
|
||||||
SPC_SKIP_DOCTOR_CHECK_ITEMS=""
|
SPC_SKIP_DOCTOR_CHECK_ITEMS=""
|
||||||
; EXTENSION_DIR where the built php will look for extension when a .ini instructs to load them
|
; EXTENSION_DIR where the built php will look for extension when a .ini instructs to load them
|
||||||
; only useful for builds targeting glibc --libc=glibc
|
; only useful for builds targeting not pure-static linking
|
||||||
; default paths
|
; default paths
|
||||||
; Ubuntu/Debian: /usr/lib/php/{PHP_VERSION}/
|
; Ubuntu/Debian: /usr/lib/php/{PHP_VERSION}/
|
||||||
; RHEL: /usr/lib64/php/modules
|
; RHEL: /usr/lib64/php/modules
|
||||||
@ -63,7 +62,7 @@ SPC_MICRO_PATCHES=static_extensions_win32,cli_checks,disable_huge_page,vcruntime
|
|||||||
|
|
||||||
[linux]
|
[linux]
|
||||||
; include PATH for musl libc.
|
; include PATH for musl libc.
|
||||||
SPC_NO_MUSL_PATH=no
|
SPC_LIBC=musl
|
||||||
; compiler environments
|
; compiler environments
|
||||||
CC=${SPC_LINUX_DEFAULT_CC}
|
CC=${SPC_LINUX_DEFAULT_CC}
|
||||||
CXX=${SPC_LINUX_DEFAULT_CXX}
|
CXX=${SPC_LINUX_DEFAULT_CXX}
|
||||||
|
|||||||
@ -32,7 +32,7 @@ supporting FFI extensions and loading the `xdebug.so` extension of the same PHP
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
|
bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
|
||||||
bin/spc-gnu-docker build --libc=glibc ffi,xml --build-cli --debug
|
bin/spc-gnu-docker build ffi,xml --build-cli --debug
|
||||||
|
|
||||||
buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug
|
buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug
|
||||||
```
|
```
|
||||||
|
|||||||
@ -46,10 +46,8 @@ After the image is built, you will see the same command help menu as `bin/spc`,
|
|||||||
After the container is ready, you can refer to the [local build](./manual-build) section to build your PHP static binary.
|
After the container is ready, you can refer to the [local build](./manual-build) section to build your PHP static binary.
|
||||||
Just replace `bin/spc` or `./spc` with `bin/spc-gnu-docker`.
|
Just replace `bin/spc` or `./spc` with `bin/spc-gnu-docker`.
|
||||||
|
|
||||||
Unlike the default build, when building in the glibc environment, you **must** add the parameter `--libc=glibc`, such as:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bin/spc-gnu-docker --libc=glibc build bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip --build-cli --debug
|
bin/spc-gnu-docker build bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip --build-cli --debug
|
||||||
```
|
```
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|||||||
@ -29,7 +29,7 @@ PHP 默认也会从 [其他标准位置](https://www.php.net/manual/zh/configura
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
|
bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
|
||||||
bin/spc-gnu-docker build --libc=glibc ffi,xml --build-cli --debug
|
bin/spc-gnu-docker build ffi,xml --build-cli --debug
|
||||||
|
|
||||||
buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug
|
buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug
|
||||||
```
|
```
|
||||||
|
|||||||
@ -39,10 +39,8 @@ bin/spc-gnu-docker
|
|||||||
|
|
||||||
在容器准备好后,你可以参考 [本地构建](./manual-build) 章节的内容,构建你的 PHP 静态二进制文件。仅需要把 `bin/spc` 或 `./spc` 替换为 `bin/spc-gnu-docker` 即可。
|
在容器准备好后,你可以参考 [本地构建](./manual-build) 章节的内容,构建你的 PHP 静态二进制文件。仅需要把 `bin/spc` 或 `./spc` 替换为 `bin/spc-gnu-docker` 即可。
|
||||||
|
|
||||||
与默认构建不同的是,在 glibc 环境构建时**必须添加**参数 `--libc=glibc`,如:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bin/spc-gnu-docker --libc=glibc build bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip --build-cli --debug
|
bin/spc-gnu-docker build bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip --build-cli --debug
|
||||||
```
|
```
|
||||||
|
|
||||||
## 注意事项
|
## 注意事项
|
||||||
|
|||||||
@ -4,8 +4,8 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace SPC;
|
namespace SPC;
|
||||||
|
|
||||||
use SPC\command\BuildCliCommand;
|
|
||||||
use SPC\command\BuildLibsCommand;
|
use SPC\command\BuildLibsCommand;
|
||||||
|
use SPC\command\BuildPHPCommand;
|
||||||
use SPC\command\DeleteDownloadCommand;
|
use SPC\command\DeleteDownloadCommand;
|
||||||
use SPC\command\dev\AllExtCommand;
|
use SPC\command\dev\AllExtCommand;
|
||||||
use SPC\command\dev\ExtVerCommand;
|
use SPC\command\dev\ExtVerCommand;
|
||||||
@ -44,7 +44,7 @@ final class ConsoleApplication extends Application
|
|||||||
$this->addCommands(
|
$this->addCommands(
|
||||||
[
|
[
|
||||||
// Common commands
|
// Common commands
|
||||||
new BuildCliCommand(),
|
new BuildPHPCommand(),
|
||||||
new BuildLibsCommand(),
|
new BuildLibsCommand(),
|
||||||
new DoctorCommand(),
|
new DoctorCommand(),
|
||||||
new DownloadCommand(),
|
new DownloadCommand(),
|
||||||
|
|||||||
@ -15,8 +15,6 @@ use SPC\util\GlobalEnvManager;
|
|||||||
|
|
||||||
class LinuxBuilder extends UnixBuilderBase
|
class LinuxBuilder extends UnixBuilderBase
|
||||||
{
|
{
|
||||||
public string $libc;
|
|
||||||
|
|
||||||
/** @var bool Micro patch phar flag */
|
/** @var bool Micro patch phar flag */
|
||||||
private bool $phar_patched = false;
|
private bool $phar_patched = false;
|
||||||
|
|
||||||
@ -27,27 +25,23 @@ class LinuxBuilder extends UnixBuilderBase
|
|||||||
public function __construct(array $options = [])
|
public function __construct(array $options = [])
|
||||||
{
|
{
|
||||||
$this->options = $options;
|
$this->options = $options;
|
||||||
SystemUtil::initLibcVar($this->options['libc'] ?? null);
|
|
||||||
|
|
||||||
$this->libc = getenv('SPC_LIBC') ?: LIBC_MUSL_WRAPPER;
|
|
||||||
|
|
||||||
// check musl-cross make installed if we use musl-cross-make
|
// check musl-cross make installed if we use musl-cross-make
|
||||||
$arch = arch2gnu(php_uname('m'));
|
$arch = arch2gnu(php_uname('m'));
|
||||||
|
|
||||||
GlobalEnvManager::init($this);
|
GlobalEnvManager::init($this);
|
||||||
|
|
||||||
// set library path, some libraries need it. (We cannot use `putenv` here, because cmake will be confused)
|
if (getenv('SPC_LIBC') === 'musl' && !SystemUtil::isMuslDist()) {
|
||||||
if (!filter_var(getenv('SPC_NO_MUSL_PATH'), FILTER_VALIDATE_BOOLEAN) && $this->libc !== LIBC_GLIBC) {
|
|
||||||
$this->setOptionIfNotExist('library_path', "LIBRARY_PATH=\"/usr/local/musl/{$arch}-linux-musl/lib\"");
|
$this->setOptionIfNotExist('library_path', "LIBRARY_PATH=\"/usr/local/musl/{$arch}-linux-musl/lib\"");
|
||||||
$this->setOptionIfNotExist('ld_library_path', "LD_LIBRARY_PATH=\"/usr/local/musl/{$arch}-linux-musl/lib\"");
|
$this->setOptionIfNotExist('ld_library_path', "LD_LIBRARY_PATH=\"/usr/local/musl/{$arch}-linux-musl/lib\"");
|
||||||
GlobalEnvManager::putenv("PATH=/usr/local/musl/bin:/usr/local/musl/{$arch}-linux-musl/bin:" . getenv('PATH'));
|
GlobalEnvManager::putenv("PATH=/usr/local/musl/bin:/usr/local/musl/{$arch}-linux-musl/bin:" . getenv('PATH'));
|
||||||
$configure = getenv('SPC_CMD_PREFIX_PHP_CONFIGURE');
|
$configure = getenv('SPC_CMD_PREFIX_PHP_CONFIGURE');
|
||||||
$configure = "LD_LIBRARY_PATH=\"/usr/local/musl/{$arch}-linux-musl/lib\" " . $configure;
|
$configure = "LD_LIBRARY_PATH=\"/usr/local/musl/{$arch}-linux-musl/lib\" " . $configure;
|
||||||
GlobalEnvManager::putenv("SPC_CMD_PREFIX_PHP_CONFIGURE={$configure}");
|
GlobalEnvManager::putenv("SPC_CMD_PREFIX_PHP_CONFIGURE={$configure}");
|
||||||
}
|
|
||||||
|
|
||||||
if (str_ends_with(getenv('CC'), 'linux-musl-gcc') && !file_exists("/usr/local/musl/bin/{$arch}-linux-musl-gcc") && (getenv('SPC_NO_MUSL_PATH') !== 'yes')) {
|
if (!file_exists("/usr/local/musl/{$arch}-linux-musl/lib/libc.a")) {
|
||||||
throw new WrongUsageException('musl-cross-make not installed, please install it first. (You can use `doctor` command to install it)');
|
throw new WrongUsageException('You are building with musl-libc target in glibc distro, but musl-toolchain is not installed, please install musl-toolchain first. (You can use `doctor` command to install it)');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// concurrency
|
// concurrency
|
||||||
@ -216,10 +210,8 @@ class LinuxBuilder extends UnixBuilderBase
|
|||||||
$this->buildEmbed();
|
$this->buildEmbed();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (php_uname('m') === $this->getOption('arch')) {
|
$this->emitPatchPoint('before-sanity-check');
|
||||||
$this->emitPatchPoint('before-sanity-check');
|
$this->sanityCheck($build_target);
|
||||||
$this->sanityCheck($build_target);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -182,12 +182,4 @@ class SystemUtil
|
|||||||
'arch', 'manjaro',
|
'arch', 'manjaro',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function initLibcVar(?string $libc = null): void
|
|
||||||
{
|
|
||||||
if ($libc === null) {
|
|
||||||
$libc = self::isMuslDist() ? 'musl' : 'musl-wrapper';
|
|
||||||
}
|
|
||||||
f_putenv('SPC_LIBC=' . $libc);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,7 +16,7 @@ class icu extends LinuxLibraryBase
|
|||||||
{
|
{
|
||||||
$cppflags = 'CPPFLAGS="-DU_CHARSET_IS_UTF8=1 -DU_USING_ICU_NAMESPACE=1 -DU_STATIC_IMPLEMENTATION=1 -fPIC -fPIE -fno-ident"';
|
$cppflags = 'CPPFLAGS="-DU_CHARSET_IS_UTF8=1 -DU_USING_ICU_NAMESPACE=1 -DU_STATIC_IMPLEMENTATION=1 -fPIC -fPIE -fno-ident"';
|
||||||
$cxxflags = 'CXXFLAGS="-std=c++17"';
|
$cxxflags = 'CXXFLAGS="-std=c++17"';
|
||||||
$ldflags = $this->builder->libc !== 'glibc' ? 'LDFLAGS="-static"' : '';
|
$ldflags = getenv('SPC_LIBC') !== 'glibc' ? 'LDFLAGS="-static"' : '';
|
||||||
shell()->cd($this->source_dir . '/source')
|
shell()->cd($this->source_dir . '/source')
|
||||||
->exec(
|
->exec(
|
||||||
"{$cppflags} {$cxxflags} {$ldflags} " .
|
"{$cppflags} {$cxxflags} {$ldflags} " .
|
||||||
|
|||||||
@ -4,6 +4,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace SPC\builder\linux\library;
|
namespace SPC\builder\linux\library;
|
||||||
|
|
||||||
|
use SPC\exception\FileSystemException;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\RuntimeException;
|
||||||
|
|
||||||
class libffi extends LinuxLibraryBase
|
class libffi extends LinuxLibraryBase
|
||||||
@ -12,28 +13,21 @@ class libffi extends LinuxLibraryBase
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws RuntimeException
|
* @throws RuntimeException
|
||||||
|
* @throws FileSystemException
|
||||||
*/
|
*/
|
||||||
public function build(): void
|
public function build(): void
|
||||||
{
|
{
|
||||||
[$lib, , $destdir] = SEPARATED_PATH;
|
[$lib, , $destdir] = SEPARATED_PATH;
|
||||||
|
|
||||||
/*$env = $this->builder->pkgconf_env . ' CFLAGS="' . $this->builder->arch_c_flags . '"';
|
$arch = getenv('SPC_ARCH');
|
||||||
|
|
||||||
$env .= match ($this->builder->libc) {
|
|
||||||
'musl_wrapper' => " CC='{$this->builder->getOption('cc')} --static -idirafter " . BUILD_INCLUDE_PATH .
|
|
||||||
($this->builder->getOption('arch') === php_uname('m') ? '-idirafter /usr/include/ ' : '') .
|
|
||||||
"-idirafter /usr/include/{$this->builder->getOption('arch')}-linux-gnu/'",
|
|
||||||
'musl', 'glibc' => " CC='{$this->builder->getOption('cc')}'",
|
|
||||||
default => throw new RuntimeException('unsupported libc: ' . $this->builder->libc),
|
|
||||||
};*/
|
|
||||||
|
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
->exec(
|
->exec(
|
||||||
'./configure ' .
|
'./configure ' .
|
||||||
'--enable-static ' .
|
'--enable-static ' .
|
||||||
'--disable-shared ' .
|
'--disable-shared ' .
|
||||||
"--host={$this->builder->getOption('arch')}-unknown-linux " .
|
"--host={$arch}-unknown-linux " .
|
||||||
"--target={$this->builder->getOption('arch')}-unknown-linux " .
|
"--target={$arch}-unknown-linux " .
|
||||||
'--prefix= ' . // use prefix=/
|
'--prefix= ' . // use prefix=/
|
||||||
"--libdir={$lib}"
|
"--libdir={$lib}"
|
||||||
)
|
)
|
||||||
|
|||||||
@ -36,9 +36,9 @@ class libpng extends LinuxLibraryBase
|
|||||||
*/
|
*/
|
||||||
public function build(): void
|
public function build(): void
|
||||||
{
|
{
|
||||||
$optimizations = match ($this->builder->getOption('arch')) {
|
$optimizations = match (getenv('SPC_ARCH')) {
|
||||||
'x86_64' => '--enable-intel-sse ',
|
'x86_64' => '--enable-intel-sse ',
|
||||||
'arm64' => '--enable-arm-neon ',
|
'aarch64' => '--enable-arm-neon ',
|
||||||
default => '',
|
default => '',
|
||||||
};
|
};
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
|
|||||||
@ -42,10 +42,11 @@ class openssl extends LinuxLibraryBase
|
|||||||
|
|
||||||
$extra = '';
|
$extra = '';
|
||||||
$ex_lib = '-ldl -pthread';
|
$ex_lib = '-ldl -pthread';
|
||||||
|
$arch = getenv('SPC_ARCH');
|
||||||
|
|
||||||
$env = "CC='" . getenv('CC') . ' -idirafter ' . BUILD_INCLUDE_PATH .
|
$env = "CC='" . getenv('CC') . ' -idirafter ' . BUILD_INCLUDE_PATH .
|
||||||
' -idirafter /usr/include/ ' .
|
' -idirafter /usr/include/ ' .
|
||||||
' -idirafter /usr/include/' . $this->builder->getOption('arch') . '-linux-gnu/ ' .
|
' -idirafter /usr/include/' . getenv('SPC_ARCH') . '-linux-gnu/ ' .
|
||||||
"' ";
|
"' ";
|
||||||
// lib:zlib
|
// lib:zlib
|
||||||
$zlib = $this->builder->getLib('zlib');
|
$zlib = $this->builder->getLib('zlib');
|
||||||
@ -72,7 +73,7 @@ class openssl extends LinuxLibraryBase
|
|||||||
'--openssldir=/etc/ssl ' .
|
'--openssldir=/etc/ssl ' .
|
||||||
"{$zlib_extra}" .
|
"{$zlib_extra}" .
|
||||||
'no-legacy ' .
|
'no-legacy ' .
|
||||||
"linux-{$this->builder->getOption('arch')}{$clang_postfix}"
|
"linux-{$arch}{$clang_postfix}"
|
||||||
)
|
)
|
||||||
->exec('make clean')
|
->exec('make clean')
|
||||||
->execWithEnv("make -j{$this->builder->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"")
|
->execWithEnv("make -j{$this->builder->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"")
|
||||||
|
|||||||
@ -37,7 +37,7 @@ class MacOSBuilder extends UnixBuilderBase
|
|||||||
$this->arch_c_flags = getenv('SPC_DEFAULT_C_FLAGS');
|
$this->arch_c_flags = getenv('SPC_DEFAULT_C_FLAGS');
|
||||||
$this->arch_cxx_flags = getenv('SPC_DEFAULT_CXX_FLAGS');
|
$this->arch_cxx_flags = getenv('SPC_DEFAULT_CXX_FLAGS');
|
||||||
// cmake toolchain
|
// cmake toolchain
|
||||||
$this->cmake_toolchain_file = SystemUtil::makeCmakeToolchainFile('Darwin', $this->getOption('arch', php_uname('m')), $this->arch_c_flags);
|
$this->cmake_toolchain_file = SystemUtil::makeCmakeToolchainFile('Darwin', getenv('SPC_ARCH'), $this->arch_c_flags);
|
||||||
|
|
||||||
// create pkgconfig and include dir (some libs cannot create them automatically)
|
// create pkgconfig and include dir (some libs cannot create them automatically)
|
||||||
f_mkdir(BUILD_LIB_PATH . '/pkgconfig', recursive: true);
|
f_mkdir(BUILD_LIB_PATH . '/pkgconfig', recursive: true);
|
||||||
@ -203,10 +203,8 @@ class MacOSBuilder extends UnixBuilderBase
|
|||||||
$this->buildEmbed();
|
$this->buildEmbed();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (php_uname('m') === $this->getOption('arch')) {
|
$this->emitPatchPoint('before-sanity-check');
|
||||||
$this->emitPatchPoint('before-sanity-check');
|
$this->sanityCheck($build_target);
|
||||||
$this->sanityCheck($build_target);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -18,13 +18,14 @@ class libffi extends MacOSLibraryBase
|
|||||||
protected function build(): void
|
protected function build(): void
|
||||||
{
|
{
|
||||||
[, , $destdir] = SEPARATED_PATH;
|
[, , $destdir] = SEPARATED_PATH;
|
||||||
|
$arch = getenv('SPC_ARCH');
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
->exec(
|
->exec(
|
||||||
'./configure ' .
|
'./configure ' .
|
||||||
'--enable-static ' .
|
'--enable-static ' .
|
||||||
'--disable-shared ' .
|
'--disable-shared ' .
|
||||||
"--host={$this->builder->getOption('arch')}-apple-darwin " .
|
"--host={$arch}-apple-darwin " .
|
||||||
"--target={$this->builder->getOption('arch')}-apple-darwin " .
|
"--target={$arch}-apple-darwin " .
|
||||||
'--prefix= ' // use prefix=/
|
'--prefix= ' // use prefix=/
|
||||||
)
|
)
|
||||||
->exec('make clean')
|
->exec('make clean')
|
||||||
|
|||||||
@ -47,6 +47,7 @@ class openssl extends MacOSLibraryBase
|
|||||||
$extra = 'zlib';
|
$extra = 'zlib';
|
||||||
$ex_lib = trim($zlib->getStaticLibFiles() . ' ' . $ex_lib);
|
$ex_lib = trim($zlib->getStaticLibFiles() . ' ' . $ex_lib);
|
||||||
}
|
}
|
||||||
|
$arch = getenv('SPC_ARCH');
|
||||||
|
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()])
|
||||||
@ -55,7 +56,7 @@ class openssl extends MacOSLibraryBase
|
|||||||
'--prefix=/ ' . // use prefix=/
|
'--prefix=/ ' . // use prefix=/
|
||||||
"--libdir={$lib} " .
|
"--libdir={$lib} " .
|
||||||
'--openssldir=/etc/ssl ' .
|
'--openssldir=/etc/ssl ' .
|
||||||
"darwin64-{$this->builder->getOption('arch')}-cc"
|
"darwin64-{$arch}-cc"
|
||||||
)
|
)
|
||||||
->exec('make clean')
|
->exec('make clean')
|
||||||
->execWithEnv("make -j{$this->builder->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"")
|
->execWithEnv("make -j{$this->builder->concurrency} CNF_EX_LIBS=\"{$ex_lib}\"")
|
||||||
|
|||||||
@ -185,7 +185,7 @@ abstract class UnixBuilderBase extends BuilderBase
|
|||||||
$util = new SPCConfigUtil($this);
|
$util = new SPCConfigUtil($this);
|
||||||
$config = $util->config($this->ext_list, $this->lib_list, $this->getOption('with-suggested-exts'), $this->getOption('with-suggested-libs'));
|
$config = $util->config($this->ext_list, $this->lib_list, $this->getOption('with-suggested-exts'), $this->getOption('with-suggested-libs'));
|
||||||
$lens = "{$config['cflags']} {$config['ldflags']} {$config['libs']}";
|
$lens = "{$config['cflags']} {$config['ldflags']} {$config['libs']}";
|
||||||
if (PHP_OS_FAMILY === 'Linux' && $this->getOption('libc') !== 'glibc') {
|
if (PHP_OS_FAMILY === 'Linux' && getenv('SPC_LIBC') === 'musl') {
|
||||||
$lens .= ' -static';
|
$lens .= ' -static';
|
||||||
}
|
}
|
||||||
[$ret, $out] = shell()->cd($sample_file_path)->execWithResult(getenv('CC') . ' -o embed embed.c ' . $lens);
|
[$ret, $out] = shell()->cd($sample_file_path)->execWithResult(getenv('CC') . ' -o embed embed.c ' . $lens);
|
||||||
|
|||||||
@ -4,7 +4,6 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace SPC\builder\unix\library;
|
namespace SPC\builder\unix\library;
|
||||||
|
|
||||||
use SPC\builder\linux\library\LinuxLibraryBase;
|
|
||||||
use SPC\exception\FileSystemException;
|
use SPC\exception\FileSystemException;
|
||||||
use SPC\exception\RuntimeException;
|
use SPC\exception\RuntimeException;
|
||||||
use SPC\store\FileSystem;
|
use SPC\store\FileSystem;
|
||||||
@ -53,11 +52,10 @@ trait curl
|
|||||||
|
|
||||||
FileSystem::resetDir($this->source_dir . '/build');
|
FileSystem::resetDir($this->source_dir . '/build');
|
||||||
|
|
||||||
$cflags = $this instanceof LinuxLibraryBase && $this->builder->libc === 'glibc' ? '-fPIC' : '';
|
|
||||||
// compile!
|
// compile!
|
||||||
shell()->cd($this->source_dir . '/build')
|
shell()->cd($this->source_dir . '/build')
|
||||||
->setEnv([
|
->setEnv([
|
||||||
'CFLAGS' => trim($this->getLibExtraCFlags() . ' ' . $cflags),
|
'CFLAGS' => $this->getLibExtraCFlags(),
|
||||||
'LDFLAGS' => $this->getLibExtraLdFlags(),
|
'LDFLAGS' => $this->getLibExtraLdFlags(),
|
||||||
'LIBS' => $this->getLibExtraLibs(),
|
'LIBS' => $this->getLibExtraLibs(),
|
||||||
])
|
])
|
||||||
|
|||||||
@ -39,7 +39,7 @@ trait imagemagick
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$ldflags = ($this instanceof LinuxLibraryBase) && $this->builder->libc !== 'glibc' ? ('-static -ldl') : '-ldl';
|
$ldflags = ($this instanceof LinuxLibraryBase) && getenv('SPC_LIBC') !== 'glibc' ? ('-static -ldl') : '-ldl';
|
||||||
|
|
||||||
// libxml iconv patch
|
// libxml iconv patch
|
||||||
$required_libs .= $this instanceof MacOSLibraryBase ? ('-liconv') : '';
|
$required_libs .= $this instanceof MacOSLibraryBase ? ('-liconv') : '';
|
||||||
|
|||||||
@ -10,7 +10,7 @@ trait ldap
|
|||||||
{
|
{
|
||||||
public function patchBeforeBuild(): bool
|
public function patchBeforeBuild(): bool
|
||||||
{
|
{
|
||||||
$extra = ($this->builder->libc ?? '') === 'glibc' ? '-ldl -lpthread -lm -lresolv -lutil' : '';
|
$extra = getenv('SPC_LIBC') === 'glibc' ? '-ldl -lpthread -lm -lresolv -lutil' : '';
|
||||||
FileSystem::replaceFileStr($this->source_dir . '/configure', '"-lssl -lcrypto', '"-lssl -lcrypto -lz ' . $extra);
|
FileSystem::replaceFileStr($this->source_dir . '/configure', '"-lssl -lcrypto', '"-lssl -lcrypto -lz ' . $extra);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ trait pkgconfig
|
|||||||
protected function build(): void
|
protected function build(): void
|
||||||
{
|
{
|
||||||
$cflags = PHP_OS_FAMILY !== 'Linux' ? "{$this->builder->arch_c_flags} -Wimplicit-function-declaration -Wno-int-conversion" : '';
|
$cflags = PHP_OS_FAMILY !== 'Linux' ? "{$this->builder->arch_c_flags} -Wimplicit-function-declaration -Wno-int-conversion" : '';
|
||||||
$ldflags = !($this instanceof LinuxLibraryBase) || $this->builder->libc === 'glibc' ? '' : '--static';
|
$ldflags = !($this instanceof LinuxLibraryBase) || getenv('SPC_LIBC') === 'glibc' ? '' : '--static';
|
||||||
|
|
||||||
shell()->cd($this->source_dir)
|
shell()->cd($this->source_dir)
|
||||||
->setEnv(['CFLAGS' => "{$this->getLibExtraCFlags()} {$cflags}", 'LDFLAGS' => "{$this->getLibExtraLdFlags()} {$ldflags}", 'LIBS' => $this->getLibExtraLibs()])
|
->setEnv(['CFLAGS' => "{$this->getLibExtraCFlags()} {$cflags}", 'LDFLAGS' => "{$this->getLibExtraLdFlags()} {$ldflags}", 'LIBS' => $this->getLibExtraLibs()])
|
||||||
|
|||||||
@ -47,7 +47,7 @@ trait postgresql
|
|||||||
$error_exec_cnt += $output[0] === 0 ? 0 : 1;
|
$error_exec_cnt += $output[0] === 0 ? 0 : 1;
|
||||||
if (!empty($output[1][0])) {
|
if (!empty($output[1][0])) {
|
||||||
$ldflags = $output[1][0];
|
$ldflags = $output[1][0];
|
||||||
$envs .= !($this instanceof LinuxLibraryBase) || $this->builder->libc === 'glibc' ? " LDFLAGS=\"{$ldflags}\" " : " LDFLAGS=\"{$ldflags} -static\" ";
|
$envs .= !($this instanceof LinuxLibraryBase) || getenv('SPC_LIBC') === 'glibc' ? " LDFLAGS=\"{$ldflags}\" " : " LDFLAGS=\"{$ldflags} -static\" ";
|
||||||
}
|
}
|
||||||
$output = shell()->execWithResult("pkg-config --libs-only-l --static {$packages}");
|
$output = shell()->execWithResult("pkg-config --libs-only-l --static {$packages}");
|
||||||
$error_exec_cnt += $output[0] === 0 ? 0 : 1;
|
$error_exec_cnt += $output[0] === 0 ? 0 : 1;
|
||||||
|
|||||||
@ -12,25 +12,12 @@ abstract class BuildCommand extends BaseCommand
|
|||||||
{
|
{
|
||||||
parent::__construct($name);
|
parent::__construct($name);
|
||||||
|
|
||||||
switch (PHP_OS_FAMILY) {
|
if (PHP_OS_FAMILY === 'Windows') {
|
||||||
case 'Windows':
|
$this->addOption('with-sdk-binary-dir', null, InputOption::VALUE_REQUIRED, 'path to binary sdk');
|
||||||
$this->addOption('with-sdk-binary-dir', null, InputOption::VALUE_REQUIRED, 'path to binary sdk');
|
$this->addOption('vs-ver', null, InputOption::VALUE_REQUIRED, 'vs version, e.g. "17" for Visual Studio 2022');
|
||||||
$this->addOption('vs-ver', null, InputOption::VALUE_REQUIRED, 'vs version, e.g. "17" for Visual Studio 2022');
|
|
||||||
$this->addOption('arch', null, InputOption::VALUE_REQUIRED, 'architecture, "x64" or "arm64"', 'x64');
|
|
||||||
break;
|
|
||||||
case 'Linux':
|
|
||||||
$this->addOption('libc', null, InputOption::VALUE_REQUIRED, 'glibc, musl or musl-wrapper', 'musl-wrapper');
|
|
||||||
// no break
|
|
||||||
case 'Darwin':
|
|
||||||
$this->addOption('cc', null, InputOption::VALUE_REQUIRED, 'C compiler');
|
|
||||||
$this->addOption('cxx', null, InputOption::VALUE_REQUIRED, 'C++ compiler');
|
|
||||||
$this->addOption('ar', null, InputOption::VALUE_REQUIRED, 'ar');
|
|
||||||
$this->addOption('ld', null, InputOption::VALUE_REQUIRED, 'ld');
|
|
||||||
$this->addOption('arch', null, InputOption::VALUE_REQUIRED, 'architecture', php_uname('m'));
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->addOption('with-clean', null, null, 'fresh build, remove `source` dir before `make`');
|
$this->addOption('with-clean', null, null, 'fresh build, remove `source` and `buildroot` dir before build');
|
||||||
$this->addOption('bloat', null, null, 'add all libraries into binary');
|
$this->addOption('bloat', null, null, 'add all libraries into binary');
|
||||||
$this->addOption('rebuild', 'r', null, 'Delete old build and rebuild');
|
$this->addOption('rebuild', 'r', null, 'Delete old build and rebuild');
|
||||||
$this->addOption('enable-zts', null, null, 'enable ZTS support');
|
$this->addOption('enable-zts', null, null, 'enable ZTS support');
|
||||||
|
|||||||
@ -19,7 +19,7 @@ use Symfony\Component\Console\Input\InputOption;
|
|||||||
use ZM\Logger\ConsoleColor;
|
use ZM\Logger\ConsoleColor;
|
||||||
|
|
||||||
#[AsCommand('build', 'build PHP', ['build:php'])]
|
#[AsCommand('build', 'build PHP', ['build:php'])]
|
||||||
class BuildCliCommand extends BuildCommand
|
class BuildPHPCommand extends BuildCommand
|
||||||
{
|
{
|
||||||
public function configure(): void
|
public function configure(): void
|
||||||
{
|
{
|
||||||
@ -29,8 +29,8 @@ class BuildCliCommand extends BuildCommand
|
|||||||
$this->addOption('with-libs', null, InputOption::VALUE_REQUIRED, 'add additional libraries, comma separated', '');
|
$this->addOption('with-libs', null, InputOption::VALUE_REQUIRED, 'add additional libraries, comma separated', '');
|
||||||
$this->addOption('build-micro', null, null, 'Build micro SAPI');
|
$this->addOption('build-micro', null, null, 'Build micro SAPI');
|
||||||
$this->addOption('build-cli', null, null, 'Build cli SAPI');
|
$this->addOption('build-cli', null, null, 'Build cli SAPI');
|
||||||
$this->addOption('build-fpm', null, null, 'Build fpm SAPI');
|
$this->addOption('build-fpm', null, null, 'Build fpm SAPI (not available on Windows)');
|
||||||
$this->addOption('build-embed', null, null, 'Build embed SAPI');
|
$this->addOption('build-embed', null, null, 'Build embed SAPI (not available on Windows)');
|
||||||
$this->addOption('build-all', null, null, 'Build all SAPI');
|
$this->addOption('build-all', null, null, 'Build all SAPI');
|
||||||
$this->addOption('no-strip', null, null, 'build without strip, in order to debug and load external extensions');
|
$this->addOption('no-strip', null, null, 'build without strip, in order to debug and load external extensions');
|
||||||
$this->addOption('disable-opcache-jit', null, null, 'disable opcache jit');
|
$this->addOption('disable-opcache-jit', null, null, 'disable opcache jit');
|
||||||
@ -155,14 +155,17 @@ class BuildCliCommand extends BuildCommand
|
|||||||
$builder->proveExts($extensions);
|
$builder->proveExts($extensions);
|
||||||
// validate libs and exts
|
// validate libs and exts
|
||||||
$builder->validateLibsAndExts();
|
$builder->validateLibsAndExts();
|
||||||
|
|
||||||
|
// clean builds and sources
|
||||||
|
if ($this->input->getOption('with-clean')) {
|
||||||
|
logger()->info('Cleaning source and previous build dir...');
|
||||||
|
FileSystem::removeDir(SOURCE_PATH);
|
||||||
|
FileSystem::removeDir(BUILD_ROOT_PATH);
|
||||||
|
}
|
||||||
|
|
||||||
// build or install libraries
|
// build or install libraries
|
||||||
$builder->setupLibs();
|
$builder->setupLibs();
|
||||||
|
|
||||||
if ($this->input->getOption('with-clean')) {
|
|
||||||
logger()->info('Cleaning source dir...');
|
|
||||||
FileSystem::removeDir(SOURCE_PATH);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process -I option
|
// Process -I option
|
||||||
$custom_ini = [];
|
$custom_ini = [];
|
||||||
foreach ($this->input->getOption('with-hardcoded-ini') as $value) {
|
foreach ($this->input->getOption('with-hardcoded-ini') as $value) {
|
||||||
@ -26,6 +26,9 @@ class LinuxMuslCheck
|
|||||||
if (SystemUtil::isMuslDist()) {
|
if (SystemUtil::isMuslDist()) {
|
||||||
return CheckResult::ok('musl-based distro, skipped');
|
return CheckResult::ok('musl-based distro, skipped');
|
||||||
}
|
}
|
||||||
|
if (getenv('SPC_LIBC') === 'glibc') {
|
||||||
|
return CheckResult::ok('Building with glibc, skipped');
|
||||||
|
}
|
||||||
|
|
||||||
$musl_wrapper_lib = sprintf('/lib/ld-musl-%s.so.1', php_uname('m'));
|
$musl_wrapper_lib = sprintf('/lib/ld-musl-%s.so.1', php_uname('m'));
|
||||||
if (file_exists($musl_wrapper_lib) && file_exists('/usr/local/musl/lib/libc.a')) {
|
if (file_exists($musl_wrapper_lib) && file_exists('/usr/local/musl/lib/libc.a')) {
|
||||||
@ -40,6 +43,10 @@ class LinuxMuslCheck
|
|||||||
if (SystemUtil::isMuslDist()) {
|
if (SystemUtil::isMuslDist()) {
|
||||||
return CheckResult::ok('musl-based distro, skipped');
|
return CheckResult::ok('musl-based distro, skipped');
|
||||||
}
|
}
|
||||||
|
if (getenv('SPC_LIBC') === 'glibc') {
|
||||||
|
return CheckResult::ok('Building with glibc, skipped');
|
||||||
|
}
|
||||||
|
|
||||||
$arch = arch2gnu(php_uname('m'));
|
$arch = arch2gnu(php_uname('m'));
|
||||||
$cross_compile_lib = "/usr/local/musl/{$arch}-linux-musl/lib/libc.a";
|
$cross_compile_lib = "/usr/local/musl/{$arch}-linux-musl/lib/libc.a";
|
||||||
$cross_compile_gcc = "/usr/local/musl/bin/{$arch}-linux-musl-gcc";
|
$cross_compile_gcc = "/usr/local/musl/bin/{$arch}-linux-musl-gcc";
|
||||||
|
|||||||
@ -40,7 +40,7 @@ class MacOSToolCheckList
|
|||||||
if (($path = $this->findCommand('brew')) === null) {
|
if (($path = $this->findCommand('brew')) === null) {
|
||||||
return CheckResult::fail('Homebrew is not installed', 'brew');
|
return CheckResult::fail('Homebrew is not installed', 'brew');
|
||||||
}
|
}
|
||||||
if ($path !== '/opt/homebrew/bin/brew' && php_uname('m') === 'arm64') {
|
if ($path !== '/opt/homebrew/bin/brew' && getenv('GNU_ARCH') === 'aarch64') {
|
||||||
return CheckResult::fail('Current homebrew (/usr/local/bin/homebrew) is not installed for M1 Mac, please re-install homebrew in /opt/homebrew/ !');
|
return CheckResult::fail('Current homebrew (/usr/local/bin/homebrew) is not installed for M1 Mac, please re-install homebrew in /opt/homebrew/ !');
|
||||||
}
|
}
|
||||||
return CheckResult::ok();
|
return CheckResult::ok();
|
||||||
|
|||||||
@ -98,7 +98,7 @@ class SourcePatcher
|
|||||||
}
|
}
|
||||||
// patch capstone
|
// patch capstone
|
||||||
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/configure', '/have_capstone="yes"/', 'have_capstone="no"');
|
FileSystem::replaceFileRegex(SOURCE_PATH . '/php-src/configure', '/have_capstone="yes"/', 'have_capstone="no"');
|
||||||
if ($builder instanceof LinuxBuilder && $builder->libc === 'glibc') {
|
if ($builder instanceof LinuxBuilder && getenv('SPC_LIBC') === 'glibc') {
|
||||||
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/Zend/zend_operators.h', '# define ZEND_USE_ASM_ARITHMETIC 1', '# define ZEND_USE_ASM_ARITHMETIC 0');
|
FileSystem::replaceFileStr(SOURCE_PATH . '/php-src/Zend/zend_operators.h', '# define ZEND_USE_ASM_ARITHMETIC 1', '# define ZEND_USE_ASM_ARITHMETIC 0');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -47,7 +47,7 @@ class GlobalEnvManager
|
|||||||
|
|
||||||
// Define env vars for linux
|
// Define env vars for linux
|
||||||
if (PHP_OS_FAMILY === 'Linux') {
|
if (PHP_OS_FAMILY === 'Linux') {
|
||||||
$arch = arch2gnu(php_uname('m'));
|
$arch = getenv('GNU_ARCH');
|
||||||
if (SystemUtil::isMuslDist()) {
|
if (SystemUtil::isMuslDist()) {
|
||||||
self::putenv('SPC_LINUX_DEFAULT_CC=gcc');
|
self::putenv('SPC_LINUX_DEFAULT_CC=gcc');
|
||||||
self::putenv('SPC_LINUX_DEFAULT_CXX=g++');
|
self::putenv('SPC_LINUX_DEFAULT_CXX=g++');
|
||||||
|
|||||||
@ -83,9 +83,5 @@ const AUTOCONF_CPPFLAGS = 4;
|
|||||||
const AUTOCONF_LDFLAGS = 8;
|
const AUTOCONF_LDFLAGS = 8;
|
||||||
const AUTOCONF_ALL = 15;
|
const AUTOCONF_ALL = 15;
|
||||||
|
|
||||||
const LIBC_MUSL_WRAPPER = 'musl-wrapper';
|
|
||||||
const LIBC_MUSL = 'musl';
|
|
||||||
const LIBC_GLIBC = 'glibc';
|
|
||||||
|
|
||||||
ConsoleLogger::$date_format = 'H:i:s';
|
ConsoleLogger::$date_format = 'H:i:s';
|
||||||
ConsoleLogger::$format = '[%date%] [I] %body%';
|
ConsoleLogger::$format = '[%date%] [I] %body%';
|
||||||
|
|||||||
@ -45,5 +45,6 @@ GlobalEnvManager::putenv('PKG_ROOT_PATH=' . PKG_ROOT_PATH);
|
|||||||
GlobalEnvManager::putenv('SOURCE_PATH=' . SOURCE_PATH);
|
GlobalEnvManager::putenv('SOURCE_PATH=' . SOURCE_PATH);
|
||||||
GlobalEnvManager::putenv('DOWNLOAD_PATH=' . DOWNLOAD_PATH);
|
GlobalEnvManager::putenv('DOWNLOAD_PATH=' . DOWNLOAD_PATH);
|
||||||
GlobalEnvManager::putenv('CPU_COUNT=' . CPU_COUNT);
|
GlobalEnvManager::putenv('CPU_COUNT=' . CPU_COUNT);
|
||||||
|
GlobalEnvManager::putenv('SPC_ARCH=' . php_uname('m'));
|
||||||
GlobalEnvManager::putenv('GNU_ARCH=' . GNU_ARCH);
|
GlobalEnvManager::putenv('GNU_ARCH=' . GNU_ARCH);
|
||||||
GlobalEnvManager::putenv('MAC_ARCH=' . MAC_ARCH);
|
GlobalEnvManager::putenv('MAC_ARCH=' . MAC_ARCH);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user