159 lines · plain
1# A rule for self contained header file targets.2# This rule merely copies the header file from the current source directory to3# 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 arguments13 "HDR;DEST_HDR" # Single value arguments14 "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 target47 # 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 HDRS62 ${dest_file}63 DEPENDS64 ${copied_hdr_target}65 )66 set_target_properties(67 ${fq_target_name}68 PROPERTIES69 HEADER_NAME ${dest_leaf_filename}70 HEADER_FILE_PATH ${dest_file}71 DEPS "${fq_deps_list}"72 )73endfunction(add_header)74 75function(add_gen_header target_name)76 cmake_parse_arguments(77 "ADD_GEN_HDR"78 "PUBLIC" # No optional arguments79 "YAML_FILE;GEN_HDR" # Single value arguments80 "DEPENDS" # Multi value arguments81 ${ARGN}82 )83 get_fq_target_name(${target_name} fq_target_name)84 if(NOT LLVM_LIBC_FULL_BUILD)85 add_library(${fq_target_name} INTERFACE)86 return()87 endif()88 if(NOT ADD_GEN_HDR_GEN_HDR)89 message(FATAL_ERROR "`add_gen_hdr` rule requires GEN_HDR to be specified.")90 endif()91 if(NOT ADD_GEN_HDR_YAML_FILE)92 message(FATAL_ERROR "`add_gen_hdr` rule requires YAML_FILE to be specified.")93 endif()94 95 set(absolute_path ${CMAKE_CURRENT_SOURCE_DIR}/${ADD_GEN_HDR_GEN_HDR})96 file(RELATIVE_PATH relative_path ${LIBC_INCLUDE_SOURCE_DIR} ${absolute_path})97 set(out_file ${LIBC_INCLUDE_DIR}/${relative_path})98 set(dep_file "${out_file}.d")99 set(yaml_file ${CMAKE_SOURCE_DIR}/${ADD_GEN_HDR_YAML_FILE})100 101 if(LLVM_LIBC_ALL_HEADERS)102 set(entry_points "")103 else()104 set(entry_points "${TARGET_ENTRYPOINT_NAME_LIST}")105 endif()106 107 list(TRANSFORM entry_points PREPEND "--entry-point=")108 109 add_custom_command(110 OUTPUT ${out_file}111 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}112 COMMAND ${Python3_EXECUTABLE} "${LIBC_SOURCE_DIR}/utils/hdrgen/main.py"113 --output ${out_file}114 --depfile ${dep_file}115 --write-if-changed116 ${entry_points}117 ${yaml_file}118 DEPENDS ${yaml_file}119 DEPFILE ${dep_file}120 COMMENT "Generating header ${ADD_GEN_HDR_GEN_HDR} from ${yaml_file}"121 )122 123 if(ADD_GEN_HDR_DEPENDS)124 get_fq_deps_list(fq_deps_list ${ADD_GEN_HDR_DEPENDS})125 # Dependencies of a add_header target can only be another add_gen_header target126 # or an add_header target.127 foreach(dep IN LISTS fq_deps_list)128 get_target_property(header_file ${dep} HEADER_FILE_PATH)129 if(NOT header_file)130 message(FATAL_ERROR "Invalid dependency '${dep}' for '${fq_target_name}'.")131 endif()132 endforeach()133 endif()134 set(generated_hdr_target ${fq_target_name}.__generated_hdr__)135 add_custom_target(136 ${generated_hdr_target}137 DEPENDS ${out_file} ${fq_deps_list} ${decl_out_file}138 )139 140 add_header_library(141 ${target_name}142 HDRS143 ${out_file}144 )145 146 add_dependencies(${fq_target_name} ${generated_hdr_target})147 148 set_target_properties(149 ${fq_target_name}150 PROPERTIES151 HEADER_NAME ${ADD_GEN_HDR_GEN_HDR}152 HEADER_FILE_PATH ${out_file}153 DECLS_FILE_PATH "${decl_out_file}"154 DEPS "${fq_deps_list}"155 )156 157 158endfunction(add_gen_header)159