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" # 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 set(dest_file ${CMAKE_CURRENT_BINARY_DIR}/${ADD_HEADER_HDR}) 22 set(src_file ${CMAKE_CURRENT_SOURCE_DIR}/${ADD_HEADER_HDR}) 23 24 add_custom_command( 25 OUTPUT ${dest_file} 26 COMMAND cp ${src_file} ${dest_file} 27 DEPENDS ${src_file} 28 ) 29 30 get_fq_target_name(${target_name} fq_target_name) 31 add_custom_target( 32 ${fq_target_name} 33 DEPENDS ${dest_file} 34 ) 35 36 if(ADD_HEADER_DEPENDS) 37 get_fq_deps_list(fq_deps_list ${ADD_HEADER_DEPENDS}) 38 add_dependencies( 39 ${fq_target_name} ${fq_deps_list} 40 ) 41 endif() 42endfunction(add_header) 43 44# A rule for generated header file targets. 45# Usage: 46# add_gen_header( 47# <target name> 48# DEF_FILE <.h.def file> 49# GEN_HDR <generated header file name> 50# PARAMS <list of name=value pairs> 51# DATA_FILES <list input data files> 52# ) 53function(add_gen_header target_name) 54 cmake_parse_arguments( 55 "ADD_GEN_HDR" 56 "" # No optional arguments 57 "DEF_FILE;GEN_HDR" # Single value arguments 58 "PARAMS;DATA_FILES;DEPENDS" # Multi value arguments 59 ${ARGN} 60 ) 61 get_fq_target_name(${target_name} fq_target_name) 62 if(NOT LLVM_LIBC_FULL_BUILD) 63 # We don't want to use generated headers if we are doing a non-full-build. 64 add_custom_target(${fq_target_name}) 65 return() 66 endif() 67 if(NOT ADD_GEN_HDR_DEF_FILE) 68 message(FATAL_ERROR "`add_gen_hdr` rule requires DEF_FILE to be specified.") 69 endif() 70 if(NOT ADD_GEN_HDR_GEN_HDR) 71 message(FATAL_ERROR "`add_gen_hdr` rule requires GEN_HDR to be specified.") 72 endif() 73 74 set(out_file ${CMAKE_CURRENT_BINARY_DIR}/${ADD_GEN_HDR_GEN_HDR}) 75 set(in_file ${CMAKE_CURRENT_SOURCE_DIR}/${ADD_GEN_HDR_DEF_FILE}) 76 77 set(fq_data_files "") 78 if(ADD_GEN_HDR_DATA_FILES) 79 foreach(data_file IN LISTS ADD_GEN_HDR_DATA_FILES) 80 list(APPEND fq_data_files "${CMAKE_CURRENT_SOURCE_DIR}/${data_file}") 81 endforeach(data_file) 82 endif() 83 84 set(replacement_params "") 85 if(ADD_GEN_HDR_PARAMS) 86 list(APPEND replacement_params "--args" ${ADD_GEN_HDR_PARAMS}) 87 endif() 88 89 set(gen_hdr_script "${LIBC_BUILD_SCRIPTS_DIR}/gen_hdr.py") 90 91 file(GLOB td_includes ${LIBC_SOURCE_DIR}/spec/*.td) 92 93 set(ENTRYPOINT_NAME_LIST_ARG ${TARGET_ENTRYPOINT_NAME_LIST}) 94 list(TRANSFORM ENTRYPOINT_NAME_LIST_ARG PREPEND "--e=") 95 96 add_custom_command( 97 OUTPUT ${out_file} 98 COMMAND ${LIBC_TABLEGEN_EXE} -o ${out_file} --header ${ADD_GEN_HDR_GEN_HDR} 99 --def ${in_file} ${replacement_params} -I ${LIBC_SOURCE_DIR} 100 ${ENTRYPOINT_NAME_LIST_ARG} 101 ${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/api.td 102 103 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 104 DEPENDS ${in_file} ${fq_data_files} ${td_includes} 105 ${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/api.td 106 ${LIBC_TABLEGEN_EXE} ${LIBC_TABLEGEN_TARGET} 107 ) 108 109 if(ADD_GEN_HDR_DEPENDS) 110 get_fq_deps_list(fq_deps_list ${ADD_GEN_HDR_DEPENDS}) 111 endif() 112 add_custom_target( 113 ${fq_target_name} 114 DEPENDS ${out_file} ${fq_deps_list} 115 ) 116endfunction(add_gen_header) 117