@@ -66,7 +66,106 @@ function(add_header target_name)
6666 )
6767endfunction (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