brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · b092b37 Raw
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