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()