| 
 | 1 | +#[=============================================================================[  | 
 | 2 | +Generate *_arginfo.h headers from the *.stub.php sources  | 
 | 3 | +
  | 
 | 4 | +The build/gen_stub.php script requires the PHP tokenizer extension.  | 
 | 5 | +#]=============================================================================]  | 
 | 6 | + | 
 | 7 | +include_guard(GLOBAL)  | 
 | 8 | + | 
 | 9 | +# Store a list of all binary targets inside the given <dir> to the <result>  | 
 | 10 | +# variable.  | 
 | 11 | +function(_php_stubs_get_binary_targets result dir)  | 
 | 12 | +  get_property(targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS)  | 
 | 13 | +  get_property(subdirs DIRECTORY ${dir} PROPERTY SUBDIRECTORIES)  | 
 | 14 | + | 
 | 15 | +  # Filter only binary targets.  | 
 | 16 | +  set(binaryTargets)  | 
 | 17 | +  foreach(target ${targets})  | 
 | 18 | +    get_target_property(type ${target} TYPE)  | 
 | 19 | +    if(type MATCHES "^((STATIC|MODULE|SHARED|OBJECT)_LIBRARY|EXECUTABLE)$")  | 
 | 20 | +      list(APPEND binaryTargets ${target})  | 
 | 21 | +    endif()  | 
 | 22 | +  endforeach()  | 
 | 23 | +  set(targets ${binaryTargets})  | 
 | 24 | + | 
 | 25 | +  foreach(subdir ${subdirs})  | 
 | 26 | +    cmake_language(CALL ${CMAKE_CURRENT_FUNCTION} subdirTargets ${subdir})  | 
 | 27 | +    list(APPEND targets ${subdirTargets})  | 
 | 28 | +  endforeach()  | 
 | 29 | + | 
 | 30 | +  set(${result} ${targets} PARENT_SCOPE)  | 
 | 31 | +endfunction()  | 
 | 32 | + | 
 | 33 | +# If PHP is not found on the system, the PHP cli SAPI will be used with the  | 
 | 34 | +# tokenizer extension.  | 
 | 35 | +if(NOT PHPSystem_EXECUTABLE AND NOT EXT_TOKENIZER AND NOT SAPI_CLI)  | 
 | 36 | +  return()  | 
 | 37 | +endif()  | 
 | 38 | + | 
 | 39 | +if(EXISTS ${PROJECT_SOURCE_DIR}/build/gen_stub.php)  | 
 | 40 | +  file(  | 
 | 41 | +    COPY  | 
 | 42 | +    ${PROJECT_SOURCE_DIR}/build/gen_stub.php  | 
 | 43 | +    DESTINATION ${PROJECT_BINARY_DIR}/build  | 
 | 44 | +  )  | 
 | 45 | +else()  | 
 | 46 | +  return()  | 
 | 47 | +endif()  | 
 | 48 | + | 
 | 49 | +block()  | 
 | 50 | +  _php_stubs_get_binary_targets(targets ${PROJECT_SOURCE_DIR})  | 
 | 51 | + | 
 | 52 | +  set(stubs)  | 
 | 53 | +  foreach(target ${targets})  | 
 | 54 | +    list(  | 
 | 55 | +      APPEND  | 
 | 56 | +      stubs  | 
 | 57 | +      $<PATH:ABSOLUTE_PATH,NORMALIZE,$<LIST:FILTER,$<TARGET_PROPERTY:${target},SOURCES>,INCLUDE,\.stub\.php$>,$<TARGET_PROPERTY:${target},SOURCE_DIR>>  | 
 | 58 | +    )  | 
 | 59 | + | 
 | 60 | +    if(PHPSystem_EXECUTABLE)  | 
 | 61 | +      add_dependencies(${target} php_stubs)  | 
 | 62 | +    endif()  | 
 | 63 | +  endforeach()  | 
 | 64 | + | 
 | 65 | +  file(  | 
 | 66 | +    GENERATE  | 
 | 67 | +    OUTPUT ${PROJECT_BINARY_DIR}/CMakeFiles/php_stubs.txt  | 
 | 68 | +    CONTENT "$<JOIN:$<REMOVE_DUPLICATES:${stubs}>,$<SEMICOLON>>"  | 
 | 69 | +  )  | 
 | 70 | + | 
 | 71 | +  set(PHP_COMMAND)  | 
 | 72 | + | 
 | 73 | +  if(PHPSystem_EXECUTABLE)  | 
 | 74 | +    set(PHP_COMMAND ${PHPSystem_EXECUTABLE})  | 
 | 75 | +  else()  | 
 | 76 | +    if(NOT CMAKE_CROSSCOMPILING)  | 
 | 77 | +      set(PHP_COMMAND $<TARGET_FILE:php_cli>)  | 
 | 78 | +    elseif(CMAKE_CROSSCOMPILING AND CMAKE_CROSSCOMPILING_EMULATOR)  | 
 | 79 | +      set(PHP_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:php_cli>)  | 
 | 80 | +    endif()  | 
 | 81 | +  endif()  | 
 | 82 | + | 
 | 83 | +  if(EXT_TOKENIZER_SHARED AND NOT PHPSystem_EXECUTABLE)  | 
 | 84 | +    list(  | 
 | 85 | +      APPEND  | 
 | 86 | +      PHP_COMMAND  | 
 | 87 | +      -d extension_dir=${PROJECT_BINARY_DIR}/modules  | 
 | 88 | +      -d extension=tokenizer  | 
 | 89 | +    )  | 
 | 90 | +  endif()  | 
 | 91 | + | 
 | 92 | +  if(NOT PHPSystem_EXECUTABLE)  | 
 | 93 | +    set(targetOptions ALL DEPENDS ${targets})  | 
 | 94 | +  endif()  | 
 | 95 | + | 
 | 96 | +  add_custom_target(  | 
 | 97 | +    php_stubs ${targetOptions}  | 
 | 98 | +    COMMAND  | 
 | 99 | +      ${CMAKE_COMMAND}  | 
 | 100 | +      "-DPHP_STUBS=${PROJECT_BINARY_DIR}/CMakeFiles/php_stubs.txt"  | 
 | 101 | +      "-DPHP_COMMAND=${PHP_COMMAND};${PROJECT_BINARY_DIR}/build/gen_stub.php"  | 
 | 102 | +      -P ${CMAKE_CURRENT_LIST_DIR}/Stubs/RunCommand.cmake  | 
 | 103 | +    VERBATIM  | 
 | 104 | +  )  | 
 | 105 | +endblock()  | 
0 commit comments