Skip to content

Commit 65bd53c

Browse files
committed
[CMakeLists] Factored out cmake function that does single gyb processing
So that we can generate arbitrary output file.
1 parent ca5d7bd commit 65bd53c

File tree

1 file changed

+73
-25
lines changed

1 file changed

+73
-25
lines changed

cmake/modules/SwiftHandleGybSources.cmake

Lines changed: 73 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,74 @@
11
include(SwiftAddCustomCommandTarget)
22
include(SwiftSetIfArchBitness)
33

4+
# Create a target to process single gyb source with the 'gyb' tool.
5+
#
6+
# handle_gyb_source_single(
7+
# dependency_out_var_name
8+
# SOURCE src_gyb
9+
# OUTPUT output
10+
# [FLAGS [flags ...]])
11+
# [DEPENDS [depends ...]]
12+
# [COMMENT comment])
13+
#
14+
# dependency_out_var_name
15+
# The name of a variable, to be set in the parent scope to be the target
16+
# target that invoke gyb.
17+
#
18+
# src_gyb
19+
# .gyb suffixed source file
20+
#
21+
# output
22+
# Output filename to be generated
23+
#
24+
# flags ...
25+
# gyb flags in addition to ${SWIFT_GYB_FLAGS}.
26+
#
27+
# depends ...
28+
# gyb flags in addition to 'src_gyb' and sources of gyb itself.
29+
#
30+
# comment
31+
# Additional comment.
32+
function(handle_gyb_source_single dependency_out_var_name)
33+
set(options)
34+
set(single_value_args SOURCE OUTPUT COMMENT)
35+
set(multi_value_args FLAGS DEPENDS)
36+
cmake_parse_arguments(
37+
GYB_SINGLE # prefix
38+
"${options}" "${single_value_args}" "${multi_value_args}" ${ARGN})
39+
40+
set(gyb_flags
41+
"--test" # Run gyb's self-tests whenever we use it. They're cheap
42+
# enough and it keeps us honest.
43+
${SWIFT_GYB_FLAGS}
44+
${GYB_SINGLE_FLAGS})
45+
46+
set(gyb_tool "${SWIFT_SOURCE_DIR}/utils/gyb")
47+
set(gyb_tool_source "${gyb_tool}" "${gyb_tool}.py")
48+
49+
get_filename_component(dir "${GYB_SINGLE_OUTPUT}" DIRECTORY)
50+
get_filename_component(basename "${GYB_SINGLE_OUTPUT}" NAME)
51+
add_custom_command_target(
52+
dependency_target
53+
COMMAND
54+
"${CMAKE_COMMAND}" -E make_directory "${dir}"
55+
COMMAND
56+
"${gyb_tool}" "${gyb_flags}"
57+
-o "${GYB_SINGLE_OUTPUT}.tmp" "${GYB_SINGLE_SOURCE}"
58+
COMMAND
59+
"${CMAKE_COMMAND}" -E copy_if_different
60+
"${GYB_SINGLE_OUTPUT}.tmp" "${GYB_SINGLE_OUTPUT}"
61+
COMMAND
62+
"${CMAKE_COMMAND}" -E remove "${GYB_SINGLE_OUTPUT}.tmp"
63+
OUTPUT "${GYB_SINGLE_OUTPUT}"
64+
DEPENDS "${gyb_tool_source}" "${GYB_SINGLE_DEPENDS}" "${GYB_SINGLE_SOURCE}"
65+
COMMENT "Generating ${basename} from ${GYB_SINGLE_SOURCE} ${GYB_SINGLE_COMMENT}"
66+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
67+
SOURCES "${GYB_SINGLE_SOURCE}"
68+
IDEMPOTENT)
69+
set("${dependency_out_var_name}" "${dependency_target}" PARENT_SCOPE)
70+
endfunction()
71+
472
# Create a target to process .gyb files with the 'gyb' tool.
573
#
674
# handle_gyb_sources(
@@ -32,16 +100,8 @@ function(handle_gyb_sources dependency_out_var_name sources_var_name arch)
32100
set(extra_gyb_flags "-DCMAKE_SIZEOF_VOID_P=${ptr_size}")
33101
endif()
34102

35-
set(gyb_flags
36-
"--test" # Run gyb's self-tests whenever we use it. They're cheap
37-
# enough and it keeps us honest.
38-
${SWIFT_GYB_FLAGS}
39-
${extra_gyb_flags})
40-
41103
set(dependency_targets)
42104
set(de_gybbed_sources)
43-
set(gyb_tool "${SWIFT_SOURCE_DIR}/utils/gyb")
44-
set(gyb_tool_source "${gyb_tool}" "${gyb_tool}.py")
45105
set(gyb_extra_sources
46106
"${SWIFT_SOURCE_DIR}/utils/GYBUnicodeDataUtils.py"
47107
"${SWIFT_SOURCE_DIR}/utils/SwiftIntTypes.py"
@@ -59,27 +119,15 @@ function(handle_gyb_sources dependency_out_var_name sources_var_name arch)
59119
endif()
60120
set(output_file_name "${dir}/${src_sans_gyb}")
61121
list(APPEND de_gybbed_sources "${output_file_name}")
62-
string(MD5 output_file_name_hash "${output_file_name}")
63-
add_custom_command_target(
64-
dependency_target
65-
COMMAND
66-
"${CMAKE_COMMAND}" -E make_directory "${dir}"
67-
COMMAND
68-
"${gyb_tool}" "${gyb_flags}" -o "${output_file_name}.tmp" "${src}"
69-
COMMAND
70-
"${CMAKE_COMMAND}" -E copy_if_different "${output_file_name}.tmp" "${output_file_name}"
71-
COMMAND
72-
"${CMAKE_COMMAND}" -E remove "${output_file_name}.tmp"
122+
handle_gyb_source_single(dependency_target
123+
SOURCE "${src}"
73124
OUTPUT "${output_file_name}"
74-
DEPENDS "${gyb_tool_source}" "${src}" "${gyb_extra_sources}"
75-
COMMENT "Generating ${src_sans_gyb} from ${src} with ptr size = ${ptr_size}"
76-
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
77-
SOURCES "${src}"
78-
IDEMPOTENT)
125+
FLAGS ${extra_gyb_flags}
126+
DEPENDS "${gyb_extra_sources}"
127+
COMMENT "with ptr size = ${ptr_size}")
79128
list(APPEND dependency_targets "${dependency_target}")
80129
endif()
81130
endforeach()
82131
set("${dependency_out_var_name}" "${dependency_targets}" PARENT_SCOPE)
83132
set("${sources_var_name}" "${de_gybbed_sources}" PARENT_SCOPE)
84133
endfunction()
85-

0 commit comments

Comments
 (0)