Skip to content

Commit 83fbd79

Browse files
[libc] newheadergen: configured cmake (llvm#98828)
- all headers in the build system are generated by newheadergen - tested on gpu-build --------- Co-authored-by: Rose Zhang <[email protected]>
1 parent 884772f commit 83fbd79

File tree

5 files changed

+332
-160
lines changed

5 files changed

+332
-160
lines changed

libc/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ option(LIBC_BUILD_GPU_LOADER "Always build the GPU loader utilities" OFF)
7272
if(LIBC_BUILD_GPU_LOADER OR (LLVM_LIBC_GPU_BUILD AND NOT LLVM_RUNTIMES_BUILD))
7373
add_subdirectory(utils/gpu)
7474
endif()
75+
option(LIBC_USE_NEW_HEADER_GEN "Generate header files using new headergen instead of the old one" OFF)
7576

7677
set(NEED_LIBC_HDRGEN FALSE)
7778
if(NOT LLVM_RUNTIMES_BUILD)

libc/cmake/modules/LLVMLibCHeaderRules.cmake

+100-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,106 @@ function(add_header target_name)
6666
)
6767
endfunction(add_header)
6868

69-
# A rule for generated header file targets.
69+
function(add_gen_header2 target_name)
70+
cmake_parse_arguments(
71+
"ADD_GEN_HDR2"
72+
"PUBLIC" # No optional arguments
73+
"YAML_FILE;DEF_FILE;GEN_HDR" # Single value arguments
74+
"DEPENDS" # Multi value arguments
75+
${ARGN}
76+
)
77+
get_fq_target_name(${target_name} fq_target_name)
78+
if(NOT LLVM_LIBC_FULL_BUILD)
79+
add_library(${fq_target_name} INTERFACE)
80+
return()
81+
endif()
82+
if(NOT ADD_GEN_HDR2_DEF_FILE)
83+
message(FATAL_ERROR "`add_gen_hdr2` rule requires DEF_FILE to be specified.")
84+
endif()
85+
if(NOT ADD_GEN_HDR2_GEN_HDR)
86+
message(FATAL_ERROR "`add_gen_hdr2` rule requires GEN_HDR to be specified.")
87+
endif()
88+
if(NOT ADD_GEN_HDR2_YAML_FILE)
89+
message(FATAL_ERROR "`add_gen_hdr2` rule requires YAML_FILE to be specified.")
90+
endif()
91+
92+
set(absolute_path ${CMAKE_CURRENT_SOURCE_DIR}/${ADD_GEN_HDR2_GEN_HDR})
93+
file(RELATIVE_PATH relative_path ${LIBC_INCLUDE_SOURCE_DIR} ${absolute_path})
94+
set(out_file ${LIBC_INCLUDE_DIR}/${relative_path})
95+
set(yaml_file ${CMAKE_SOURCE_DIR}/${ADD_GEN_HDR2_YAML_FILE})
96+
set(def_file ${CMAKE_CURRENT_SOURCE_DIR}/${ADD_GEN_HDR2_DEF_FILE})
97+
98+
set(fq_data_files "")
99+
if(ADD_GEN_HDR2_DATA_FILES)
100+
foreach(data_file IN LISTS ADD_GEN_HDR2_DATA_FILES)
101+
list(APPEND fq_data_files "${CMAKE_CURRENT_SOURCE_DIR}/${data_file}")
102+
endforeach(data_file)
103+
endif()
104+
105+
set(entry_points "${TARGET_ENTRYPOINT_NAME_LIST}")
106+
list(TRANSFORM entry_points PREPEND "--e=")
107+
108+
add_custom_command(
109+
OUTPUT ${out_file}
110+
COMMAND ${Python3_EXECUTABLE} ${LIBC_SOURCE_DIR}/newhdrgen/yaml_to_classes.py
111+
${yaml_file}
112+
--h_def_file ${def_file}
113+
${entry_points}
114+
--output_dir ${out_file}
115+
DEPENDS ${yaml_file} ${def_file} ${fq_data_files}
116+
COMMENT "Generating header ${ADD_GEN_HDR2_GE2N_HDR} from ${yaml_file} and ${def_file}"
117+
)
118+
if(LIBC_TARGET_OS_IS_GPU)
119+
file(MAKE_DIRECTORY ${LIBC_INCLUDE_DIR}/llvm-libc-decls)
120+
file(MAKE_DIRECTORY ${LIBC_INCLUDE_DIR}/llvm-libc-decls/gpu)
121+
set(decl_out_file ${LIBC_INCLUDE_DIR}/llvm-libc-decls/${relative_path})
122+
add_custom_command(
123+
OUTPUT ${decl_out_file}
124+
COMMAND ${Python3_EXECUTABLE} ${LIBC_SOURCE_DIR}/newhdrgen/yaml_to_classes.py
125+
${yaml_file}
126+
--export-decls
127+
${entry_points}
128+
--output_dir ${decl_out_file}
129+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
130+
DEPENDS ${yaml_file} ${fq_data_files}
131+
)
132+
endif()
133+
134+
if(ADD_GEN_HDR2_DEPENDS)
135+
get_fq_deps_list(fq_deps_list ${ADD_GEN_HDR2_DEPENDS})
136+
# Dependencies of a add_header target can only be another add_gen_header target
137+
# or an add_header target.
138+
foreach(dep IN LISTS fq_deps_list)
139+
get_target_property(header_file ${dep} HEADER_FILE_PATH)
140+
if(NOT header_file)
141+
message(FATAL_ERROR "Invalid dependency '${dep}' for '${fq_target_name}'.")
142+
endif()
143+
endforeach()
144+
endif()
145+
set(generated_hdr_target ${fq_target_name}.__generated_hdr__)
146+
add_custom_target(
147+
${generated_hdr_target}
148+
DEPENDS ${out_file} ${fq_deps_list} ${decl_out_file}
149+
)
150+
151+
add_header_library(
152+
${target_name}
153+
HDRS
154+
${out_file}
155+
)
156+
157+
add_dependencies(${fq_target_name} ${generated_hdr_target})
158+
159+
set_target_properties(
160+
${fq_target_name}
161+
PROPERTIES
162+
HEADER_FILE_PATH ${out_file}
163+
DEPS "${fq_deps_list}"
164+
)
165+
166+
167+
endfunction(add_gen_header2)
168+
70169
# Usage:
71170
# add_gen_header(
72171
# <target name>

0 commit comments

Comments
 (0)