]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
1 | # LLVM_TARGET_DEFINITIONS must contain the name of the .td file to process. |
2 | # Extra parameters for `tblgen' may come after `ofn' parameter. | |
3 | # Adds the name of the generated file to TABLEGEN_OUTPUT. | |
4 | ||
1a4d82fc JJ |
5 | function(tablegen project ofn) |
6 | # Validate calling context. | |
7 | foreach(v | |
8 | ${project}_TABLEGEN_EXE | |
9 | LLVM_MAIN_SRC_DIR | |
10 | LLVM_MAIN_INCLUDE_DIR | |
11 | ) | |
12 | if(NOT ${v}) | |
13 | message(FATAL_ERROR "${v} not set") | |
14 | endif() | |
15 | endforeach() | |
16 | ||
223e47cc | 17 | file(GLOB local_tds "*.td") |
1a4d82fc | 18 | file(GLOB_RECURSE global_tds "${LLVM_MAIN_INCLUDE_DIR}/llvm/*.td") |
223e47cc LB |
19 | |
20 | if (IS_ABSOLUTE ${LLVM_TARGET_DEFINITIONS}) | |
21 | set(LLVM_TARGET_DEFINITIONS_ABSOLUTE ${LLVM_TARGET_DEFINITIONS}) | |
22 | else() | |
1a4d82fc | 23 | set(LLVM_TARGET_DEFINITIONS_ABSOLUTE |
223e47cc LB |
24 | ${CMAKE_CURRENT_SOURCE_DIR}/${LLVM_TARGET_DEFINITIONS}) |
25 | endif() | |
26 | add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp | |
27 | # Generate tablegen output in a temporary file. | |
28 | COMMAND ${${project}_TABLEGEN_EXE} ${ARGN} -I ${CMAKE_CURRENT_SOURCE_DIR} | |
29 | -I ${LLVM_MAIN_SRC_DIR}/lib/Target -I ${LLVM_MAIN_INCLUDE_DIR} | |
1a4d82fc | 30 | ${LLVM_TARGET_DEFINITIONS_ABSOLUTE} |
223e47cc LB |
31 | -o ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp |
32 | # The file in LLVM_TARGET_DEFINITIONS may be not in the current | |
33 | # directory and local_tds may not contain it, so we must | |
34 | # explicitly list it here: | |
35 | DEPENDS ${${project}_TABLEGEN_EXE} ${local_tds} ${global_tds} | |
36 | ${LLVM_TARGET_DEFINITIONS_ABSOLUTE} | |
37 | COMMENT "Building ${ofn}..." | |
38 | ) | |
39 | add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ofn} | |
40 | # Only update the real output file if there are any differences. | |
41 | # This prevents recompilation of all the files depending on it if there | |
42 | # aren't any. | |
43 | COMMAND ${CMAKE_COMMAND} -E copy_if_different | |
44 | ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp | |
45 | ${CMAKE_CURRENT_BINARY_DIR}/${ofn} | |
46 | DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp | |
1a4d82fc | 47 | COMMENT "Updating ${ofn}..." |
223e47cc LB |
48 | ) |
49 | ||
50 | # `make clean' must remove all those generated files: | |
51 | set_property(DIRECTORY APPEND | |
52 | PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${ofn}.tmp ${ofn}) | |
53 | ||
1a4d82fc JJ |
54 | set(TABLEGEN_OUTPUT ${TABLEGEN_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR}/${ofn} PARENT_SCOPE) |
55 | set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${ofn} PROPERTIES | |
56 | GENERATED 1) | |
57 | endfunction() | |
223e47cc | 58 | |
1a4d82fc | 59 | # Creates a target for publicly exporting tablegen dependencies. |
223e47cc | 60 | function(add_public_tablegen_target target) |
1a4d82fc JJ |
61 | if(NOT TABLEGEN_OUTPUT) |
62 | message(FATAL_ERROR "Requires tablegen() definitions as TABLEGEN_OUTPUT.") | |
63 | endif() | |
64 | add_custom_target(${target} | |
65 | DEPENDS ${TABLEGEN_OUTPUT}) | |
66 | if(LLVM_COMMON_DEPENDS) | |
67 | add_dependencies(${target} ${LLVM_COMMON_DEPENDS}) | |
68 | endif() | |
69 | set_target_properties(${target} PROPERTIES FOLDER "Tablegenning") | |
70 | set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${target} PARENT_SCOPE) | |
223e47cc LB |
71 | endfunction() |
72 | ||
223e47cc | 73 | macro(add_tablegen target project) |
223e47cc LB |
74 | set(${target}_OLD_LLVM_LINK_COMPONENTS ${LLVM_LINK_COMPONENTS}) |
75 | set(LLVM_LINK_COMPONENTS ${LLVM_LINK_COMPONENTS} TableGen) | |
76 | add_llvm_utility(${target} ${ARGN}) | |
77 | set(LLVM_LINK_COMPONENTS ${${target}_OLD_LLVM_LINK_COMPONENTS}) | |
78 | ||
79 | set(${project}_TABLEGEN "${target}" CACHE | |
80 | STRING "Native TableGen executable. Saves building one when cross-compiling.") | |
81 | ||
82 | # Upgrade existing LLVM_TABLEGEN setting. | |
83 | if(${project} STREQUAL LLVM) | |
84 | if(${LLVM_TABLEGEN} STREQUAL tblgen) | |
85 | set(LLVM_TABLEGEN "${target}" CACHE | |
86 | STRING "Native TableGen executable. Saves building one when cross-compiling." | |
87 | FORCE) | |
88 | endif() | |
89 | endif() | |
1a4d82fc | 90 | |
223e47cc LB |
91 | # Effective tblgen executable to be used: |
92 | set(${project}_TABLEGEN_EXE ${${project}_TABLEGEN} PARENT_SCOPE) | |
93 | ||
94 | if(CMAKE_CROSSCOMPILING) | |
95 | if( ${${project}_TABLEGEN} STREQUAL "${target}" ) | |
1a4d82fc | 96 | set(${project}_TABLEGEN_EXE "${LLVM_NATIVE_BUILD}/bin/${target}") |
223e47cc LB |
97 | set(${project}_TABLEGEN_EXE ${${project}_TABLEGEN_EXE} PARENT_SCOPE) |
98 | ||
99 | add_custom_command(OUTPUT ${${project}_TABLEGEN_EXE} | |
1a4d82fc JJ |
100 | COMMAND ${CMAKE_COMMAND} --build . --target ${target} --config $<CONFIGURATION> |
101 | DEPENDS ${LLVM_NATIVE_BUILD}/CMakeCache.txt | |
102 | WORKING_DIRECTORY ${LLVM_NATIVE_BUILD} | |
223e47cc LB |
103 | COMMENT "Building native TableGen...") |
104 | add_custom_target(${project}NativeTableGen DEPENDS ${${project}_TABLEGEN_EXE}) | |
1a4d82fc | 105 | add_dependencies(${project}NativeTableGen ConfigureNativeLLVM) |
223e47cc LB |
106 | |
107 | add_dependencies(${target} ${project}NativeTableGen) | |
108 | endif() | |
109 | endif() | |
110 | ||
111 | if( MINGW ) | |
223e47cc LB |
112 | if(CMAKE_SIZEOF_VOID_P MATCHES "8") |
113 | set_target_properties(${target} PROPERTIES LINK_FLAGS -Wl,--stack,16777216) | |
114 | endif(CMAKE_SIZEOF_VOID_P MATCHES "8") | |
115 | endif( MINGW ) | |
1a4d82fc JJ |
116 | if (${project} STREQUAL LLVM AND NOT LLVM_INSTALL_TOOLCHAIN_ONLY) |
117 | install(TARGETS ${target} | |
118 | EXPORT LLVMExports | |
119 | RUNTIME DESTINATION bin) | |
223e47cc | 120 | endif() |
1a4d82fc | 121 | set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${target}) |
223e47cc | 122 | endmacro() |