From 735e712969301fa79869828fbb180a0bd1a2b8fa Mon Sep 17 00:00:00 2001 From: Peter Kokot Date: Wed, 22 Jan 2025 19:42:28 +0100 Subject: [PATCH] Replace Install.cmake with InstallDirs.cmake This removes the hacky `php_install()` command and uses CMake's `install()` commands on the account of some `PHP_INSTALL_*` variables that bypass current issues for GNU special cases mentioned in the `GNUInstallDirs` module. * The `php_configure_file()` is also replaced with only core CMake commands. The hacky php_configure_file is ok and works for its use cases, but realistically, any custom module increases the difficulty to understand the build system. On the expense of more complex code, this uses only core CMake commands - install(), configure_file(), etc. Also, `install(CODE)` supports generator expressions if they are needed in some cases. --- bin/check-cmake.php | 1 - cmake/cmake/Platform.cmake | 4 +- cmake/cmake/modules/PHP/ConfigureFile.cmake | 15 +- cmake/cmake/modules/PHP/Install.cmake | 144 ------------- cmake/cmake/modules/PHP/InstallDirs.cmake | 144 +++++++++++++ cmake/ext/phar/CMakeLists.txt | 46 ++-- cmake/pear/CMakeLists.txt | 36 ++-- cmake/sapi/apache2handler/CMakeLists.txt | 2 +- cmake/sapi/embed/CMakeLists.txt | 10 +- cmake/sapi/fpm/CMakeLists.txt | 148 +------------ cmake/sapi/fpm/cmake/Install.cmake | 222 ++++++++++++++++++++ cmake/sapi/phpdbg/CMakeLists.txt | 27 ++- cmake/scripts/CMakeLists.txt | 137 ++++++------ 13 files changed, 522 insertions(+), 414 deletions(-) delete mode 100644 cmake/cmake/modules/PHP/Install.cmake create mode 100644 cmake/cmake/modules/PHP/InstallDirs.cmake create mode 100644 cmake/sapi/fpm/cmake/Install.cmake diff --git a/bin/check-cmake.php b/bin/check-cmake.php index f949f8be..c2f28bc8 100755 --- a/bin/check-cmake.php +++ b/bin/check-cmake.php @@ -210,7 +210,6 @@ function getProjectModules(): array ], 'PHP/CheckCompilerFlag' => ['php_check_compiler_flag'], 'PHP/ConfigureFile' => ['php_configure_file'], - 'PHP/Install' => ['php_install'], 'PHP/PkgConfigGenerator' => ['pkgconfig_generate_pc'], 'PHP/Re2c' => ['php_re2c', '/find_package\([\n ]*RE2C/'], 'PHP/SearchLibraries' => ['php_search_libraries'], diff --git a/cmake/cmake/Platform.cmake b/cmake/cmake/Platform.cmake index ad253a14..fbd50f33 100644 --- a/cmake/cmake/Platform.cmake +++ b/cmake/cmake/Platform.cmake @@ -23,8 +23,8 @@ include(PHP/SystemExtensions) # _GNU_SOURCE. target_link_libraries(php_config INTERFACE PHP::SystemExtensions) -# Define GNU standard installation directories. -include(GNUInstallDirs) +# Define standard installation directories. +include(PHP/InstallDirs) # Detect C standard library implementation. include(PHP/StandardLibrary) diff --git a/cmake/cmake/modules/PHP/ConfigureFile.cmake b/cmake/cmake/modules/PHP/ConfigureFile.cmake index cca55202..c5d5d4c4 100644 --- a/cmake/cmake/modules/PHP/ConfigureFile.cmake +++ b/cmake/cmake/modules/PHP/ConfigureFile.cmake @@ -250,20 +250,21 @@ function(php_configure_file) ) endblock() - install(CODE " + string(CONFIGURE [[ block() - set(variables ${variables}) - set(valuesInCode \"${valuesInCode}\") + set(variables @variables@) + set(valuesInCode "@valuesInCode@") foreach(var value IN ZIP_LISTS variables valuesInCode) - set(\${var} \"\${value}\") + set(${var} "${value}") endforeach() configure_file( - ${___phpConfigureFileTemplate} - ${___phpConfigureFileOutput} + "@___phpConfigureFileTemplate@" + "@___phpConfigureFileOutput@" @ONLY ) endblock() - ") + ]] code @ONLY) + install(CODE "${code}") endfunction() diff --git a/cmake/cmake/modules/PHP/Install.cmake b/cmake/cmake/modules/PHP/Install.cmake deleted file mode 100644 index d64c774d..00000000 --- a/cmake/cmake/modules/PHP/Install.cmake +++ /dev/null @@ -1,144 +0,0 @@ -#[=============================================================================[ -# PHP/Install - -Set the `CMAKE_INSTALL_*` variables inside the `install(CODE|SCRIPT)`. - -This is built on top of the CMake's -[`GNUInstallDirs`](https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html) -module and the -[`install()`](https://cmake.org/cmake/help/latest/command/install.html) command. -At the time of writing, CMake documentation mentions special cases where, for -example, the `CMAKE_INSTALL_FULL_SYSCONFDIR` variable becomes the `/etc`, when -the install prefix is `/usr`, and similar. - -However, some of these special cases aren't taken into account when using the -`install()` commands. See: https://gitlab.kitware.com/cmake/cmake/-/issues/25852 - -This module exposes the following function: - -```cmake -php_install(CODE ...) -``` - -It acts the same as `install(CODE ...)`, except that also the -`CMAKE_INSTALL_*` variables are available inside the argument, like in -the rest of the CMake code. - -```cmake -php_install(CODE " - message(STATUS \"CMAKE_INSTALL_SYSCONFDIR=\${CMAKE_INSTALL_SYSCONFDIR}\") -") -``` -#]=============================================================================] - -include_guard(GLOBAL) - -if(NOT CMAKE_SCRIPT_MODE_FILE) - include(GNUInstallDirs) -endif() - -function(_php_install_set_absolute var) - if(IS_ABSOLUTE "${CMAKE_INSTALL_${var}}") - set(CMAKE_INSTALL_FULL_${var} "${CMAKE_INSTALL_${var}}" PARENT_SCOPE) - else() - set( - CMAKE_INSTALL_FULL_${var} - "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${var}}" - PARENT_SCOPE - ) - endif() -endfunction() - -function(_php_install_set_absolute_special var) - if(var STREQUAL "RUNSTATEDIR") - set(directoryName "var/run") - elseif(var STREQUAL "LOCALSTATEDIR") - set(directoryName "var") - elseif(var STREQUAL "SYSCONFDIR") - set(directoryName "etc") - else() - message( - FATAL_ERROR - "CMAKE_INSTALL_${var} is not a special-case GNU standard variable.") - endif() - - if(IS_ABSOLUTE "${CMAKE_INSTALL_${var}}") - set(dir "${CMAKE_INSTALL_${var}}") - set(fulldir "${CMAKE_INSTALL_${var}}") - elseif( - CMAKE_INSTALL_${var} MATCHES "^(etc|var|var/run)$" - AND CMAKE_INSTALL_PREFIX MATCHES "^/usr[/]?$" - ) - set(dir "${CMAKE_INSTALL_${var}}") - set(fulldir "/${CMAKE_INSTALL_${var}}") - elseif( - CMAKE_INSTALL_${var} MATCHES "^(etc|var|var/run)$" - AND NOT CMAKE_INSTALL_PREFIX MATCHES "^/opt/homebrew$|^/opt/homebrew/.*$" - AND CMAKE_INSTALL_PREFIX MATCHES "^/opt/(.*)" - ) - set(dir "${CMAKE_INSTALL_${var}}") - set(fulldir "/${directoryName}/opt/${CMAKE_MATCH_1}") - else() - set(dir "${CMAKE_INSTALL_${var}}") - set(fulldir "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${var}}") - endif() - - set(CMAKE_INSTALL_${var} "${dir}" PARENT_SCOPE) - set(CMAKE_INSTALL_FULL_${var} "${fulldir}" PARENT_SCOPE) -endfunction() - -macro(_php_install_gnu_install_dirs) - foreach( - var - BINDIR - SBINDIR - LIBEXECDIR - SHAREDSTATEDIR - LIBDIR - INCLUDEDIR - OLDINCLUDEDIR - DATAROOTDIR - DATADIR - INFODIR - LOCALEDIR - MANDIR - DOCDIR - ) - _php_install_set_absolute(${var}) - endforeach() - - _php_install_set_absolute_special(LOCALSTATEDIR) - _php_install_set_absolute_special(RUNSTATEDIR) - _php_install_set_absolute_special(SYSCONFDIR) -endmacro() - -function(php_install type code) - if(NOT type STREQUAL "CODE") - message(FATAL_ERROR "Type ${type} is not supported.") - endif() - - install(CODE " - set(CMAKE_INSTALL_BINDIR \"${CMAKE_INSTALL_BINDIR}\") - set(CMAKE_INSTALL_SBINDIR \"${CMAKE_INSTALL_SBINDIR}\") - set(CMAKE_INSTALL_LIBEXECDIR \"${CMAKE_INSTALL_LIBEXECDIR}\") - set(CMAKE_INSTALL_SYSCONFDIR \"${CMAKE_INSTALL_SYSCONFDIR}\") - set(CMAKE_INSTALL_SHAREDSTATEDIR \"${CMAKE_INSTALL_SHAREDSTATEDIR}\") - set(CMAKE_INSTALL_LOCALSTATEDIR \"${CMAKE_INSTALL_LOCALSTATEDIR}\") - set(CMAKE_INSTALL_RUNSTATEDIR \"${CMAKE_INSTALL_RUNSTATEDIR}\") - set(CMAKE_INSTALL_LIBDIR \"${CMAKE_INSTALL_LIBDIR}\") - set(CMAKE_INSTALL_INCLUDEDIR \"${CMAKE_INSTALL_INCLUDEDIR}\") - set(CMAKE_INSTALL_OLDINCLUDEDIR \"${CMAKE_INSTALL_OLDINCLUDEDIR}\") - set(CMAKE_INSTALL_DATAROOTDIR \"${CMAKE_INSTALL_DATAROOTDIR}\") - set(CMAKE_INSTALL_DATADIR \"${CMAKE_INSTALL_DATADIR}\") - set(CMAKE_INSTALL_INFODIR \"${CMAKE_INSTALL_INFODIR}\") - set(CMAKE_INSTALL_LOCALEDIR \"${CMAKE_INSTALL_LOCALEDIR}\") - set(CMAKE_INSTALL_MANDIR \"${CMAKE_INSTALL_MANDIR}\") - set(CMAKE_INSTALL_DOCDIR \"${CMAKE_INSTALL_DOCDIR}\") - - include(${CMAKE_CURRENT_FUNCTION_LIST_FILE}) - - _php_install_gnu_install_dirs() - - ${code} - " ${ARGN}) -endfunction() diff --git a/cmake/cmake/modules/PHP/InstallDirs.cmake b/cmake/cmake/modules/PHP/InstallDirs.cmake new file mode 100644 index 00000000..8845b4f7 --- /dev/null +++ b/cmake/cmake/modules/PHP/InstallDirs.cmake @@ -0,0 +1,144 @@ +#[=============================================================================[ +# PHP/InstallDirs + +This module is built on top of the CMake's GNUInstallDirs module and bypasses +some of its known issues when the GNU standards special cases are applied based +on the installation prefix (`CMAKE_INSTALL_PREFIX`). For example, when the +installation prefix is set to `/usr`, the `CMAKE_INSTALL_FULL_SYSCONF` variable +should be set to `/etc` and not `/usr/etc`, or the `CMAKE_INSTALL_LIBDIR` +variable on Debian-based machines should be `lib/` and not only +`lib` or `lib64`. And similar. + +See: https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html + +This module solves the following issues: + +* When setting the installation prefix in the installation phase (after the + configuration and build phases) with the `--prefix` option: + + ```sh + cmake --install --prefix + ``` + + the installation variables are adjusted according to GNU standards. + +* It provides additional installation variables, for using them in the CMake's + `install()` commands. The following variables: + + * `CMAKE_INSTALL_LIBDIR` + * `CMAKE_INSTALL_LOCALSTATEDIR` + * `CMAKE_INSTALL_RUNSTATEDIR` + * `CMAKE_INSTALL_SYSCONF` + + can be replaced with their `PHP_INSTALL_*` substitutes, and the paths will be + set according to the GNU standards. + + For example: + + ```cmake + install(TARGETS foo LIBRARY DESTINATION ${PHP_INSTALL_LIBDIR}) + install(DIRECTORY DESTINATION ${PHP_INSTALL_LOCALSTATEDIR}/log) + install(DIRECTORY DESTINATION ${PHP_INSTALL_RUNSTATEDIR}) + install(FILES foo.conf DESTINATION ${PHP_INSTALL_SYSCONFDIR}) + ``` + +* It enables `CMAKE_INSTALL_*` variables of the `GNUInstallDirs` module in the + `install(CODE)` and `install(SCRIPT)`. + +## Basic usage + +```cmake +# CMakeLists.txt + +include(PHP/InstallDirs) + +install(TARGETS foo LIBRARY DESTINATION ${PHP_INSTALL_LIBDIR}) +install(DIRECTORY DESTINATION ${PHP_INSTALL_LOCALSTATEDIR}/log) +install(DIRECTORY DESTINATION ${PHP_INSTALL_RUNSTATEDIR}) +install(FILES foo.conf DESTINATION ${PHP_INSTALL_SYSCONFDIR}) +install(CODE [[ + # Here the absolute libdir path is available, based on the platform and + # installation prefix. + message(STATUS "CMAKE_INSTALL_FULL_LIBDIR=${CMAKE_INSTALL_FULL_LIBDIR}") +]]) +#]=============================================================================] + +include_guard(GLOBAL) + +if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") + set(PHP_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}") +else() + set(PHP_INSTALL_LIBDIR "\${CMAKE_INSTALL_LIBDIR}") +endif() + +if(IS_ABSOLUTE "${CMAKE_INSTALL_LOCALSTATEDIR}") + set(PHP_INSTALL_LOCALSTATEDIR "${CMAKE_INSTALL_LOCALSTATEDIR}") +else() + set(PHP_INSTALL_LOCALSTATEDIR "/\${PHP_INSTALL_LOCALSTATEDIR}") +endif() + +if(IS_ABSOLUTE "${CMAKE_INSTALL_RUNSTATEDIR}") + set(PHP_INSTALL_RUNSTATEDIR "${CMAKE_INSTALL_RUNSTATEDIR}") +else() + set(PHP_INSTALL_RUNSTATEDIR "/\${PHP_INSTALL_RUNSTATEDIR}") +endif() + +if(IS_ABSOLUTE "${CMAKE_INSTALL_SYSCONFDIR}") + set(PHP_INSTALL_SYSCONFDIR "${CMAKE_INSTALL_SYSCONFDIR}") +else() + set(PHP_INSTALL_SYSCONFDIR "/\${PHP_INSTALL_SYSCONFDIR}") +endif() + +set(code "") +foreach( + var + BINDIR + DATADIR + DATAROOTDIR + DOCDIR + INCLUDEDIR + INFODIR + LIBDIR + LIBEXECDIR + LOCALEDIR + LOCALSTATEDIR + MANDIR + OLDINCLUDEDIR + RUNSTATEDIR + SBINDIR + SHAREDSTATEDIR + SYSCONFDIR +) + get_property(helpString CACHE CMAKE_INSTALL_${var} PROPERTY HELPSTRING) + if(helpString STREQUAL "No help, variable specified on the command line.") + string(CONFIGURE [[ + @code@ + set(CMAKE_INSTALL_@var@ "${CMAKE_INSTALL_@var@}") + ]] code) + endif() +endforeach() + +# Define GNU standard installation directories. +include(GNUInstallDirs) + +string(CONFIGURE [[ +######################## Added by PHP/InstallDirs.cmake ######################## +@code@ +set(CMAKE_SYSTEM_NAME "@CMAKE_SYSTEM_NAME@") +set(CMAKE_SIZEOF_VOID_P "@CMAKE_SIZEOF_VOID_P@") +set(CMAKE_LIBRARY_ARCHITECTURE "@CMAKE_LIBRARY_ARCHITECTURE@") +include(GNUInstallDirs) + +set(PHP_INSTALL_LOCALSTATEDIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}") +cmake_path(GET PHP_INSTALL_LOCALSTATEDIR RELATIVE_PART PHP_INSTALL_LOCALSTATEDIR) + +set(PHP_INSTALL_RUNSTATEDIR "${CMAKE_INSTALL_FULL_RUNSTATEDIR}") +cmake_path(GET PHP_INSTALL_RUNSTATEDIR RELATIVE_PART PHP_INSTALL_RUNSTATEDIR) + +set(PHP_INSTALL_SYSCONFDIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}") +cmake_path(GET PHP_INSTALL_SYSCONFDIR RELATIVE_PART PHP_INSTALL_SYSCONFDIR) +############################ PHP/InstallDirs.cmake ############################# +]] code @ONLY) +install(CODE "${code}" ALL_COMPONENTS) + +unset(code) diff --git a/cmake/ext/phar/CMakeLists.txt b/cmake/ext/phar/CMakeLists.txt index cd09416a..0bfd15bb 100644 --- a/cmake/ext/phar/CMakeLists.txt +++ b/cmake/ext/phar/CMakeLists.txt @@ -239,51 +239,45 @@ set_property(SOURCE php_ext_phar_generated_phar PROPERTY SYMBOLIC TRUE) # Install phar.phar file to destination. Here a duplicate phar.phar generation # step is used to generate it to a destination directory because of the install # prefix used in shebang (when using 'cmake --install --prefix ...'). -install(CODE " +string(CONFIGURE [[ execute_process( COMMAND - ${PHP_EXECUTABLE} + @PHP_EXECUTABLE@ -n - ${pharSharedOptions} + @pharSharedOptions@ -d open_basedir= -d output_buffering=0 -d memory_limit=-1 -d phar.readonly=0 - ${CMAKE_CURRENT_BINARY_DIR}/phar.php + "@CMAKE_CURRENT_BINARY_DIR@/phar.php" pack - -f ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/phar.phar + -f "@CMAKE_CURRENT_BINARY_DIR@/CMakeFiles/phar.phar" -a pharcommand -c auto -p 0 - -s ${CMAKE_CURRENT_SOURCE_DIR}/phar/phar.php + -s "@CMAKE_CURRENT_SOURCE_DIR@/phar/phar.php" -h sha1 - -b $/$ - ${CMAKE_CURRENT_SOURCE_DIR}/phar + -b "${CMAKE_INSTALL_FULL_BINDIR}/$" + "@CMAKE_CURRENT_SOURCE_DIR@/phar" ) file( - CHMOD - ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/phar.phar - FILE_PERMISSIONS - OWNER_READ - OWNER_WRITE - OWNER_EXECUTE - GROUP_READ - GROUP_EXECUTE - WORLD_READ - WORLD_EXECUTE + INSTALL + DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" + TYPE PROGRAM + RENAME @PHP_PROGRAM_PREFIX@phar@PHP_PROGRAM_SUFFIX@.phar + FILES "@CMAKE_CURRENT_BINARY_DIR@/CMakeFiles/phar.phar" ) - file( - COPY_FILE - ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/phar.phar - \$ENV{DESTDIR}$/${PHP_PROGRAM_PREFIX}phar${PHP_PROGRAM_SUFFIX}.phar + message( + STATUS + "Installing: $ENV{DESTDIR}${CMAKE_INSTALL_FULL_BINDIR}/@PHP_PROGRAM_PREFIX@phar@PHP_PROGRAM_SUFFIX@" ) - file( CREATE_LINK - ${PHP_PROGRAM_PREFIX}phar${PHP_PROGRAM_SUFFIX}.phar - \$ENV{DESTDIR}$/${PHP_PROGRAM_PREFIX}phar${PHP_PROGRAM_SUFFIX} + @PHP_PROGRAM_PREFIX@phar@PHP_PROGRAM_SUFFIX@.phar + $ENV{DESTDIR}${CMAKE_INSTALL_FULL_BINDIR}/@PHP_PROGRAM_PREFIX@phar@PHP_PROGRAM_SUFFIX@ SYMBOLIC ) -") +]] code @ONLY) +install(CODE "${code}") diff --git a/cmake/pear/CMakeLists.txt b/cmake/pear/CMakeLists.txt index c9bdf0bb..6cfcba96 100644 --- a/cmake/pear/CMakeLists.txt +++ b/cmake/pear/CMakeLists.txt @@ -44,7 +44,6 @@ Windows. #]=============================================================================] include(FeatureSummary) -include(PHP/Install) include(PHP/Set) option( @@ -128,21 +127,22 @@ elseif(CMAKE_CROSSCOMPILING AND CMAKE_CROSSCOMPILING_EMULATOR) set(PHP_EXECUTABLE "${CMAKE_CROSSCOMPILING_EMULATOR};$") endif() -php_install(CODE " - set(phpPearInstallDir \"$\") - set(phpPearInstallBinDir \"$\") - set(phpPearCurrentSourceDir \"${CMAKE_CURRENT_SOURCE_DIR}\") - set(phpPearCurrentBinaryDir \"${CMAKE_CURRENT_BINARY_DIR}\") - set(phpPearPhpExecutable \"${PHP_EXECUTABLE}\") - set(phpExtensionDir \"$\") - set(PHP_EXT_OPENSSL_SHARED ${PHP_EXT_OPENSSL_SHARED}) - set(PHP_EXT_XML_SHARED ${PHP_EXT_XML_SHARED}) - set(PHP_BINARY_DIR ${PHP_BINARY_DIR}) - set(CMAKE_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}) - set(PHP_PEAR_TEMP_DIR \"${PHP_PEAR_TEMP_DIR}\") - set(phpPearInstalledPhpBin \"\${phpPearInstallBinDir}/$\") - set(phpPearPhpProgramPrefix \"${PHP_PROGRAM_PREFIX}\") - set(phpPearPhpProgramSuffix \"${PHP_PROGRAM_SUFFIX}\") - set(phpPearInstallSysconfDir \"\${CMAKE_INSTALL_FULL_SYSCONFDIR}\") -") +string(CONFIGURE [[ + set(phpPearInstallDir "$") + set(phpPearInstallBinDir "$") + set(phpPearCurrentSourceDir "@CMAKE_CURRENT_SOURCE_DIR@") + set(phpPearCurrentBinaryDir "@CMAKE_CURRENT_BINARY_DIR@") + set(phpPearPhpExecutable "@PHP_EXECUTABLE@") + set(phpExtensionDir "$") + set(PHP_EXT_OPENSSL_SHARED @PHP_EXT_OPENSSL_SHARED@) + set(PHP_EXT_XML_SHARED @PHP_EXT_XML_SHARED@) + set(PHP_BINARY_DIR "@PHP_BINARY_DIR@") + set(CMAKE_SYSTEM_NAME "@CMAKE_SYSTEM_NAME@") + set(PHP_PEAR_TEMP_DIR "@PHP_PEAR_TEMP_DIR@") + set(phpPearInstalledPhpBin "${phpPearInstallBinDir}/$") + set(phpPearPhpProgramPrefix "@PHP_PROGRAM_PREFIX@") + set(phpPearPhpProgramSuffix "@PHP_PROGRAM_SUFFIX@") + set(phpPearInstallSysconfDir "${CMAKE_INSTALL_FULL_SYSCONFDIR}") +]] code @ONLY) +install(CODE "${code}") install(SCRIPT cmake/InstallPear.cmake) diff --git a/cmake/sapi/apache2handler/CMakeLists.txt b/cmake/sapi/apache2handler/CMakeLists.txt index 468f962e..c102c8f7 100644 --- a/cmake/sapi/apache2handler/CMakeLists.txt +++ b/cmake/sapi/apache2handler/CMakeLists.txt @@ -132,5 +132,5 @@ endif() install( TARGETS php_sapi_apache2handler - DESTINATION ${CMAKE_INSTALL_LIBDIR} + DESTINATION ${PHP_INSTALL_LIBDIR} ) diff --git a/cmake/sapi/embed/CMakeLists.txt b/cmake/sapi/embed/CMakeLists.txt index 65bda282..216cd4c1 100644 --- a/cmake/sapi/embed/CMakeLists.txt +++ b/cmake/sapi/embed/CMakeLists.txt @@ -84,15 +84,17 @@ pkgconfig_generate_pc( install( TARGETS php_sapi_embed - RUNTIME - DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE + DESTINATION ${PHP_INSTALL_LIBDIR} LIBRARY - DESTINATION ${CMAKE_INSTALL_LIBDIR} + DESTINATION ${PHP_INSTALL_LIBDIR} + RUNTIME + DESTINATION ${PHP_INSTALL_LIBDIR} FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PHP_INCLUDE_PREFIX}/sapi/embed ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/php-embed.pc - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig + DESTINATION ${PHP_INSTALL_LIBDIR}/pkgconfig ) diff --git a/cmake/sapi/fpm/CMakeLists.txt b/cmake/sapi/fpm/CMakeLists.txt index 1f5dd06e..7def5a34 100644 --- a/cmake/sapi/fpm/CMakeLists.txt +++ b/cmake/sapi/fpm/CMakeLists.txt @@ -93,8 +93,6 @@ include(CheckSourceRuns) include(CheckSymbolExists) include(CMakePushCheckState) include(FeatureSummary) -include(PHP/ConfigureFile) -include(PHP/Install) include(PHP/SearchLibraries) include(PHP/Set) @@ -534,147 +532,13 @@ if(PHP_SAPI_FPM_SELINUX) endif() ################################################################################ -# Install files. +# Configuration header. ################################################################################ -# Man documentation. - -# Replace the hardcoded runstatedir with a template placeholder. -file(READ "${CMAKE_CURRENT_SOURCE_DIR}/php-fpm.8.in" content) -string( - REPLACE - [[@php_fpm_localstatedir@/run/php-fpm.pid]] - [[@php_fpm_runstatedir@/php-fpm.pid]] - content - "${content}" -) -php_configure_file( - CONTENT "${content}" - OUTPUT php-fpm.8 - VARIABLES - php_fpm_localstatedir "$>" - # TODO: Fix the GNU standard adjustment issue with /etc, /var, and /var/run. - php_fpm_runstatedir "$>" - php_fpm_sysconfdir "$>" - php_fpm_prefix "$" - PHP_VERSION "${PHP_VERSION}" -) -install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/php-fpm.8 - RENAME ${PHP_PROGRAM_PREFIX}php-fpm${PHP_PROGRAM_SUFFIX}.8 - DESTINATION ${CMAKE_INSTALL_MANDIR}/man8 -) - -php_configure_file( - INPUT php-fpm.conf.in - OUTPUT php-fpm.conf - VARIABLES - prefix "$" - EXPANDED_LOCALSTATEDIR "$>" - php_fpm_sysconfdir "$>" -) - -php_configure_file( - INPUT www.conf.in - OUTPUT www.conf - VARIABLES - prefix "$" - php_fpm_prefix "$" - php_fpm_user "${PHP_SAPI_FPM_USER}" - php_fpm_group "${PHP_SAPI_FPM_GROUP}" - EXPANDED_DATADIR "$>" -) - -# Replace the hardcoded runstatedir with a template placeholder. -file(READ "${CMAKE_CURRENT_SOURCE_DIR}/init.d.php-fpm.in" content) -string( - REPLACE - [[php_fpm_PID=@localstatedir@/run/php-fpm.pid]] - [[php_fpm_PID=@runstatedir@/php-fpm.pid]] - content - "${content}" -) - -php_configure_file( - CONTENT "${content}" - OUTPUT init.d.php-fpm - VARIABLES - prefix "$" - exec_prefix "$" - sbindir "$>" - # TODO: Fix the GNU standard adjustment issue with /etc, /var, and /var/run. - sysconfdir "$>" - runstatedir "$>" -) - -# Replace the hardcoded runstatedir with a template placeholder. -file(READ "${CMAKE_CURRENT_SOURCE_DIR}/php-fpm.service.in" content) -string( - REPLACE - [[PIDFile=@EXPANDED_LOCALSTATEDIR@/run/php-fpm.pid]] - [[PIDFile=@EXPANDED_RUNSTATEDIR@/php-fpm.pid]] - content - "${content}" -) - -php_configure_file( - CONTENT "${content}" - OUTPUT php-fpm.service - VARIABLES - php_fpm_systemd "${PHP_FPM_SYSTEMD}" - EXPANDED_RUNSTATEDIR "$>" - EXPANDED_SBINDIR "$>" - EXPANDED_SYSCONFDIR "$>" -) - -install(TARGETS php_sapi_fpm RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR}) - -php_install(CODE " - # Create log and run directories on installation. - file( - MAKE_DIRECTORY - \"\$ENV{DESTDIR}\${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/log\" - \"\$ENV{DESTDIR}\${CMAKE_INSTALL_FULL_RUNSTATEDIR}\" - ) - - if(EXISTS \"\$ENV{DESTDIR}\${CMAKE_INSTALL_FULL_SYSCONFDIR}/php-fpm.conf\") - message( - STATUS - \"Skipping PHP FPM defconfig installation. Files already exist.\" - ) - else() - message( - STATUS - \"Installing PHP FPM defconfig to \" - \"\$ENV{DESTDIR}\${CMAKE_INSTALL_FULL_SYSCONFDIR}\" - ) - - file( - MAKE_DIRECTORY - \"\$ENV{DESTDIR}\${CMAKE_INSTALL_FULL_SYSCONFDIR}/php-fpm.d\" - ) - - file( - COPY_FILE - \"${CMAKE_CURRENT_BINARY_DIR}/php-fpm.conf\" - \"\$ENV{DESTDIR}\${CMAKE_INSTALL_FULL_SYSCONFDIR}/php-fpm.conf.default\" - ) - - file( - COPY_FILE - \"${CMAKE_CURRENT_BINARY_DIR}/www.conf\" - \"\$ENV{DESTDIR}\${CMAKE_INSTALL_FULL_SYSCONFDIR}/php-fpm.d/www.conf.default\" - ) - endif() -") - -# FPM info status HTML page. -configure_file(status.html.in status.html @ONLY) +configure_file(cmake/config.h.in config.h) -install( - FILES - ${CMAKE_CURRENT_BINARY_DIR}/status.html - DESTINATION ${CMAKE_INSTALL_DATADIR}/fpm -) +################################################################################ +# Installation. +################################################################################ -configure_file(cmake/config.h.in config.h) +include(cmake/Install.cmake) diff --git a/cmake/sapi/fpm/cmake/Install.cmake b/cmake/sapi/fpm/cmake/Install.cmake new file mode 100644 index 00000000..43175f57 --- /dev/null +++ b/cmake/sapi/fpm/cmake/Install.cmake @@ -0,0 +1,222 @@ +#[=============================================================================[ +The PHP FPM SAPI installation script. +#]=============================================================================] + +################################################################################ +# FPM target. +################################################################################ + +install(TARGETS php_sapi_fpm RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR}) + +################################################################################ +# Create var/log, [var/]run, and etc/php-fpm.d directories on installation. +################################################################################ + +install( + CODE + [[ + file( + INSTALL + DESTINATION "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/log" + TYPE DIRECTORY + FILES "" + ) + file( + INSTALL + DESTINATION "${CMAKE_INSTALL_FULL_RUNSTATEDIR}" + TYPE DIRECTORY + FILES "" + ) + file( + INSTALL + DESTINATION "${CMAKE_INSTALL_FULL_SYSCONFDIR}/php-fpm.d" + TYPE DIRECTORY + FILES "" + ) + ]] +) + +################################################################################ +# Man documentation. +################################################################################ + +# Replace the hardcoded runstatedir with a template placeholder. +file(READ "${CMAKE_CURRENT_SOURCE_DIR}/php-fpm.8.in" content) +string( + REPLACE + [[@php_fpm_localstatedir@/run/php-fpm.pid]] + [[@php_fpm_runstatedir@/php-fpm.pid]] + content + "${content}" +) +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PHP/php-fpm.8.in" "${content}") + +string(CONFIGURE [[ + block() + set(php_fpm_prefix "${CMAKE_INSTALL_PREFIX}") + set(php_fpm_localstatedir "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}") + set(php_fpm_runstatedir "${CMAKE_INSTALL_FULL_RUNSTATEDIR}") + set(php_fpm_sysconfdir "${CMAKE_INSTALL_FULL_SYSCONFDIR}") + set(PHP_VERSION "@PHP_VERSION@") + + configure_file( + "@CMAKE_CURRENT_BINARY_DIR@/CMakeFiles/PHP/php-fpm.8.in" + "@CMAKE_CURRENT_BINARY_DIR@/php-fpm.8" + @ONLY + ) + + file( + INSTALL + DESTINATION "${CMAKE_INSTALL_FULL_MANDIR}/man8" + TYPE FILE + RENAME "@PHP_PROGRAM_PREFIX@php-fpm@PHP_PROGRAM_SUFFIX@.8" + FILES "@CMAKE_CURRENT_BINARY_DIR@/php-fpm.8" + ) + endblock() +]] code @ONLY) +install(CODE "${code}") + +################################################################################ +# FPM configuration +################################################################################ + +# Install PHP FPM defconfig files without overwriting existing configuration. +string(CONFIGURE [[ + block() + set(prefix "${CMAKE_INSTALL_PREFIX}") + set(EXPANDED_LOCALSTATEDIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}") + set(php_fpm_sysconfdir "${CMAKE_INSTALL_FULL_SYSCONFDIR}") + configure_file( + "@CMAKE_CURRENT_SOURCE_DIR@/php-fpm.conf.in" + "@CMAKE_CURRENT_BINARY_DIR@/php-fpm.conf" + @ONLY + ) + + set(prefix "${CMAKE_INSTALL_PREFIX}") + set(php_fpm_prefix "${CMAKE_INSTALL_PREFIX}") + set(php_fpm_user "@PHP_SAPI_FPM_USER@") + set(php_fpm_group "@PHP_SAPI_FPM_GROUP@") + set(EXPANDED_DATADIR "${CMAKE_INSTALL_FULL_DATADIR}") + configure_file( + "@CMAKE_CURRENT_SOURCE_DIR@/www.conf.in" + "@CMAKE_CURRENT_BINARY_DIR@/www.conf" + @ONLY + ) + + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_FULL_SYSCONFDIR}/php-fpm.conf") + message( + STATUS + "Skipping PHP FPM configuration installation. The php-fpm.conf file " + "already exists." + ) + else() + file( + INSTALL + DESTINATION "${CMAKE_INSTALL_FULL_SYSCONFDIR}" + TYPE FILE + RENAME "php-fpm.conf.default" + FILES "@CMAKE_CURRENT_BINARY_DIR@/php-fpm.conf" + ) + + file( + INSTALL + DESTINATION "${CMAKE_INSTALL_FULL_SYSCONFDIR}/php-fpm.d" + TYPE FILE + RENAME "www.conf.default" + FILES "@CMAKE_CURRENT_BINARY_DIR@/www.conf" + ) + endif() + endblock() +]] code @ONLY) +install(CODE "${code}") + +################################################################################ +# FPM info status HTML page. +################################################################################ + +configure_file(status.html.in status.html @ONLY) + +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/status.html + DESTINATION ${CMAKE_INSTALL_DATADIR}/fpm +) + +################################################################################ +# FPM service files. +################################################################################ + +# Replace the hardcoded runstatedir with a template placeholder. +file(READ "${CMAKE_CURRENT_SOURCE_DIR}/init.d.php-fpm.in" content) +string( + REPLACE + [[php_fpm_PID=@localstatedir@/run/php-fpm.pid]] + [[php_fpm_PID=@runstatedir@/php-fpm.pid]] + content + "${content}" +) +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PHP/init.d.php-fpm.in" "${content}") + +string(CONFIGURE [[ + block() + set(prefix "${CMAKE_INSTALL_PREFIX}") + set(exec_prefix "${CMAKE_INSTALL_PREFIX}") + set(sbindir "${CMAKE_INSTALL_FULL_SBINDIR}") + set(sysconfdir "${CMAKE_INSTALL_FULL_SYSCONFDIR}") + set(runstatedir "${CMAKE_INSTALL_FULL_RUNSTATEDIR}") + + configure_file( + "@CMAKE_CURRENT_BINARY_DIR@/CMakeFiles/PHP/init.d.php-fpm.in" + "@CMAKE_CURRENT_BINARY_DIR@/init.d.php-fpm" + @ONLY + ) + + # TODO: This is for now disabled as it depends on the target system and + # system specific customizations might be needed. + #file( + # INSTALL + # DESTINATION "${CMAKE_INSTALL_FULL_SYSCONFDIR}/init.d" + # TYPE FILE + # RENAME "@PHP_PROGRAM_PREFIX@php-fpm@PHP_PROGRAM_SUFFIX@" + # FILES "@CMAKE_CURRENT_BINARY_DIR@/init.d.php-fpm" + #) + endblock() +]] code @ONLY) +install(CODE "${code}") + +# Replace the hardcoded runstatedir with a template placeholder. +file(READ "${CMAKE_CURRENT_SOURCE_DIR}/php-fpm.service.in" content) +string( + REPLACE + [[PIDFile=@EXPANDED_LOCALSTATEDIR@/run/php-fpm.pid]] + [[PIDFile=@EXPANDED_RUNSTATEDIR@/php-fpm.pid]] + content + "${content}" +) +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PHP/php-fpm.service.in" "${content}") + +string(CONFIGURE [[ + block() + set(php_fpm_systemd "@PHP_FPM_SYSTEMD@") + set(EXPANDED_RUNSTATEDIR "${CMAKE_INSTALL_FULL_RUNSTATEDIR}") + set(EXPANDED_SBINDIR "${CMAKE_INSTALL_FULL_SBINDIR}") + set(EXPANDED_SYSCONFDIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}") + + configure_file( + "@CMAKE_CURRENT_BINARY_DIR@/CMakeFiles/PHP/php-fpm.service.in" + "@CMAKE_CURRENT_BINARY_DIR@/php-fpm.service" + @ONLY + ) + + # TODO: This is for now disabled as it depends on the target system and + # system specific customizations might be needed. + #file( + # INSTALL + # DESTINATION "${CMAKE_INSTALL_PREFIX}/TODO" + # TYPE FILE + # RENAME "@PHP_PROGRAM_PREFIX@php-fpm@PHP_PROGRAM_SUFFIX@.service" + # FILES "@CMAKE_CURRENT_BINARY_DIR@/php-fpm.service" + #) + endblock() +]] code @ONLY) +install(CODE "${code}") diff --git a/cmake/sapi/phpdbg/CMakeLists.txt b/cmake/sapi/phpdbg/CMakeLists.txt index 1918df32..fd2aaad4 100644 --- a/cmake/sapi/phpdbg/CMakeLists.txt +++ b/cmake/sapi/phpdbg/CMakeLists.txt @@ -42,7 +42,6 @@ the `EDITLINE_ROOT` variable. include(CheckSymbolExists) include(CMakeDependentOption) include(FeatureSummary) -include(PHP/Install) ################################################################################ # Configuration options. @@ -304,13 +303,23 @@ install( DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 ) -# Create log and run directories on installation. -php_install(CODE " - file( - MAKE_DIRECTORY - \"\$ENV{DESTDIR}\${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/log\" - \"\$ENV{DESTDIR}\${CMAKE_INSTALL_FULL_RUNSTATEDIR}\" - ) -") +# Create var/log, and [var/]run directories on installation. +install( + CODE + [[ + file( + INSTALL + DESTINATION "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/log" + TYPE DIRECTORY + FILES "" + ) + file( + INSTALL + DESTINATION "${CMAKE_INSTALL_FULL_RUNSTATEDIR}" + TYPE DIRECTORY + FILES "" + ) + ]] +) configure_file(cmake/config.h.in config.h) diff --git a/cmake/scripts/CMakeLists.txt b/cmake/scripts/CMakeLists.txt index a011a0d2..efe058e6 100644 --- a/cmake/scripts/CMakeLists.txt +++ b/cmake/scripts/CMakeLists.txt @@ -1,5 +1,3 @@ -include(PHP/ConfigureFile) - # Man documentation. block() set(program_prefix "${PHP_PROGRAM_PREFIX}") @@ -38,7 +36,9 @@ block() set(SED /usr/bin/sed) endif() - message(STATUS "Creating scripts/php-config") + ############################################################################## + # Install php-config script. + ############################################################################## get_property(sapis GLOBAL PROPERTY PHP_SAPIS) if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.27) @@ -57,43 +57,52 @@ block() content "${content}" ) - - php_configure_file( - CONTENT "${content}" - OUTPUT php-config - VARIABLES - SED "${SED}" - prefix "$" - datarootdir "$>" - exec_prefix "$" - PHP_VERSION "${PHP_VERSION}" - PHP_VERSION_ID "${PHP_VERSION_ID}" - includedir "$>" + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PHP/php-config.in" "${content}") + + string(CONFIGURE [[ + block() + set(SED "@SED@") + set(prefix "${CMAKE_INSTALL_PREFIX}") + set(datarootdir "${CMAKE_INSTALL_FULL_DATAROOTDIR}") + set(exec_prefix "${CMAKE_INSTALL_PREFIX}") + set(PHP_VERSION "@PHP_VERSION@") + set(PHP_VERSION_ID "@PHP_VERSION_ID@") + set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}/@PHP_INCLUDE_PREFIX@") # TODO: - PHP_LDFLAGS "" + set(PHP_LDFLAGS "") # TODO: - EXTRA_LIBS "" - EXTENSION_DIR "$>" - mandir "$>" - program_prefix "${PHP_PROGRAM_PREFIX}" - program_suffix "${PHP_PROGRAM_SUFFIX}" - EXEEXT "${CMAKE_EXECUTABLE_SUFFIX}" - # TODO: - CONFIGURE_OPTIONS "" - PHP_INSTALLED_SAPIS "${sapis}" - EXPANDED_PHP_CONFIG_FILE_SCAN_DIR "$>" - EXPANDED_PHP_CONFIG_FILE_PATH "$>" - bindir "$>" - ) - - install( - PROGRAMS - ${CMAKE_CURRENT_BINARY_DIR}/php-config - DESTINATION ${CMAKE_INSTALL_BINDIR} - RENAME ${PHP_PROGRAM_PREFIX}php-config${PHP_PROGRAM_SUFFIX} - ) - - message(STATUS "Creating scripts/phpize") + set(EXTRA_LIBS "") + set(EXTENSION_DIR "$") + set(mandir "${CMAKE_INSTALL_FULL_MANDIR}") + set(program_prefix "@PHP_PROGRAM_PREFIX@") + set(program_suffix "@PHP_PROGRAM_SUFFIX@") + set(EXEEXT "@CMAKE_EXECUTABLE_SUFFIX@") + set(CONFIGURE_OPTIONS "") + set(PHP_INSTALLED_SAPIS "@sapis@") + set(EXPANDED_PHP_CONFIG_FILE_SCAN_DIR "$") + set(EXPANDED_PHP_CONFIG_FILE_PATH "$") + set(bindir "${CMAKE_INSTALL_FULL_BINDIR}") + + configure_file( + "@CMAKE_CURRENT_BINARY_DIR@/CMakeFiles/PHP/php-config.in" + "@CMAKE_CURRENT_BINARY_DIR@/php-config" + @ONLY + ) + + file( + INSTALL + DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" + TYPE PROGRAM + RENAME "@PHP_PROGRAM_PREFIX@php-config@PHP_PROGRAM_SUFFIX@" + FILES "@CMAKE_CURRENT_BINARY_DIR@/php-config" + ) + endblock() + ]] code @ONLY) + install(CODE "${code}") + + ############################################################################## + # Install phpize script. + ############################################################################## # Replace the upstream phpize script hardcoded php include directory to a # template placeholder. @@ -105,25 +114,33 @@ block() content "${content}" ) - - php_configure_file( - CONTENT "${content}" - OUTPUT phpize - VARIABLES - prefix "$" - datarootdir "$>" - exec_prefix "$" - libdir "$>" - includedir "$>" - SED "${SED}" - ) - - install( - PROGRAMS - ${CMAKE_CURRENT_BINARY_DIR}/phpize - DESTINATION ${CMAKE_INSTALL_BINDIR} - RENAME ${PHP_PROGRAM_PREFIX}phpize${PHP_PROGRAM_SUFFIX} - ) + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PHP/phpize.in" "${content}") + + string(CONFIGURE [[ + block() + set(prefix "${CMAKE_INSTALL_PREFIX}") + set(datarootdir "${CMAKE_INSTALL_FULL_DATAROOTDIR}") + set(exec_prefix "${CMAKE_INSTALL_PREFIX}") + set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}/php") + set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}/@PHP_INCLUDE_PREFIX@") + set(SED "@SED@") + + configure_file( + "@CMAKE_CURRENT_BINARY_DIR@/CMakeFiles/PHP/phpize.in" + "@CMAKE_CURRENT_BINARY_DIR@/phpize" + @ONLY + ) + + file( + INSTALL + DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" + TYPE PROGRAM + RENAME "@PHP_PROGRAM_PREFIX@phpize@PHP_PROGRAM_SUFFIX@" + FILES "@CMAKE_CURRENT_BINARY_DIR@/phpize" + ) + endblock() + ]] code @ONLY) + install(CODE "${code}") endblock() # Configure pkg-config php.pc metadata file. @@ -149,7 +166,7 @@ pkgconfig_generate_pc( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/php.pc - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig + DESTINATION ${PHP_INSTALL_LIBDIR}/pkgconfig ) # Install Autotools build files. @@ -167,7 +184,7 @@ if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") ${PHP_SOURCE_DIR}/build/pkg.m4 ${PHP_SOURCE_DIR}/run-tests.php ${PHP_SOURCE_DIR}/scripts/phpize.m4 - DESTINATION ${CMAKE_INSTALL_LIBDIR}/php/build + DESTINATION ${PHP_INSTALL_LIBDIR}/php/build ) install( @@ -175,6 +192,6 @@ if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") ${PHP_SOURCE_DIR}/build/config.guess ${PHP_SOURCE_DIR}/build/config.sub ${PHP_SOURCE_DIR}/build/shtool - DESTINATION ${CMAKE_INSTALL_LIBDIR}/php/build + DESTINATION ${PHP_INSTALL_LIBDIR}/php/build ) endif()