@@ -66,7 +66,106 @@ function(add_header target_name)
66
66
)
67
67
endfunction (add_header)
68
68
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
+
70
169
# Usage:
71
170
# add_gen_header(
72
171
# <target name>
0 commit comments