1include(LLVMParseArguments) 2include(LLVMProcessSources) 3include(LLVM-Config) 4 5function(llvm_update_compile_flags name) 6 get_property(sources TARGET ${name} PROPERTY SOURCES) 7 if("${sources}" MATCHES "\\.c(;|$)") 8 set(update_src_props ON) 9 endif() 10 11 if(LLVM_REQUIRES_EH) 12 set(LLVM_REQUIRES_RTTI ON) 13 else() 14 if(LLVM_COMPILER_IS_GCC_COMPATIBLE) 15 set(target_compile_flags "${target_compile_flags} -fno-exceptions") 16 elseif(MSVC) 17 list(APPEND LLVM_COMPILE_DEFINITIONS _HAS_EXCEPTIONS=0) 18 set(target_compile_flags "${target_compile_flags} /EHs-c-") 19 endif() 20 endif() 21 22 if(NOT LLVM_REQUIRES_RTTI) 23 list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_RTTI=0) 24 if (LLVM_COMPILER_IS_GCC_COMPATIBLE) 25 set(target_compile_flags "${target_compile_flags} -fno-rtti") 26 elseif (MSVC) 27 set(target_compile_flags "${target_compile_flags} /GR-") 28 endif () 29 endif() 30 31 if(update_src_props) 32 foreach(fn ${sources}) 33 get_filename_component(suf ${fn} EXT) 34 if("${suf}" STREQUAL ".cpp") 35 set_property(SOURCE ${fn} APPEND_STRING PROPERTY 36 COMPILE_FLAGS "${target_compile_flags}") 37 endif() 38 endforeach() 39 else() 40 # Update target props, since all sources are C++. 41 set_property(TARGET ${name} APPEND_STRING PROPERTY 42 COMPILE_FLAGS "${target_compile_flags}") 43 endif() 44 45 set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS ${LLVM_COMPILE_DEFINITIONS}) 46endfunction() 47 48function(add_llvm_symbol_exports target_name export_file) 49 if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 50 set(native_export_file "${target_name}.exports") 51 add_custom_command(OUTPUT ${native_export_file} 52 COMMAND sed -e "s/^/_/" < ${export_file} > ${native_export_file} 53 DEPENDS ${export_file} 54 VERBATIM 55 COMMENT "Creating export file for ${target_name}") 56 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 57 LINK_FLAGS " -Wl,-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}") 58 elseif(LLVM_HAVE_LINK_VERSION_SCRIPT) 59 # Gold and BFD ld require a version script rather than a plain list. 60 set(native_export_file "${target_name}.exports") 61 # FIXME: Don't write the "local:" line on OpenBSD. 62 add_custom_command(OUTPUT ${native_export_file} 63 COMMAND echo "{" > ${native_export_file} 64 COMMAND grep -q "[[:alnum:]]" ${export_file} && echo " global:" >> ${native_export_file} || : 65 COMMAND sed -e "s/$/;/" -e "s/^/ /" < ${export_file} >> ${native_export_file} 66 COMMAND echo " local: *;" >> ${native_export_file} 67 COMMAND echo "};" >> ${native_export_file} 68 DEPENDS ${export_file} 69 VERBATIM 70 COMMENT "Creating export file for ${target_name}") 71 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 72 LINK_FLAGS " -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}") 73 else() 74 set(native_export_file "${target_name}.def") 75 76 set(CAT "type") 77 if(CYGWIN) 78 set(CAT "cat") 79 endif() 80 81 # Using ${export_file} in add_custom_command directly confuses cmd.exe. 82 file(TO_NATIVE_PATH ${export_file} export_file_backslashes) 83 84 add_custom_command(OUTPUT ${native_export_file} 85 COMMAND ${CMAKE_COMMAND} -E echo "EXPORTS" > ${native_export_file} 86 COMMAND ${CAT} ${export_file_backslashes} >> ${native_export_file} 87 DEPENDS ${export_file} 88 VERBATIM 89 COMMENT "Creating export file for ${target_name}") 90 if(CYGWIN OR MINGW) 91 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 92 LINK_FLAGS " ${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}") 93 else() 94 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 95 LINK_FLAGS " /DEF:${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}") 96 endif() 97 endif() 98 99 add_custom_target(${target_name}_exports DEPENDS ${native_export_file}) 100 set_target_properties(${target_name}_exports PROPERTIES FOLDER "Misc") 101 102 get_property(srcs TARGET ${target_name} PROPERTY SOURCES) 103 foreach(src ${srcs}) 104 get_filename_component(extension ${src} EXT) 105 if(extension STREQUAL ".cpp") 106 set(first_source_file ${src}) 107 break() 108 endif() 109 endforeach() 110 111 # Force re-linking when the exports file changes. Actually, it 112 # forces recompilation of the source file. The LINK_DEPENDS target 113 # property only works for makefile-based generators. 114 # FIXME: This is not safe because this will create the same target 115 # ${native_export_file} in several different file: 116 # - One where we emitted ${target_name}_exports 117 # - One where we emitted the build command for the following object. 118 # set_property(SOURCE ${first_source_file} APPEND PROPERTY 119 # OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}) 120 121 set_property(DIRECTORY APPEND 122 PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${native_export_file}) 123 124 add_dependencies(${target_name} ${target_name}_exports) 125endfunction(add_llvm_symbol_exports) 126 127function(add_dead_strip target_name) 128 if(NOT LLVM_NO_DEAD_STRIP) 129 if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 130 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 131 LINK_FLAGS " -Wl,-dead_strip") 132 elseif(NOT WIN32) 133 # Object files are compiled with -ffunction-data-sections. 134 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 135 LINK_FLAGS " -Wl,--gc-sections") 136 endif() 137 endif() 138endfunction(add_dead_strip) 139 140# Set each output directory according to ${CMAKE_CONFIGURATION_TYPES}. 141# Note: Don't set variables CMAKE_*_OUTPUT_DIRECTORY any more, 142# or a certain builder, for eaxample, msbuild.exe, would be confused. 143function(set_output_directory target bindir libdir) 144 if(NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".") 145 foreach(build_mode ${CMAKE_CONFIGURATION_TYPES}) 146 string(TOUPPER "${build_mode}" CONFIG_SUFFIX) 147 string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} bi ${bindir}) 148 string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} li ${libdir}) 149 set_target_properties(${target} PROPERTIES "RUNTIME_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${bi}) 150 set_target_properties(${target} PROPERTIES "ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${li}) 151 set_target_properties(${target} PROPERTIES "LIBRARY_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${li}) 152 endforeach() 153 else() 154 set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${bindir}) 155 set_target_properties(${target} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${libdir}) 156 set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${libdir}) 157 endif() 158endfunction() 159 160macro(add_llvm_library name) 161 llvm_process_sources( ALL_FILES ${ARGN} ) 162 add_library( ${name} ${ALL_FILES} ) 163 set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR}) 164 set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} ) 165 llvm_update_compile_flags(${name}) 166 add_dead_strip( ${name} ) 167 if( LLVM_COMMON_DEPENDS ) 168 add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} ) 169 endif( LLVM_COMMON_DEPENDS ) 170 171 if( BUILD_SHARED_LIBS ) 172 llvm_config( ${name} ${LLVM_LINK_COMPONENTS} ) 173 if (MSVC) 174 set_target_properties(${name} 175 PROPERTIES 176 IMPORT_SUFFIX ".imp") 177 endif () 178 179 if (LLVM_EXPORTED_SYMBOL_FILE) 180 add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) 181 endif() 182 endif() 183 184 # Ensure that the system libraries always comes last on the 185 # list. Without this, linking the unit tests on MinGW fails. 186 link_system_libs( ${name} ) 187 188 if( EXCLUDE_FROM_ALL ) 189 set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON) 190 else() 191 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LTO") 192 install(TARGETS ${name} 193 LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} 194 ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) 195 endif() 196 endif() 197 set_target_properties(${name} PROPERTIES FOLDER "Libraries") 198 199 # Add the explicit dependency information for this library. 200 # 201 # It would be nice to verify that we have the dependencies for this library 202 # name, but using get_property(... SET) doesn't suffice to determine if a 203 # property has been set to an empty value. 204 get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name}) 205 target_link_libraries(${name} ${lib_deps}) 206endmacro(add_llvm_library name) 207 208macro(add_llvm_loadable_module name) 209 if( NOT LLVM_ON_UNIX OR CYGWIN ) 210 message(STATUS "Loadable modules not supported on this platform. 211${name} ignored.") 212 # Add empty "phony" target 213 add_custom_target(${name}) 214 else() 215 llvm_process_sources( ALL_FILES ${ARGN} ) 216 if (MODULE) 217 set(libkind MODULE) 218 else() 219 set(libkind SHARED) 220 endif() 221 222 add_library( ${name} ${libkind} ${ALL_FILES} ) 223 set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR}) 224 set_target_properties( ${name} PROPERTIES PREFIX "" ) 225 llvm_update_compile_flags(${name}) 226 add_dead_strip( ${name} ) 227 228 if (LLVM_EXPORTED_SYMBOL_FILE) 229 add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) 230 endif(LLVM_EXPORTED_SYMBOL_FILE) 231 232 llvm_config( ${name} ${LLVM_LINK_COMPONENTS} ) 233 link_system_libs( ${name} ) 234 235 if (APPLE) 236 # Darwin-specific linker flags for loadable modules. 237 set_property(TARGET ${name} APPEND_STRING PROPERTY 238 LINK_FLAGS " -Wl,-flat_namespace -Wl,-undefined -Wl,suppress") 239 endif() 240 241 if (MODULE) 242 set_property(TARGET ${name} PROPERTY SUFFIX ${LLVM_PLUGIN_EXT}) 243 endif () 244 245 if( EXCLUDE_FROM_ALL ) 246 set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON) 247 else() 248 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 249 install(TARGETS ${name} 250 LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} 251 ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) 252 endif() 253 endif() 254 endif() 255 256 set_target_properties(${name} PROPERTIES FOLDER "Loadable modules") 257endmacro(add_llvm_loadable_module name) 258 259 260macro(add_llvm_executable name) 261 llvm_process_sources( ALL_FILES ${ARGN} ) 262 if( EXCLUDE_FROM_ALL ) 263 add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES}) 264 else() 265 add_executable(${name} ${ALL_FILES}) 266 endif() 267 llvm_update_compile_flags(${name}) 268 add_dead_strip( ${name} ) 269 270 if (LLVM_EXPORTED_SYMBOL_FILE) 271 add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) 272 endif(LLVM_EXPORTED_SYMBOL_FILE) 273 274 set(EXCLUDE_FROM_ALL OFF) 275 set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR}) 276 llvm_config( ${name} ${LLVM_LINK_COMPONENTS} ) 277 if( LLVM_COMMON_DEPENDS ) 278 add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} ) 279 endif( LLVM_COMMON_DEPENDS ) 280 link_system_libs( ${name} ) 281endmacro(add_llvm_executable name) 282 283 284set (LLVM_TOOLCHAIN_TOOLS 285 llvm-ar 286 llvm-objdump 287 ) 288 289macro(add_llvm_tool name) 290 if( NOT LLVM_BUILD_TOOLS ) 291 set(EXCLUDE_FROM_ALL ON) 292 endif() 293 add_llvm_executable(${name} ${ARGN}) 294 295 list(FIND LLVM_TOOLCHAIN_TOOLS ${name} LLVM_IS_${name}_TOOLCHAIN_TOOL) 296 if (LLVM_IS_${name}_TOOLCHAIN_TOOL GREATER -1 OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 297 if( LLVM_BUILD_TOOLS ) 298 install(TARGETS ${name} RUNTIME DESTINATION bin) 299 endif() 300 endif() 301 set_target_properties(${name} PROPERTIES FOLDER "Tools") 302endmacro(add_llvm_tool name) 303 304 305macro(add_llvm_example name) 306 if( NOT LLVM_BUILD_EXAMPLES ) 307 set(EXCLUDE_FROM_ALL ON) 308 endif() 309 add_llvm_executable(${name} ${ARGN}) 310 if( LLVM_BUILD_EXAMPLES ) 311 install(TARGETS ${name} RUNTIME DESTINATION examples) 312 endif() 313 set_target_properties(${name} PROPERTIES FOLDER "Examples") 314endmacro(add_llvm_example name) 315 316 317macro(add_llvm_utility name) 318 add_llvm_executable(${name} ${ARGN}) 319 set_target_properties(${name} PROPERTIES FOLDER "Utils") 320endmacro(add_llvm_utility name) 321 322 323macro(add_llvm_target target_name) 324 include_directories(BEFORE 325 ${CMAKE_CURRENT_BINARY_DIR} 326 ${CMAKE_CURRENT_SOURCE_DIR}) 327 add_llvm_library(LLVM${target_name} ${ARGN} ${TABLEGEN_OUTPUT}) 328 set( CURRENT_LLVM_TARGET LLVM${target_name} ) 329endmacro(add_llvm_target) 330 331# Add external project that may want to be built as part of llvm such as Clang, 332# lld, and Polly. This adds two options. One for the source directory of the 333# project, which defaults to ${CMAKE_CURRENT_SOURCE_DIR}/${name}. Another to 334# enable or disable building it with everything else. 335# Additional parameter can be specified as the name of directory. 336macro(add_llvm_external_project name) 337 set(add_llvm_external_dir "${ARGN}") 338 if("${add_llvm_external_dir}" STREQUAL "") 339 set(add_llvm_external_dir ${name}) 340 endif() 341 list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE "${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}") 342 string(REPLACE "-" "_" nameUNDERSCORE ${name}) 343 string(TOUPPER ${nameUNDERSCORE} nameUPPER) 344 set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}" 345 CACHE PATH "Path to ${name} source directory") 346 if (NOT ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} STREQUAL "" 347 AND EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}/CMakeLists.txt) 348 option(LLVM_EXTERNAL_${nameUPPER}_BUILD 349 "Whether to build ${name} as part of LLVM" ON) 350 if (LLVM_EXTERNAL_${nameUPPER}_BUILD) 351 add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${add_llvm_external_dir}) 352 endif() 353 endif() 354endmacro(add_llvm_external_project) 355 356macro(add_llvm_tool_subdirectory name) 357 list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE "${CMAKE_CURRENT_SOURCE_DIR}/${name}") 358 add_subdirectory(${name}) 359endmacro(add_llvm_tool_subdirectory) 360 361macro(ignore_llvm_tool_subdirectory name) 362 list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE "${CMAKE_CURRENT_SOURCE_DIR}/${name}") 363endmacro(ignore_llvm_tool_subdirectory) 364 365function(add_llvm_implicit_external_projects) 366 set(list_of_implicit_subdirs "") 367 file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*") 368 foreach(dir ${sub-dirs}) 369 if(IS_DIRECTORY "${dir}") 370 list(FIND LLVM_IMPLICIT_PROJECT_IGNORE "${dir}" tool_subdir_ignore) 371 if( tool_subdir_ignore EQUAL -1 372 AND EXISTS "${dir}/CMakeLists.txt") 373 get_filename_component(fn "${dir}" NAME) 374 list(APPEND list_of_implicit_subdirs "${fn}") 375 endif() 376 endif() 377 endforeach() 378 379 foreach(external_proj ${list_of_implicit_subdirs}) 380 add_llvm_external_project("${external_proj}") 381 endforeach() 382endfunction(add_llvm_implicit_external_projects) 383 384# Generic support for adding a unittest. 385function(add_unittest test_suite test_name) 386 if( NOT LLVM_BUILD_TESTS ) 387 set(EXCLUDE_FROM_ALL ON) 388 endif() 389 390 # Visual Studio 2012 only supports up to 8 template parameters in 391 # std::tr1::tuple by default, but gtest requires 10 392 if (MSVC AND MSVC_VERSION EQUAL 1700) 393 list(APPEND LLVM_COMPILE_DEFINITIONS _VARIADIC_MAX=10) 394 endif () 395 396 include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include) 397 if (NOT LLVM_ENABLE_THREADS) 398 list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_PTHREAD=0) 399 endif () 400 401 if (SUPPORTS_NO_VARIADIC_MACROS_FLAG) 402 set(LLVM_COMPILE_FLAGS "-Wno-variadic-macros") 403 endif () 404 405 set(LLVM_REQUIRES_RTTI OFF) 406 407 add_llvm_executable(${test_name} ${ARGN}) 408 set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}) 409 set_output_directory(${test_name} ${outdir} ${outdir}) 410 target_link_libraries(${test_name} 411 gtest 412 gtest_main 413 LLVMSupport # gtest needs it for raw_ostream. 414 ) 415 416 add_dependencies(${test_suite} ${test_name}) 417 get_target_property(test_suite_folder ${test_suite} FOLDER) 418 if (NOT ${test_suite_folder} STREQUAL "NOTFOUND") 419 set_property(TARGET ${test_name} PROPERTY FOLDER "${test_suite_folder}") 420 endif () 421endfunction() 422 423# This function provides an automatic way to 'configure'-like generate a file 424# based on a set of common and custom variables, specifically targeting the 425# variables needed for the 'lit.site.cfg' files. This function bundles the 426# common variables that any Lit instance is likely to need, and custom 427# variables can be passed in. 428function(configure_lit_site_cfg input output) 429 foreach(c ${LLVM_TARGETS_TO_BUILD}) 430 set(TARGETS_BUILT "${TARGETS_BUILT} ${c}") 431 endforeach(c) 432 set(TARGETS_TO_BUILD ${TARGETS_BUILT}) 433 434 set(SHLIBEXT "${LTDL_SHLIB_EXT}") 435 436 if(BUILD_SHARED_LIBS) 437 set(LLVM_SHARED_LIBS_ENABLED "1") 438 else() 439 set(LLVM_SHARED_LIBS_ENABLED "0") 440 endif(BUILD_SHARED_LIBS) 441 442 if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 443 set(SHLIBPATH_VAR "DYLD_LIBRARY_PATH") 444 else() # Default for all other unix like systems. 445 # CMake hardcodes the library locaction using rpath. 446 # Therefore LD_LIBRARY_PATH is not required to run binaries in the 447 # build dir. We pass it anyways. 448 set(SHLIBPATH_VAR "LD_LIBRARY_PATH") 449 endif() 450 451 # Configuration-time: See Unit/lit.site.cfg.in 452 if (CMAKE_CFG_INTDIR STREQUAL ".") 453 set(LLVM_BUILD_MODE ".") 454 else () 455 set(LLVM_BUILD_MODE "%(build_mode)s") 456 endif () 457 458 # They below might not be the build tree but provided binary tree. 459 set(LLVM_SOURCE_DIR ${LLVM_MAIN_SRC_DIR}) 460 set(LLVM_BINARY_DIR ${LLVM_BINARY_DIR}) 461 string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_TOOLS_DIR ${LLVM_TOOLS_BINARY_DIR}) 462 string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_LIBS_DIR ${LLVM_LIBRARY_DIR}) 463 464 # SHLIBDIR points the build tree. 465 string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} SHLIBDIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) 466 467 set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE}) 468 set(ENABLE_SHARED ${LLVM_SHARED_LIBS_ENABLED}) 469 set(SHLIBPATH_VAR ${SHLIBPATH_VAR}) 470 471 if(LLVM_ENABLE_ASSERTIONS AND NOT MSVC_IDE) 472 set(ENABLE_ASSERTIONS "1") 473 else() 474 set(ENABLE_ASSERTIONS "0") 475 endif() 476 477 set(HOST_OS ${CMAKE_SYSTEM_NAME}) 478 set(HOST_ARCH ${CMAKE_SYSTEM_PROCESSOR}) 479 480 if (CLANG_ENABLE_ARCMT) 481 set(ENABLE_CLANG_ARCMT "1") 482 else() 483 set(ENABLE_CLANG_ARCMT "0") 484 endif() 485 if (CLANG_ENABLE_REWRITER) 486 set(ENABLE_CLANG_REWRITER "1") 487 else() 488 set(ENABLE_CLANG_REWRITER "0") 489 endif() 490 if (CLANG_ENABLE_STATIC_ANALYZER) 491 set(ENABLE_CLANG_STATIC_ANALYZER "1") 492 else() 493 set(ENABLE_CLANG_STATIC_ANALYZER "0") 494 endif() 495 496 configure_file(${input} ${output} @ONLY) 497endfunction() 498 499# A raw function to create a lit target. This is used to implement the testuite 500# management functions. 501function(add_lit_target target comment) 502 parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN}) 503 set(LIT_ARGS "${ARG_ARGS} ${LLVM_LIT_ARGS}") 504 separate_arguments(LIT_ARGS) 505 if (NOT CMAKE_CFG_INTDIR STREQUAL ".") 506 list(APPEND LIT_ARGS --param build_mode=${CMAKE_CFG_INTDIR}) 507 endif () 508 set(LIT_COMMAND 509 ${PYTHON_EXECUTABLE} 510 ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py 511 ${LIT_ARGS} 512 ) 513 foreach(param ${ARG_PARAMS}) 514 list(APPEND LIT_COMMAND --param ${param}) 515 endforeach() 516 if( ARG_DEPENDS ) 517 add_custom_target(${target} 518 COMMAND ${LIT_COMMAND} ${ARG_DEFAULT_ARGS} 519 COMMENT "${comment}" 520 ) 521 add_dependencies(${target} ${ARG_DEPENDS}) 522 else() 523 add_custom_target(${target} 524 COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, no tools built.") 525 message(STATUS "${target} does nothing.") 526 endif() 527 528 # Tests should be excluded from "Build Solution". 529 set_target_properties(${target} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON) 530endfunction() 531 532# A function to add a set of lit test suites to be driven through 'check-*' targets. 533function(add_lit_testsuite target comment) 534 parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN}) 535 536 # EXCLUDE_FROM_ALL excludes the test ${target} out of check-all. 537 if(NOT EXCLUDE_FROM_ALL) 538 # Register the testsuites, params and depends for the global check rule. 539 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_TESTSUITES ${ARG_DEFAULT_ARGS}) 540 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_PARAMS ${ARG_PARAMS}) 541 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_DEPENDS ${ARG_DEPENDS}) 542 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_EXTRA_ARGS ${ARG_ARGS}) 543 endif() 544 545 # Produce a specific suffixed check rule. 546 add_lit_target(${target} ${comment} 547 ${ARG_DEFAULT_ARGS} 548 PARAMS ${ARG_PARAMS} 549 DEPENDS ${ARG_DEPENDS} 550 ARGS ${ARG_ARGS} 551 ) 552endfunction() 553