| include(SwiftAddCustomCommandTarget) |
| include(SwiftSetIfArchBitness) |
| |
| # Create a target to process single gyb source with the 'gyb' tool. |
| # |
| # handle_gyb_source_single( |
| # dependency_out_var_name |
| # SOURCE src_gyb |
| # OUTPUT output |
| # [FLAGS [flags ...]]) |
| # [DEPENDS [depends ...]] |
| # [COMMENT comment]) |
| # |
| # dependency_out_var_name |
| # The name of a variable, to be set in the parent scope to be the target |
| # target that invoke gyb. |
| # |
| # src_gyb |
| # .gyb suffixed source file |
| # |
| # output |
| # Output filename to be generated |
| # |
| # flags ... |
| # gyb flags in addition to ${SWIFT_GYB_FLAGS}. |
| # |
| # depends ... |
| # gyb flags in addition to 'src_gyb' and sources of gyb itself. |
| # |
| # comment |
| # Additional comment. |
| function(handle_gyb_source_single dependency_out_var_name) |
| set(options) |
| set(single_value_args SOURCE OUTPUT COMMENT) |
| set(multi_value_args FLAGS DEPENDS) |
| cmake_parse_arguments( |
| GYB_SINGLE # prefix |
| "${options}" "${single_value_args}" "${multi_value_args}" ${ARGN}) |
| |
| set(gyb_flags |
| ${SWIFT_GYB_FLAGS} |
| ${GYB_SINGLE_FLAGS}) |
| |
| set(gyb_tool "${SWIFT_SOURCE_DIR}/utils/gyb") |
| set(gyb_tool_source "${gyb_tool}" "${gyb_tool}.py") |
| |
| get_filename_component(dir "${GYB_SINGLE_OUTPUT}" DIRECTORY) |
| get_filename_component(basename "${GYB_SINGLE_OUTPUT}" NAME) |
| |
| # Handle foo.gyb in pattern ``gyb.expand('foo.gyb'`` as a dependency |
| set(gyb_expand_deps "") |
| file(READ "${GYB_SINGLE_SOURCE}" gyb_file) |
| string(REGEX MATCHALL "\\\$\{[\r\n\t ]*gyb.expand\\\([\r\n\t ]*[\'\"]([^\'\"]*)[\'\"]" gyb_expand_matches "${gyb_file}") |
| foreach(match ${gyb_expand_matches}) |
| string(REGEX MATCH "[\'\"]\([^\'\"]*\)[\'\"]" gyb_dep "${match}") |
| list(APPEND gyb_expand_deps "${CMAKE_MATCH_1}") |
| endforeach() |
| list(REMOVE_DUPLICATES gyb_expand_deps) |
| |
| add_custom_command_target( |
| dependency_target |
| COMMAND |
| "${CMAKE_COMMAND}" -E make_directory "${dir}" |
| COMMAND |
| "${PYTHON_EXECUTABLE}" "${gyb_tool}" "${gyb_flags}" |
| -o "${GYB_SINGLE_OUTPUT}.tmp" "${GYB_SINGLE_SOURCE}" |
| COMMAND |
| "${CMAKE_COMMAND}" -E copy_if_different |
| "${GYB_SINGLE_OUTPUT}.tmp" "${GYB_SINGLE_OUTPUT}" |
| COMMAND |
| "${CMAKE_COMMAND}" -E remove "${GYB_SINGLE_OUTPUT}.tmp" |
| OUTPUT "${GYB_SINGLE_OUTPUT}" |
| DEPENDS "${gyb_tool_source}" "${GYB_SINGLE_DEPENDS}" "${GYB_SINGLE_SOURCE}" "${gyb_expand_deps}" |
| COMMENT "Generating ${basename} from ${GYB_SINGLE_SOURCE} ${GYB_SINGLE_COMMENT}" |
| WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" |
| SOURCES "${GYB_SINGLE_SOURCE}" |
| IDEMPOTENT) |
| set("${dependency_out_var_name}" "${dependency_target}" PARENT_SCOPE) |
| endfunction() |
| |
| # Create a target to process .gyb files with the 'gyb' tool. |
| # |
| # handle_gyb_sources( |
| # dependency_out_var_name |
| # sources_var_name |
| # arch) |
| # |
| # Replace, in ${sources_var_name}, the given .gyb-suffixed sources with |
| # their un-suffixed intermediate files, which will be generated by processing |
| # the .gyb files with gyb. |
| # |
| # dependency_out_var_name |
| # The name of a variable, to be set in the parent scope to the list of |
| # targets that invoke gyb. Every target that depends on the generated |
| # sources should depend on ${dependency_out_var_name} targets. |
| # |
| # arch |
| # The architecture that the files will be compiled for. If this is |
| # false, the files are architecture-independent and will be emitted |
| # into ${CMAKE_CURRENT_BINARY_DIR} instead of an architecture-specific |
| # destination; this is useful for generated include files. |
| function(handle_gyb_sources dependency_out_var_name sources_var_name arch) |
| set(extra_gyb_flags "") |
| if (arch) |
| set_if_arch_bitness(ptr_size |
| ARCH "${arch}" |
| CASE_32_BIT "4" |
| CASE_64_BIT "8") |
| set(extra_gyb_flags "-DCMAKE_SIZEOF_VOID_P=${ptr_size}") |
| endif() |
| |
| set(dependency_targets) |
| set(de_gybbed_sources) |
| set(gyb_extra_sources |
| "${SWIFT_SOURCE_DIR}/utils/GYBUnicodeDataUtils.py" |
| "${SWIFT_SOURCE_DIR}/utils/SwiftIntTypes.py" |
| "${SWIFT_SOURCE_DIR}/utils/UnicodeData/GraphemeBreakProperty.txt" |
| "${SWIFT_SOURCE_DIR}/utils/UnicodeData/GraphemeBreakTest.txt" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_stdlib_support.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_stdlib_unittest_support.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/__init__.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/Child.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/kinds.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/Node.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/AttributeNodes.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/CommonNodes.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/DeclNodes.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/ExprNodes.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/GenericNodes.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/PatternNodes.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/StmtNodes.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/TypeNodes.py" |
| "${SWIFT_SOURCE_DIR}/utils/gyb_syntax_support/Token.py") |
| |
| foreach (src ${${sources_var_name}}) |
| string(REGEX REPLACE "[.]gyb$" "" src_sans_gyb "${src}") |
| if(src STREQUAL src_sans_gyb) |
| list(APPEND de_gybbed_sources "${src}") |
| else() |
| |
| # On Windows (using Visual Studio), the generated project files assume that the |
| # generated GYB files will be in the source, not binary directory. |
| # We can work around this by modifying the root directory when generating VS projects. |
| if ("${CMAKE_GENERATOR_PLATFORM}" MATCHES "Visual Studio") |
| set(dir_root ${CMAKE_CURRENT_SOURCE_DIR}) |
| else() |
| set(dir_root ${CMAKE_CURRENT_BINARY_DIR}) |
| endif() |
| |
| if (arch) |
| set(dir "${dir_root}/${ptr_size}") |
| else() |
| set(dir "${dir_root}") |
| endif() |
| set(output_file_name "${dir}/${src_sans_gyb}") |
| list(APPEND de_gybbed_sources "${output_file_name}") |
| handle_gyb_source_single(dependency_target |
| SOURCE "${src}" |
| OUTPUT "${output_file_name}" |
| FLAGS ${extra_gyb_flags} |
| DEPENDS "${gyb_extra_sources}" |
| COMMENT "with ptr size = ${ptr_size}") |
| list(APPEND dependency_targets "${dependency_target}") |
| endif() |
| endforeach() |
| set("${dependency_out_var_name}" "${dependency_targets}" PARENT_SCOPE) |
| set("${sources_var_name}" "${de_gybbed_sources}" PARENT_SCOPE) |
| endfunction() |
| |
| function(add_gyb_target target sources) |
| set(options) |
| set(single_value_args ARCH) |
| set(multi_value_args) |
| cmake_parse_arguments(GYB |
| "${options}" "${single_value_args}" "${multi_value_args}" ${ARGN}) |
| |
| handle_gyb_sources(gyb_sources_depends sources "${GYB_ARCH}") |
| |
| add_custom_target(${target} |
| DEPENDS "${gyb_sources_depends}") |
| endfunction() |