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