1# A rule for self contained header file targets. 2# This rule merely copies the header file from the current source directory to 3# the current binary directory. 4# Usage: 5# add_header( 6# <target name> 7# HDR <header file> 8# ) 9function(add_header target_name) 10 cmake_parse_arguments( 11 "ADD_HEADER" 12 "" # No optional arguments 13 "HDR;DEST_HDR" # Single value arguments 14 "DEPENDS" 15 ${ARGN} 16 ) 17 if(NOT ADD_HEADER_HDR) 18 message(FATAL_ERROR "'add_header' rules requires the HDR argument specifying a headef file.") 19 endif() 20 21 if(ADD_HEADER_DEST_HDR) 22 set(dest_leaf_filename ${ADD_HEADER_DEST_HDR}) 23 else() 24 set(dest_leaf_filename ${ADD_HEADER_HDR}) 25 endif() 26 set(absolute_path ${CMAKE_CURRENT_SOURCE_DIR}/${dest_leaf_filename}) 27 file(RELATIVE_PATH relative_path ${LIBC_INCLUDE_SOURCE_DIR} ${absolute_path}) 28 set(dest_file ${LIBC_INCLUDE_DIR}/${relative_path}) 29 set(src_file ${CMAKE_CURRENT_SOURCE_DIR}/${ADD_HEADER_HDR}) 30 31 add_custom_command( 32 OUTPUT ${dest_file} 33 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src_file} ${dest_file} 34 DEPENDS ${src_file} 35 ) 36 37 get_fq_target_name(${target_name} fq_target_name) 38 set(copied_hdr_target ${fq_target_name}.__copied_hdr__) 39 add_custom_target( 40 ${copied_hdr_target} 41 DEPENDS ${dest_file} 42 ) 43 44 if(ADD_HEADER_DEPENDS) 45 get_fq_deps_list(fq_deps_list ${ADD_HEADER_DEPENDS}) 46 # Dependencies of a add_header target can only be another add_header target 47 # or an add_gen_header target. 48 foreach(dep IN LISTS fq_deps_list) 49 get_target_property(header_file ${dep} HEADER_FILE_PATH) 50 if(NOT header_file) 51 message(FATAL_ERROR "Invalid dependency '${dep}' for '${fq_target_name}'.") 52 endif() 53 endforeach() 54 add_dependencies( 55 ${copied_hdr_target} ${fq_deps_list} 56 ) 57 endif() 58 59 add_header_library( 60 ${target_name} 61 HDRS 62 ${dest_file} 63 DEPENDS 64 ${copied_hdr_target} 65 ) 66 set_target_properties( 67 ${fq_target_name} 68 PROPERTIES 69 HEADER_FILE_PATH ${dest_file} 70 DEPS "${fq_deps_list}" 71 ) 72endfunction(add_header) 73 74function(add_gen_header target_name) 75 cmake_parse_arguments( 76 "ADD_GEN_HDR" 77 "PUBLIC" # No optional arguments 78 "YAML_FILE;DEF_FILE;GEN_HDR" # Single value arguments 79 "DEPENDS" # Multi value arguments 80 ${ARGN} 81 ) 82 get_fq_target_name(${target_name} fq_target_name) 83 if(NOT LLVM_LIBC_FULL_BUILD) 84 add_library(${fq_target_name} INTERFACE) 85 return() 86 endif() 87 if(NOT ADD_GEN_HDR_DEF_FILE) 88 message(FATAL_ERROR "`add_gen_hdr` rule requires DEF_FILE to be specified.") 89 endif() 90 if(NOT ADD_GEN_HDR_GEN_HDR) 91 message(FATAL_ERROR "`add_gen_hdr` rule requires GEN_HDR to be specified.") 92 endif() 93 if(NOT ADD_GEN_HDR_YAML_FILE) 94 message(FATAL_ERROR "`add_gen_hdr` rule requires YAML_FILE to be specified.") 95 endif() 96 97 set(absolute_path ${CMAKE_CURRENT_SOURCE_DIR}/${ADD_GEN_HDR_GEN_HDR}) 98 file(RELATIVE_PATH relative_path ${LIBC_INCLUDE_SOURCE_DIR} ${absolute_path}) 99 set(out_file ${LIBC_INCLUDE_DIR}/${relative_path}) 100 set(yaml_file ${CMAKE_SOURCE_DIR}/${ADD_GEN_HDR_YAML_FILE}) 101 set(def_file ${CMAKE_CURRENT_SOURCE_DIR}/${ADD_GEN_HDR_DEF_FILE}) 102 103 set(fq_data_files "") 104 if(ADD_GEN_HDR_DATA_FILES) 105 foreach(data_file IN LISTS ADD_GEN_HDR_DATA_FILES) 106 list(APPEND fq_data_files "${CMAKE_CURRENT_SOURCE_DIR}/${data_file}") 107 endforeach(data_file) 108 endif() 109 110 set(entry_points "${TARGET_ENTRYPOINT_NAME_LIST}") 111 list(TRANSFORM entry_points PREPEND "--e=") 112 113 add_custom_command( 114 OUTPUT ${out_file} 115 COMMAND ${Python3_EXECUTABLE} ${LIBC_SOURCE_DIR}/newhdrgen/yaml_to_classes.py 116 ${yaml_file} 117 --h_def_file ${def_file} 118 ${entry_points} 119 --output_dir ${out_file} 120 DEPENDS ${yaml_file} ${def_file} ${fq_data_files} 121 COMMENT "Generating header ${ADD_GEN_HDR_GEN_HDR} from ${yaml_file} and ${def_file}" 122 ) 123 if(LIBC_TARGET_OS_IS_GPU) 124 file(MAKE_DIRECTORY ${LIBC_INCLUDE_DIR}/llvm-libc-decls) 125 file(MAKE_DIRECTORY ${LIBC_INCLUDE_DIR}/llvm-libc-decls/gpu) 126 set(decl_out_file ${LIBC_INCLUDE_DIR}/llvm-libc-decls/${relative_path}) 127 add_custom_command( 128 OUTPUT ${decl_out_file} 129 COMMAND ${Python3_EXECUTABLE} ${LIBC_SOURCE_DIR}/newhdrgen/yaml_to_classes.py 130 ${yaml_file} 131 --export-decls 132 ${entry_points} 133 --output_dir ${decl_out_file} 134 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 135 DEPENDS ${yaml_file} ${fq_data_files} 136 ) 137 endif() 138 139 if(ADD_GEN_HDR_DEPENDS) 140 get_fq_deps_list(fq_deps_list ${ADD_GEN_HDR_DEPENDS}) 141 # Dependencies of a add_header target can only be another add_gen_header target 142 # or an add_header target. 143 foreach(dep IN LISTS fq_deps_list) 144 get_target_property(header_file ${dep} HEADER_FILE_PATH) 145 if(NOT header_file) 146 message(FATAL_ERROR "Invalid dependency '${dep}' for '${fq_target_name}'.") 147 endif() 148 endforeach() 149 endif() 150 set(generated_hdr_target ${fq_target_name}.__generated_hdr__) 151 add_custom_target( 152 ${generated_hdr_target} 153 DEPENDS ${out_file} ${fq_deps_list} ${decl_out_file} 154 ) 155 156 add_header_library( 157 ${target_name} 158 HDRS 159 ${out_file} 160 ) 161 162 add_dependencies(${fq_target_name} ${generated_hdr_target}) 163 164 set_target_properties( 165 ${fq_target_name} 166 PROPERTIES 167 HEADER_FILE_PATH ${out_file} 168 DECLS_FILE_PATH "${decl_out_file}" 169 DEPS "${fq_deps_list}" 170 ) 171 172 173endfunction(add_gen_header) 174