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) 130 131 # Add dependency to *_exports later -- CMake issue 14747 132 list(APPEND LLVM_COMMON_DEPENDS ${target_name}_exports) 133 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE) 134endfunction(add_llvm_symbol_exports) 135 136function(add_dead_strip target_name) 137 if(NOT LLVM_NO_DEAD_STRIP) 138 if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 139 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 140 LINK_FLAGS " -Wl,-dead_strip") 141 elseif(NOT WIN32) 142 # Object files are compiled with -ffunction-data-sections. 143 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 144 LINK_FLAGS " -Wl,--gc-sections") 145 endif() 146 endif() 147endfunction(add_dead_strip) 148 149# Set each output directory according to ${CMAKE_CONFIGURATION_TYPES}. 150# Note: Don't set variables CMAKE_*_OUTPUT_DIRECTORY any more, 151# or a certain builder, for eaxample, msbuild.exe, would be confused. 152function(set_output_directory target bindir libdir) 153 if(NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".") 154 foreach(build_mode ${CMAKE_CONFIGURATION_TYPES}) 155 string(TOUPPER "${build_mode}" CONFIG_SUFFIX) 156 string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} bi ${bindir}) 157 string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} li ${libdir}) 158 set_target_properties(${target} PROPERTIES "RUNTIME_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${bi}) 159 set_target_properties(${target} PROPERTIES "ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${li}) 160 set_target_properties(${target} PROPERTIES "LIBRARY_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${li}) 161 endforeach() 162 else() 163 set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${bindir}) 164 set_target_properties(${target} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${libdir}) 165 set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${libdir}) 166 endif() 167endfunction() 168 169# llvm_add_library(name sources... 170# SHARED;STATIC 171# STATIC by default w/o BUILD_SHARED_LIBS. 172# SHARED by default w/ BUILD_SHARED_LIBS. 173# MODULE 174# Target ${name} might not be created on unsupported platforms. 175# Check with "if(TARGET ${name})". 176# OUTPUT_NAME name 177# Corresponds to OUTPUT_NAME in target properties. 178# DEPENDS targets... 179# Same semantics as add_dependencies(). 180# LINK_COMPONENTS components... 181# Same as the variable LLVM_LINK_COMPONENTS. 182# LINK_LIBS lib_targets... 183# Same semantics as target_link_libraries(). 184# ADDITIONAL_HEADERS 185# May specify header files for IDE generators. 186# ) 187function(llvm_add_library name) 188 cmake_parse_arguments(ARG 189 "MODULE;SHARED;STATIC" 190 "OUTPUT_NAME" 191 "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS" 192 ${ARGN}) 193 list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS}) 194 if(ARG_ADDITIONAL_HEADERS) 195 # Pass through ADDITIONAL_HEADERS. 196 set(ARG_ADDITIONAL_HEADERS ADDITIONAL_HEADERS ${ARG_ADDITIONAL_HEADERS}) 197 endif() 198 if(ARG_OBJLIBS) 199 set(ALL_FILES ${ARG_OBJLIBS}) 200 else() 201 llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS}) 202 endif() 203 204 if(ARG_MODULE) 205 if(ARG_SHARED OR ARG_STATIC) 206 message(WARNING "MODULE with SHARED|STATIC doesn't make sense.") 207 endif() 208 if(NOT LLVM_ON_UNIX OR CYGWIN) 209 message(STATUS "${name} ignored -- Loadable modules not supported on this platform.") 210 return() 211 endif() 212 else() 213 if(BUILD_SHARED_LIBS AND NOT ARG_STATIC) 214 set(ARG_SHARED TRUE) 215 endif() 216 if(NOT ARG_SHARED) 217 set(ARG_STATIC TRUE) 218 endif() 219 endif() 220 221 # Generate objlib 222 if(ARG_SHARED AND ARG_STATIC) 223 # Generate an obj library for both targets. 224 set(obj_name "obj.${name}") 225 add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL 226 ${ALL_FILES} 227 ) 228 llvm_update_compile_flags(${obj_name}) 229 set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>") 230 231 # Do add_dependencies(obj) later due to CMake issue 14747. 232 list(APPEND objlibs ${obj_name}) 233 234 set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries") 235 endif() 236 237 if(ARG_SHARED AND ARG_STATIC) 238 # static 239 set(name_static "${name}_static") 240 if(ARG_OUTPUT_NAME) 241 set(output_name OUTPUT_NAME "${ARG_OUTPUT_NAME}") 242 endif() 243 # DEPENDS has been appended to LLVM_COMMON_LIBS. 244 llvm_add_library(${name_static} STATIC 245 ${output_name} 246 OBJLIBS ${ALL_FILES} # objlib 247 LINK_LIBS ${ARG_LINK_LIBS} 248 LINK_COMPONENTS ${ARG_LINK_COMPONENTS} 249 ) 250 # FIXME: Add name_static to anywhere in TARGET ${name}'s PROPERTY. 251 set(ARG_STATIC) 252 endif() 253 254 if(ARG_MODULE) 255 add_library(${name} MODULE ${ALL_FILES}) 256 elseif(ARG_SHARED) 257 add_library(${name} SHARED ${ALL_FILES}) 258 else() 259 add_library(${name} STATIC ${ALL_FILES}) 260 endif() 261 set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR}) 262 llvm_update_compile_flags(${name}) 263 add_dead_strip( ${name} ) 264 if(ARG_OUTPUT_NAME) 265 set_target_properties(${name} 266 PROPERTIES 267 OUTPUT_NAME ${ARG_OUTPUT_NAME} 268 ) 269 endif() 270 271 if(ARG_MODULE) 272 set_target_properties(${name} PROPERTIES 273 PREFIX "" 274 SUFFIX ${LLVM_PLUGIN_EXT} 275 ) 276 endif() 277 278 if(ARG_SHARED) 279 if(WIN32) 280 set_target_properties(${name} PROPERTIES 281 PREFIX "" 282 ) 283 endif() 284 if (MSVC) 285 set_target_properties(${name} 286 PROPERTIES 287 IMPORT_SUFFIX ".imp") 288 endif () 289 endif() 290 291 if(ARG_MODULE OR ARG_SHARED) 292 if (LLVM_EXPORTED_SYMBOL_FILE) 293 add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) 294 endif() 295 endif() 296 297 # Add the explicit dependency information for this library. 298 # 299 # It would be nice to verify that we have the dependencies for this library 300 # name, but using get_property(... SET) doesn't suffice to determine if a 301 # property has been set to an empty value. 302 get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name}) 303 304 llvm_map_components_to_libnames(llvm_libs 305 ${ARG_LINK_COMPONENTS} 306 ${LLVM_LINK_COMPONENTS} 307 ) 308 309 if(CMAKE_VERSION VERSION_LESS 2.8.12) 310 # Link libs w/o keywords, assuming PUBLIC. 311 target_link_libraries(${name} 312 ${ARG_LINK_LIBS} 313 ${lib_deps} 314 ${llvm_libs} 315 ) 316 elseif(ARG_STATIC) 317 target_link_libraries(${name} INTERFACE 318 ${ARG_LINK_LIBS} 319 ${lib_deps} 320 ${llvm_libs} 321 ) 322 elseif(ARG_SHARED AND BUILD_SHARED_LIBS) 323 # FIXME: It may be PRIVATE since SO knows its dependent libs. 324 target_link_libraries(${name} PUBLIC 325 ${ARG_LINK_LIBS} 326 ${lib_deps} 327 ${llvm_libs} 328 ) 329 else() 330 # MODULE|SHARED 331 target_link_libraries(${name} PRIVATE 332 ${ARG_LINK_LIBS} 333 ${lib_deps} 334 ${llvm_libs} 335 ) 336 endif() 337 338 if(LLVM_COMMON_DEPENDS) 339 add_dependencies(${name} ${LLVM_COMMON_DEPENDS}) 340 # Add dependencies also to objlibs. 341 # CMake issue 14747 -- add_dependencies() might be ignored to objlib's user. 342 foreach(objlib ${objlibs}) 343 add_dependencies(${objlib} ${LLVM_COMMON_DEPENDS}) 344 endforeach() 345 endif() 346endfunction() 347 348macro(add_llvm_library name) 349 if( BUILD_SHARED_LIBS ) 350 llvm_add_library(${name} SHARED ${ARGN}) 351 else() 352 llvm_add_library(${name} ${ARGN}) 353 endif() 354 set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} ) 355 356 if( EXCLUDE_FROM_ALL ) 357 set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON) 358 else() 359 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LTO") 360 install(TARGETS ${name} 361 EXPORT LLVMExports 362 LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} 363 ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) 364 endif() 365 set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) 366 endif() 367 set_target_properties(${name} PROPERTIES FOLDER "Libraries") 368endmacro(add_llvm_library name) 369 370macro(add_llvm_loadable_module name) 371 llvm_add_library(${name} MODULE ${ARGN}) 372 if(NOT TARGET ${name}) 373 # Add empty "phony" target 374 add_custom_target(${name}) 375 else() 376 if( EXCLUDE_FROM_ALL ) 377 set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON) 378 else() 379 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 380 install(TARGETS ${name} 381 EXPORT LLVMExports 382 LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} 383 ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) 384 endif() 385 set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) 386 endif() 387 endif() 388 389 set_target_properties(${name} PROPERTIES FOLDER "Loadable modules") 390endmacro(add_llvm_loadable_module name) 391 392 393macro(add_llvm_executable name) 394 llvm_process_sources( ALL_FILES ${ARGN} ) 395 if( EXCLUDE_FROM_ALL ) 396 add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES}) 397 else() 398 add_executable(${name} ${ALL_FILES}) 399 endif() 400 llvm_update_compile_flags(${name}) 401 add_dead_strip( ${name} ) 402 403 if (LLVM_EXPORTED_SYMBOL_FILE) 404 add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) 405 endif(LLVM_EXPORTED_SYMBOL_FILE) 406 407 set(EXCLUDE_FROM_ALL OFF) 408 set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR}) 409 llvm_config( ${name} ${LLVM_LINK_COMPONENTS} ) 410 if( LLVM_COMMON_DEPENDS ) 411 add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} ) 412 endif( LLVM_COMMON_DEPENDS ) 413endmacro(add_llvm_executable name) 414 415 416set (LLVM_TOOLCHAIN_TOOLS 417 llvm-ar 418 llvm-objdump 419 ) 420 421macro(add_llvm_tool name) 422 if( NOT LLVM_BUILD_TOOLS ) 423 set(EXCLUDE_FROM_ALL ON) 424 endif() 425 add_llvm_executable(${name} ${ARGN}) 426 427 list(FIND LLVM_TOOLCHAIN_TOOLS ${name} LLVM_IS_${name}_TOOLCHAIN_TOOL) 428 if (LLVM_IS_${name}_TOOLCHAIN_TOOL GREATER -1 OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 429 if( LLVM_BUILD_TOOLS ) 430 install(TARGETS ${name} 431 EXPORT LLVMExports 432 RUNTIME DESTINATION bin) 433 endif() 434 endif() 435 if( LLVM_BUILD_TOOLS ) 436 set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) 437 endif() 438 set_target_properties(${name} PROPERTIES FOLDER "Tools") 439endmacro(add_llvm_tool name) 440 441 442macro(add_llvm_example name) 443 if( NOT LLVM_BUILD_EXAMPLES ) 444 set(EXCLUDE_FROM_ALL ON) 445 endif() 446 add_llvm_executable(${name} ${ARGN}) 447 if( LLVM_BUILD_EXAMPLES ) 448 install(TARGETS ${name} RUNTIME DESTINATION examples) 449 endif() 450 set_target_properties(${name} PROPERTIES FOLDER "Examples") 451endmacro(add_llvm_example name) 452 453 454macro(add_llvm_utility name) 455 add_llvm_executable(${name} ${ARGN}) 456 set_target_properties(${name} PROPERTIES FOLDER "Utils") 457endmacro(add_llvm_utility name) 458 459 460macro(add_llvm_target target_name) 461 include_directories(BEFORE 462 ${CMAKE_CURRENT_BINARY_DIR} 463 ${CMAKE_CURRENT_SOURCE_DIR}) 464 add_llvm_library(LLVM${target_name} ${ARGN}) 465 set( CURRENT_LLVM_TARGET LLVM${target_name} ) 466endmacro(add_llvm_target) 467 468# Add external project that may want to be built as part of llvm such as Clang, 469# lld, and Polly. This adds two options. One for the source directory of the 470# project, which defaults to ${CMAKE_CURRENT_SOURCE_DIR}/${name}. Another to 471# enable or disable building it with everything else. 472# Additional parameter can be specified as the name of directory. 473macro(add_llvm_external_project name) 474 set(add_llvm_external_dir "${ARGN}") 475 if("${add_llvm_external_dir}" STREQUAL "") 476 set(add_llvm_external_dir ${name}) 477 endif() 478 list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE "${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}") 479 string(REPLACE "-" "_" nameUNDERSCORE ${name}) 480 string(TOUPPER ${nameUNDERSCORE} nameUPPER) 481 set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}" 482 CACHE PATH "Path to ${name} source directory") 483 if (NOT ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} STREQUAL "" 484 AND EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}/CMakeLists.txt) 485 option(LLVM_EXTERNAL_${nameUPPER}_BUILD 486 "Whether to build ${name} as part of LLVM" ON) 487 if (LLVM_EXTERNAL_${nameUPPER}_BUILD) 488 add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${add_llvm_external_dir}) 489 endif() 490 endif() 491endmacro(add_llvm_external_project) 492 493macro(add_llvm_tool_subdirectory name) 494 list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE "${CMAKE_CURRENT_SOURCE_DIR}/${name}") 495 add_subdirectory(${name}) 496endmacro(add_llvm_tool_subdirectory) 497 498macro(ignore_llvm_tool_subdirectory name) 499 list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE "${CMAKE_CURRENT_SOURCE_DIR}/${name}") 500endmacro(ignore_llvm_tool_subdirectory) 501 502function(add_llvm_implicit_external_projects) 503 set(list_of_implicit_subdirs "") 504 file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*") 505 foreach(dir ${sub-dirs}) 506 if(IS_DIRECTORY "${dir}") 507 list(FIND LLVM_IMPLICIT_PROJECT_IGNORE "${dir}" tool_subdir_ignore) 508 if( tool_subdir_ignore EQUAL -1 509 AND EXISTS "${dir}/CMakeLists.txt") 510 get_filename_component(fn "${dir}" NAME) 511 list(APPEND list_of_implicit_subdirs "${fn}") 512 endif() 513 endif() 514 endforeach() 515 516 foreach(external_proj ${list_of_implicit_subdirs}) 517 add_llvm_external_project("${external_proj}") 518 endforeach() 519endfunction(add_llvm_implicit_external_projects) 520 521# Generic support for adding a unittest. 522function(add_unittest test_suite test_name) 523 if( NOT LLVM_BUILD_TESTS ) 524 set(EXCLUDE_FROM_ALL ON) 525 endif() 526 527 # Visual Studio 2012 only supports up to 8 template parameters in 528 # std::tr1::tuple by default, but gtest requires 10 529 if (MSVC AND MSVC_VERSION EQUAL 1700) 530 list(APPEND LLVM_COMPILE_DEFINITIONS _VARIADIC_MAX=10) 531 endif () 532 533 include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include) 534 if (NOT LLVM_ENABLE_THREADS) 535 list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_PTHREAD=0) 536 endif () 537 538 if (SUPPORTS_NO_VARIADIC_MACROS_FLAG) 539 list(APPEND LLVM_COMPILE_FLAGS "-Wno-variadic-macros") 540 endif () 541 542 set(LLVM_REQUIRES_RTTI OFF) 543 544 add_llvm_executable(${test_name} ${ARGN}) 545 set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}) 546 set_output_directory(${test_name} ${outdir} ${outdir}) 547 target_link_libraries(${test_name} 548 gtest 549 gtest_main 550 LLVMSupport # gtest needs it for raw_ostream. 551 ) 552 553 add_dependencies(${test_suite} ${test_name}) 554 get_target_property(test_suite_folder ${test_suite} FOLDER) 555 if (NOT ${test_suite_folder} STREQUAL "NOTFOUND") 556 set_property(TARGET ${test_name} PROPERTY FOLDER "${test_suite_folder}") 557 endif () 558endfunction() 559 560# This function provides an automatic way to 'configure'-like generate a file 561# based on a set of common and custom variables, specifically targeting the 562# variables needed for the 'lit.site.cfg' files. This function bundles the 563# common variables that any Lit instance is likely to need, and custom 564# variables can be passed in. 565function(configure_lit_site_cfg input output) 566 foreach(c ${LLVM_TARGETS_TO_BUILD}) 567 set(TARGETS_BUILT "${TARGETS_BUILT} ${c}") 568 endforeach(c) 569 set(TARGETS_TO_BUILD ${TARGETS_BUILT}) 570 571 set(SHLIBEXT "${LTDL_SHLIB_EXT}") 572 573 if(BUILD_SHARED_LIBS) 574 set(LLVM_SHARED_LIBS_ENABLED "1") 575 else() 576 set(LLVM_SHARED_LIBS_ENABLED "0") 577 endif(BUILD_SHARED_LIBS) 578 579 # Configuration-time: See Unit/lit.site.cfg.in 580 if (CMAKE_CFG_INTDIR STREQUAL ".") 581 set(LLVM_BUILD_MODE ".") 582 else () 583 set(LLVM_BUILD_MODE "%(build_mode)s") 584 endif () 585 586 # They below might not be the build tree but provided binary tree. 587 set(LLVM_SOURCE_DIR ${LLVM_MAIN_SRC_DIR}) 588 set(LLVM_BINARY_DIR ${LLVM_BINARY_DIR}) 589 string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_TOOLS_DIR ${LLVM_TOOLS_BINARY_DIR}) 590 string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_LIBS_DIR ${LLVM_LIBRARY_DIR}) 591 592 # SHLIBDIR points the build tree. 593 string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} SHLIBDIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) 594 595 set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE}) 596 set(ENABLE_SHARED ${LLVM_SHARED_LIBS_ENABLED}) 597 598 if(LLVM_ENABLE_ASSERTIONS AND NOT MSVC_IDE) 599 set(ENABLE_ASSERTIONS "1") 600 else() 601 set(ENABLE_ASSERTIONS "0") 602 endif() 603 604 set(HOST_OS ${CMAKE_SYSTEM_NAME}) 605 set(HOST_ARCH ${CMAKE_SYSTEM_PROCESSOR}) 606 607 if (CLANG_ENABLE_ARCMT) 608 set(ENABLE_CLANG_ARCMT "1") 609 else() 610 set(ENABLE_CLANG_ARCMT "0") 611 endif() 612 if (CLANG_ENABLE_REWRITER) 613 set(ENABLE_CLANG_REWRITER "1") 614 else() 615 set(ENABLE_CLANG_REWRITER "0") 616 endif() 617 if (CLANG_ENABLE_STATIC_ANALYZER) 618 set(ENABLE_CLANG_STATIC_ANALYZER "1") 619 else() 620 set(ENABLE_CLANG_STATIC_ANALYZER "0") 621 endif() 622 623 configure_file(${input} ${output} @ONLY) 624endfunction() 625 626# A raw function to create a lit target. This is used to implement the testuite 627# management functions. 628function(add_lit_target target comment) 629 parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN}) 630 set(LIT_ARGS "${ARG_ARGS} ${LLVM_LIT_ARGS}") 631 separate_arguments(LIT_ARGS) 632 if (NOT CMAKE_CFG_INTDIR STREQUAL ".") 633 list(APPEND LIT_ARGS --param build_mode=${CMAKE_CFG_INTDIR}) 634 endif () 635 set(LIT_COMMAND 636 ${PYTHON_EXECUTABLE} 637 ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py 638 ${LIT_ARGS} 639 ) 640 foreach(param ${ARG_PARAMS}) 641 list(APPEND LIT_COMMAND --param ${param}) 642 endforeach() 643 if( ARG_DEPENDS ) 644 add_custom_target(${target} 645 COMMAND ${LIT_COMMAND} ${ARG_DEFAULT_ARGS} 646 COMMENT "${comment}" 647 ) 648 add_dependencies(${target} ${ARG_DEPENDS}) 649 else() 650 add_custom_target(${target} 651 COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, no tools built.") 652 message(STATUS "${target} does nothing.") 653 endif() 654 655 # Tests should be excluded from "Build Solution". 656 set_target_properties(${target} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON) 657endfunction() 658 659# A function to add a set of lit test suites to be driven through 'check-*' targets. 660function(add_lit_testsuite target comment) 661 parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN}) 662 663 # EXCLUDE_FROM_ALL excludes the test ${target} out of check-all. 664 if(NOT EXCLUDE_FROM_ALL) 665 # Register the testsuites, params and depends for the global check rule. 666 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_TESTSUITES ${ARG_DEFAULT_ARGS}) 667 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_PARAMS ${ARG_PARAMS}) 668 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_DEPENDS ${ARG_DEPENDS}) 669 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_EXTRA_ARGS ${ARG_ARGS}) 670 endif() 671 672 # Produce a specific suffixed check rule. 673 add_lit_target(${target} ${comment} 674 ${ARG_DEFAULT_ARGS} 675 PARAMS ${ARG_PARAMS} 676 DEPENDS ${ARG_DEPENDS} 677 ARGS ${ARG_ARGS} 678 ) 679endfunction() 680