Skip to content

Commit 5fdf0b6

Browse files
committed
Merge pull request #2311 from rintaro/glibc-modulemap-gyb
2 parents 627e232 + 458e689 commit 5fdf0b6

File tree

3 files changed

+165
-134
lines changed

3 files changed

+165
-134
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-

stdlib/public/Platform/CMakeLists.txt

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -55,42 +55,25 @@ foreach(sdk ${SWIFT_SDKS})
5555
endif()
5656
endif()
5757

58+
set(glibc_modulemap_source "glibc.modulemap.gyb")
59+
set(glibc_modulemap_out "${module_dir}/glibc.modulemap")
60+
5861
# Configure the module map based on the target. Each platform needs to
5962
# reference different headers, based on what's available in their glibc.
60-
set(glibc_modulemap_gyb_source "glibc.modulemap.in.gyb")
61-
set(glibc_modulemap_gyb_configured
62-
"${CMAKE_CURRENT_BINARY_DIR}/${arch_subdir}/glibc.modulemap.gyb")
63-
configure_file(
64-
${glibc_modulemap_gyb_source}
65-
${glibc_modulemap_gyb_configured}
66-
@ONLY)
67-
68-
set(gyb_tool "${SWIFT_SOURCE_DIR}/utils/gyb")
69-
set(glibc_modulemap_configured
70-
"${CMAKE_CURRENT_BINARY_DIR}/${arch_subdir}/glibc.modulemap")
71-
add_custom_command_target(glibc_modulemap_target
72-
# We can't use handle_gyb_sources() here because we need to ensure
73-
# gyb is invoked before we copy glibc.modulemap into the module dir.
74-
# FIXME: Instead of using a combination of configure_file() and gyb,
75-
# we should use just gyb--it'd be simpler.
76-
COMMAND
77-
${gyb_tool} "-DCMAKE_SDK=${sdk}" -o ${glibc_modulemap_configured} ${glibc_modulemap_gyb_configured}
78-
COMMAND
79-
${CMAKE_COMMAND} -E make_directory ${module_dir}
80-
COMMAND
81-
${CMAKE_COMMAND} -E copy_if_different
82-
${glibc_modulemap_configured}
83-
"${module_dir}/glibc.modulemap"
84-
OUTPUT "${module_dir}/glibc.modulemap"
85-
DEPENDS ${glibc_modulemap_configured}
86-
COMMENT "Copying Glibc module to ${module_dir}")
63+
handle_gyb_source_single(glibc_modulemap_target
64+
SOURCE "${glibc_modulemap_source}"
65+
OUTPUT "${glibc_modulemap_out}"
66+
FLAGS
67+
"-DCMAKE_SDK=${sdk}"
68+
"-DGLIBC_INCLUDE_PATH=${GLIBC_INCLUDE_PATH}"
69+
"-DGLIBC_ARCH_INCLUDE_PATH=${GLIBC_ARCH_INCLUDE_PATH}")
8770

88-
swift_install_in_component(stdlib
89-
FILES "${module_dir}/glibc.modulemap"
71+
swift_install_in_component(sdk-overlay
72+
FILES "${glibc_modulemap_out}"
9073
DESTINATION "lib/swift/${arch_subdir}")
9174

9275
list(APPEND glibc_modulemap_target_list ${glibc_modulemap_target})
9376
endforeach()
9477
endif()
9578
endforeach()
96-
add_custom_target(glibc_modulemap ALL DEPENDS ${glibc_modulemap_target_list})
79+
add_custom_target(glibc_modulemap DEPENDS ${glibc_modulemap_target_list})

0 commit comments

Comments
 (0)