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 # LLVM_REQUIRES_EH is an internal flag that individual 12 # targets can use to force EH 13 if((LLVM_REQUIRES_EH OR LLVM_ENABLE_EH) AND NOT CLANG_CL) 14 if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI)) 15 message(AUTHOR_WARNING "Exception handling requires RTTI. Enabling RTTI for ${name}") 16 set(LLVM_REQUIRES_RTTI ON) 17 endif() 18 else() 19 if(LLVM_COMPILER_IS_GCC_COMPATIBLE) 20 list(APPEND LLVM_COMPILE_FLAGS "-fno-exceptions") 21 elseif(MSVC) 22 list(APPEND LLVM_COMPILE_DEFINITIONS _HAS_EXCEPTIONS=0) 23 list(APPEND LLVM_COMPILE_FLAGS "/EHs-c-") 24 endif() 25 if (CLANG_CL) 26 # FIXME: Remove this once clang-cl supports SEH 27 list(APPEND LLVM_COMPILE_DEFINITIONS "GTEST_HAS_SEH=0") 28 endif() 29 endif() 30 31 # LLVM_REQUIRES_RTTI is an internal flag that individual 32 # targets can use to force RTTI 33 if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI)) 34 list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_RTTI=0) 35 if (LLVM_COMPILER_IS_GCC_COMPATIBLE) 36 list(APPEND LLVM_COMPILE_FLAGS "-fno-rtti") 37 elseif (MSVC) 38 list(APPEND LLVM_COMPILE_FLAGS "/GR-") 39 endif () 40 endif() 41 42 # Assume that; 43 # - LLVM_COMPILE_FLAGS is list. 44 # - PROPERTY COMPILE_FLAGS is string. 45 string(REPLACE ";" " " target_compile_flags "${LLVM_COMPILE_FLAGS}") 46 47 if(update_src_props) 48 foreach(fn ${sources}) 49 get_filename_component(suf ${fn} EXT) 50 if("${suf}" STREQUAL ".cpp") 51 set_property(SOURCE ${fn} APPEND_STRING PROPERTY 52 COMPILE_FLAGS "${target_compile_flags}") 53 endif() 54 endforeach() 55 else() 56 # Update target props, since all sources are C++. 57 set_property(TARGET ${name} APPEND_STRING PROPERTY 58 COMPILE_FLAGS "${target_compile_flags}") 59 endif() 60 61 set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS ${LLVM_COMPILE_DEFINITIONS}) 62endfunction() 63 64function(add_llvm_symbol_exports target_name export_file) 65 if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 66 set(native_export_file "${target_name}.exports") 67 add_custom_command(OUTPUT ${native_export_file} 68 COMMAND sed -e "s/^/_/" < ${export_file} > ${native_export_file} 69 DEPENDS ${export_file} 70 VERBATIM 71 COMMENT "Creating export file for ${target_name}") 72 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 73 LINK_FLAGS " -Wl,-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}") 74 elseif(LLVM_HAVE_LINK_VERSION_SCRIPT) 75 # Gold and BFD ld require a version script rather than a plain list. 76 set(native_export_file "${target_name}.exports") 77 # FIXME: Don't write the "local:" line on OpenBSD. 78 add_custom_command(OUTPUT ${native_export_file} 79 COMMAND echo "{" > ${native_export_file} 80 COMMAND grep -q "[[:alnum:]]" ${export_file} && echo " global:" >> ${native_export_file} || : 81 COMMAND sed -e "s/$/;/" -e "s/^/ /" < ${export_file} >> ${native_export_file} 82 COMMAND echo " local: *;" >> ${native_export_file} 83 COMMAND echo "};" >> ${native_export_file} 84 DEPENDS ${export_file} 85 VERBATIM 86 COMMENT "Creating export file for ${target_name}") 87 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 88 LINK_FLAGS " -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}") 89 else() 90 set(native_export_file "${target_name}.def") 91 92 set(CAT "cat") 93 set(export_file_nativeslashes ${export_file}) 94 if(WIN32 AND NOT CYGWIN) 95 set(CAT "type") 96 # Convert ${export_file} to native format (backslashes) for "type" 97 # Does not use file(TO_NATIVE_PATH) as it doesn't create a native 98 # path but a build-system specific format (see CMake bug 99 # http://public.kitware.com/Bug/print_bug_page.php?bug_id=5939 ) 100 string(REPLACE / \\ export_file_nativeslashes ${export_file}) 101 endif() 102 103 add_custom_command(OUTPUT ${native_export_file} 104 COMMAND ${CMAKE_COMMAND} -E echo "EXPORTS" > ${native_export_file} 105 COMMAND ${CAT} ${export_file_nativeslashes} >> ${native_export_file} 106 DEPENDS ${export_file} 107 VERBATIM 108 COMMENT "Creating export file for ${target_name}") 109 set(export_file_linker_flag "${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}") 110 if(MSVC) 111 set(export_file_linker_flag "/DEF:${export_file_linker_flag}") 112 endif() 113 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 114 LINK_FLAGS " ${export_file_linker_flag}") 115 endif() 116 117 add_custom_target(${target_name}_exports DEPENDS ${native_export_file}) 118 set_target_properties(${target_name}_exports PROPERTIES FOLDER "Misc") 119 120 get_property(srcs TARGET ${target_name} PROPERTY SOURCES) 121 foreach(src ${srcs}) 122 get_filename_component(extension ${src} EXT) 123 if(extension STREQUAL ".cpp") 124 set(first_source_file ${src}) 125 break() 126 endif() 127 endforeach() 128 129 # Force re-linking when the exports file changes. Actually, it 130 # forces recompilation of the source file. The LINK_DEPENDS target 131 # property only works for makefile-based generators. 132 # FIXME: This is not safe because this will create the same target 133 # ${native_export_file} in several different file: 134 # - One where we emitted ${target_name}_exports 135 # - One where we emitted the build command for the following object. 136 # set_property(SOURCE ${first_source_file} APPEND PROPERTY 137 # OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}) 138 139 set_property(DIRECTORY APPEND 140 PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${native_export_file}) 141 142 add_dependencies(${target_name} ${target_name}_exports) 143 144 # Add dependency to *_exports later -- CMake issue 14747 145 list(APPEND LLVM_COMMON_DEPENDS ${target_name}_exports) 146 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE) 147endfunction(add_llvm_symbol_exports) 148 149if(NOT WIN32 AND NOT APPLE) 150 execute_process( 151 COMMAND ${CMAKE_C_COMPILER} -Wl,--version 152 OUTPUT_VARIABLE stdout 153 ERROR_QUIET 154 ) 155 if("${stdout}" MATCHES "GNU gold") 156 set(LLVM_LINKER_IS_GOLD ON) 157 endif() 158endif() 159 160function(add_link_opts target_name) 161 # Don't use linker optimizations in debug builds since it slows down the 162 # linker in a context where the optimizations are not important. 163 if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") 164 165 # Pass -O3 to the linker. This enabled different optimizations on different 166 # linkers. 167 if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR WIN32)) 168 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 169 LINK_FLAGS " -Wl,-O3") 170 endif() 171 172 if(LLVM_LINKER_IS_GOLD) 173 # With gold gc-sections is always safe. 174 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 175 LINK_FLAGS " -Wl,--gc-sections") 176 # Note that there is a bug with -Wl,--icf=safe so it is not safe 177 # to enable. See https://sourceware.org/bugzilla/show_bug.cgi?id=17704. 178 endif() 179 180 if(NOT LLVM_NO_DEAD_STRIP) 181 if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 182 # ld64's implementation of -dead_strip breaks tools that use plugins. 183 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 184 LINK_FLAGS " -Wl,-dead_strip") 185 elseif(NOT WIN32 AND NOT LLVM_LINKER_IS_GOLD) 186 # Object files are compiled with -ffunction-data-sections. 187 # Versions of bfd ld < 2.23.1 have a bug in --gc-sections that breaks 188 # tools that use plugins. Always pass --gc-sections once we require 189 # a newer linker. 190 set_property(TARGET ${target_name} APPEND_STRING PROPERTY 191 LINK_FLAGS " -Wl,--gc-sections") 192 endif() 193 endif() 194 endif() 195endfunction(add_link_opts) 196 197# Set each output directory according to ${CMAKE_CONFIGURATION_TYPES}. 198# Note: Don't set variables CMAKE_*_OUTPUT_DIRECTORY any more, 199# or a certain builder, for eaxample, msbuild.exe, would be confused. 200function(set_output_directory target bindir libdir) 201 # Do nothing if *_OUTPUT_INTDIR is empty. 202 if("${bindir}" STREQUAL "") 203 return() 204 endif() 205 206 # moddir -- corresponding to LIBRARY_OUTPUT_DIRECTORY. 207 # It affects output of add_library(MODULE). 208 if(WIN32 OR CYGWIN) 209 # DLL platform 210 set(moddir ${bindir}) 211 else() 212 set(moddir ${libdir}) 213 endif() 214 if(NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".") 215 foreach(build_mode ${CMAKE_CONFIGURATION_TYPES}) 216 string(TOUPPER "${build_mode}" CONFIG_SUFFIX) 217 string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} bi ${bindir}) 218 string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} li ${libdir}) 219 string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} mi ${moddir}) 220 set_target_properties(${target} PROPERTIES "RUNTIME_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${bi}) 221 set_target_properties(${target} PROPERTIES "ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${li}) 222 set_target_properties(${target} PROPERTIES "LIBRARY_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${mi}) 223 endforeach() 224 else() 225 set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${bindir}) 226 set_target_properties(${target} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${libdir}) 227 set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${moddir}) 228 endif() 229endfunction() 230 231# llvm_add_library(name sources... 232# SHARED;STATIC 233# STATIC by default w/o BUILD_SHARED_LIBS. 234# SHARED by default w/ BUILD_SHARED_LIBS. 235# MODULE 236# Target ${name} might not be created on unsupported platforms. 237# Check with "if(TARGET ${name})". 238# OUTPUT_NAME name 239# Corresponds to OUTPUT_NAME in target properties. 240# DEPENDS targets... 241# Same semantics as add_dependencies(). 242# LINK_COMPONENTS components... 243# Same as the variable LLVM_LINK_COMPONENTS. 244# LINK_LIBS lib_targets... 245# Same semantics as target_link_libraries(). 246# ADDITIONAL_HEADERS 247# May specify header files for IDE generators. 248# ) 249function(llvm_add_library name) 250 cmake_parse_arguments(ARG 251 "MODULE;SHARED;STATIC" 252 "OUTPUT_NAME" 253 "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS" 254 ${ARGN}) 255 list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS}) 256 if(ARG_ADDITIONAL_HEADERS) 257 # Pass through ADDITIONAL_HEADERS. 258 set(ARG_ADDITIONAL_HEADERS ADDITIONAL_HEADERS ${ARG_ADDITIONAL_HEADERS}) 259 endif() 260 if(ARG_OBJLIBS) 261 set(ALL_FILES ${ARG_OBJLIBS}) 262 else() 263 llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS}) 264 endif() 265 266 if(ARG_MODULE) 267 if(ARG_SHARED OR ARG_STATIC) 268 message(WARNING "MODULE with SHARED|STATIC doesn't make sense.") 269 endif() 270 if(NOT LLVM_ENABLE_PLUGINS) 271 message(STATUS "${name} ignored -- Loadable modules not supported on this platform.") 272 return() 273 endif() 274 else() 275 if(BUILD_SHARED_LIBS AND NOT ARG_STATIC) 276 set(ARG_SHARED TRUE) 277 endif() 278 if(NOT ARG_SHARED) 279 set(ARG_STATIC TRUE) 280 endif() 281 endif() 282 283 # Generate objlib 284 if(ARG_SHARED AND ARG_STATIC) 285 # Generate an obj library for both targets. 286 set(obj_name "obj.${name}") 287 add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL 288 ${ALL_FILES} 289 ) 290 llvm_update_compile_flags(${obj_name}) 291 set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>") 292 293 # Do add_dependencies(obj) later due to CMake issue 14747. 294 list(APPEND objlibs ${obj_name}) 295 296 set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries") 297 endif() 298 299 if(ARG_SHARED AND ARG_STATIC) 300 # static 301 set(name_static "${name}_static") 302 if(ARG_OUTPUT_NAME) 303 set(output_name OUTPUT_NAME "${ARG_OUTPUT_NAME}") 304 endif() 305 # DEPENDS has been appended to LLVM_COMMON_LIBS. 306 llvm_add_library(${name_static} STATIC 307 ${output_name} 308 OBJLIBS ${ALL_FILES} # objlib 309 LINK_LIBS ${ARG_LINK_LIBS} 310 LINK_COMPONENTS ${ARG_LINK_COMPONENTS} 311 ) 312 # FIXME: Add name_static to anywhere in TARGET ${name}'s PROPERTY. 313 set(ARG_STATIC) 314 endif() 315 316 if(ARG_MODULE) 317 add_library(${name} MODULE ${ALL_FILES}) 318 elseif(ARG_SHARED) 319 add_library(${name} SHARED ${ALL_FILES}) 320 else() 321 add_library(${name} STATIC ${ALL_FILES}) 322 endif() 323 set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR}) 324 llvm_update_compile_flags(${name}) 325 add_link_opts( ${name} ) 326 if(ARG_OUTPUT_NAME) 327 set_target_properties(${name} 328 PROPERTIES 329 OUTPUT_NAME ${ARG_OUTPUT_NAME} 330 ) 331 endif() 332 333 if(ARG_MODULE) 334 set_target_properties(${name} PROPERTIES 335 PREFIX "" 336 SUFFIX ${LLVM_PLUGIN_EXT} 337 ) 338 endif() 339 340 if(ARG_SHARED) 341 if(WIN32) 342 set_target_properties(${name} PROPERTIES 343 PREFIX "" 344 ) 345 endif() 346 347 set_target_properties(${name} 348 PROPERTIES 349 SOVERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} 350 VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}) 351 endif() 352 353 if(ARG_MODULE OR ARG_SHARED) 354 # Do not add -Dname_EXPORTS to the command-line when building files in this 355 # target. Doing so is actively harmful for the modules build because it 356 # creates extra module variants, and not useful because we don't use these 357 # macros. 358 set_target_properties( ${name} PROPERTIES DEFINE_SYMBOL "" ) 359 360 if (LLVM_EXPORTED_SYMBOL_FILE) 361 add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) 362 endif() 363 endif() 364 365 # Add the explicit dependency information for this library. 366 # 367 # It would be nice to verify that we have the dependencies for this library 368 # name, but using get_property(... SET) doesn't suffice to determine if a 369 # property has been set to an empty value. 370 get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name}) 371 372 llvm_map_components_to_libnames(llvm_libs 373 ${ARG_LINK_COMPONENTS} 374 ${LLVM_LINK_COMPONENTS} 375 ) 376 377 if(CMAKE_VERSION VERSION_LESS 2.8.12) 378 # Link libs w/o keywords, assuming PUBLIC. 379 target_link_libraries(${name} 380 ${ARG_LINK_LIBS} 381 ${lib_deps} 382 ${llvm_libs} 383 ) 384 elseif(ARG_STATIC) 385 target_link_libraries(${name} INTERFACE 386 ${ARG_LINK_LIBS} 387 ${lib_deps} 388 ${llvm_libs} 389 ) 390 else() 391 # We can use PRIVATE since SO knows its dependent libs. 392 target_link_libraries(${name} PRIVATE 393 ${ARG_LINK_LIBS} 394 ${lib_deps} 395 ${llvm_libs} 396 ) 397 endif() 398 399 if(LLVM_COMMON_DEPENDS) 400 add_dependencies(${name} ${LLVM_COMMON_DEPENDS}) 401 # Add dependencies also to objlibs. 402 # CMake issue 14747 -- add_dependencies() might be ignored to objlib's user. 403 foreach(objlib ${objlibs}) 404 add_dependencies(${objlib} ${LLVM_COMMON_DEPENDS}) 405 endforeach() 406 endif() 407endfunction() 408 409macro(add_llvm_library name) 410 cmake_parse_arguments(ARG 411 "SHARED" 412 "" 413 "" 414 ${ARGN}) 415 if( BUILD_SHARED_LIBS ) 416 llvm_add_library(${name} SHARED ${ARGN}) 417 else() 418 llvm_add_library(${name} ${ARGN}) 419 endif() 420 set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} ) 421 422 if( EXCLUDE_FROM_ALL ) 423 set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON) 424 else() 425 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LTO") 426 if(ARG_SHARED OR BUILD_SHARED_LIBS) 427 if(WIN32 OR CYGWIN) 428 set(install_type RUNTIME) 429 else() 430 set(install_type LIBRARY) 431 endif() 432 else() 433 set(install_type ARCHIVE) 434 endif() 435 436 install(TARGETS ${name} 437 EXPORT LLVMExports 438 ${install_type} DESTINATION lib${LLVM_LIBDIR_SUFFIX} 439 COMPONENT ${name}) 440 441 if (NOT CMAKE_CONFIGURATION_TYPES) 442 add_custom_target(install-${name} 443 DEPENDS ${name} 444 COMMAND "${CMAKE_COMMAND}" 445 -DCMAKE_INSTALL_COMPONENT=${name} 446 -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") 447 endif() 448 endif() 449 set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) 450 endif() 451 set_target_properties(${name} PROPERTIES FOLDER "Libraries") 452endmacro(add_llvm_library name) 453 454macro(add_llvm_loadable_module name) 455 llvm_add_library(${name} MODULE ${ARGN}) 456 if(NOT TARGET ${name}) 457 # Add empty "phony" target 458 add_custom_target(${name}) 459 else() 460 if( EXCLUDE_FROM_ALL ) 461 set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON) 462 else() 463 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 464 if(WIN32 OR CYGWIN) 465 # DLL platform 466 set(dlldir "bin") 467 else() 468 set(dlldir "lib${LLVM_LIBDIR_SUFFIX}") 469 endif() 470 install(TARGETS ${name} 471 EXPORT LLVMExports 472 LIBRARY DESTINATION ${dlldir} 473 ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) 474 endif() 475 set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) 476 endif() 477 endif() 478 479 set_target_properties(${name} PROPERTIES FOLDER "Loadable modules") 480endmacro(add_llvm_loadable_module name) 481 482 483macro(add_llvm_executable name) 484 llvm_process_sources( ALL_FILES ${ARGN} ) 485 if( EXCLUDE_FROM_ALL ) 486 add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES}) 487 else() 488 add_executable(${name} ${ALL_FILES}) 489 endif() 490 llvm_update_compile_flags(${name}) 491 add_link_opts( ${name} ) 492 493 # Do not add -Dname_EXPORTS to the command-line when building files in this 494 # target. Doing so is actively harmful for the modules build because it 495 # creates extra module variants, and not useful because we don't use these 496 # macros. 497 set_target_properties( ${name} PROPERTIES DEFINE_SYMBOL "" ) 498 499 if (LLVM_EXPORTED_SYMBOL_FILE) 500 add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) 501 endif(LLVM_EXPORTED_SYMBOL_FILE) 502 503 set(EXCLUDE_FROM_ALL OFF) 504 set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR}) 505 llvm_config( ${name} ${LLVM_LINK_COMPONENTS} ) 506 if( LLVM_COMMON_DEPENDS ) 507 add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} ) 508 endif( LLVM_COMMON_DEPENDS ) 509endmacro(add_llvm_executable name) 510 511function(export_executable_symbols target) 512 if (NOT MSVC) # MSVC's linker doesn't support exporting all symbols. 513 set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1) 514 endif() 515endfunction() 516 517 518set (LLVM_TOOLCHAIN_TOOLS 519 llvm-ar 520 llvm-objdump 521 ) 522 523macro(add_llvm_tool name) 524 if( NOT LLVM_BUILD_TOOLS ) 525 set(EXCLUDE_FROM_ALL ON) 526 endif() 527 add_llvm_executable(${name} ${ARGN}) 528 529 list(FIND LLVM_TOOLCHAIN_TOOLS ${name} LLVM_IS_${name}_TOOLCHAIN_TOOL) 530 if (LLVM_IS_${name}_TOOLCHAIN_TOOL GREATER -1 OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 531 if( LLVM_BUILD_TOOLS ) 532 install(TARGETS ${name} 533 EXPORT LLVMExports 534 RUNTIME DESTINATION bin 535 COMPONENT ${name}) 536 537 if (NOT CMAKE_CONFIGURATION_TYPES) 538 add_custom_target(install-${name} 539 DEPENDS ${name} 540 COMMAND "${CMAKE_COMMAND}" 541 -DCMAKE_INSTALL_COMPONENT=${name} 542 -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") 543 endif() 544 endif() 545 endif() 546 if( LLVM_BUILD_TOOLS ) 547 set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) 548 endif() 549 set_target_properties(${name} PROPERTIES FOLDER "Tools") 550endmacro(add_llvm_tool name) 551 552 553macro(add_llvm_example name) 554 if( NOT LLVM_BUILD_EXAMPLES ) 555 set(EXCLUDE_FROM_ALL ON) 556 endif() 557 add_llvm_executable(${name} ${ARGN}) 558 if( LLVM_BUILD_EXAMPLES ) 559 install(TARGETS ${name} RUNTIME DESTINATION examples) 560 endif() 561 set_target_properties(${name} PROPERTIES FOLDER "Examples") 562endmacro(add_llvm_example name) 563 564 565macro(add_llvm_utility name) 566 add_llvm_executable(${name} ${ARGN}) 567 set_target_properties(${name} PROPERTIES FOLDER "Utils") 568 if( LLVM_INSTALL_UTILS ) 569 install (TARGETS ${name} 570 RUNTIME DESTINATION bin 571 COMPONENT ${name}) 572 if (NOT CMAKE_CONFIGURATION_TYPES) 573 add_custom_target(install-${name} 574 DEPENDS ${name} 575 COMMAND "${CMAKE_COMMAND}" 576 -DCMAKE_INSTALL_COMPONENT=${name} 577 -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") 578 endif() 579 endif() 580endmacro(add_llvm_utility name) 581 582 583macro(add_llvm_target target_name) 584 include_directories(BEFORE 585 ${CMAKE_CURRENT_BINARY_DIR} 586 ${CMAKE_CURRENT_SOURCE_DIR}) 587 add_llvm_library(LLVM${target_name} ${ARGN}) 588 set( CURRENT_LLVM_TARGET LLVM${target_name} ) 589endmacro(add_llvm_target) 590 591# Add external project that may want to be built as part of llvm such as Clang, 592# lld, and Polly. This adds two options. One for the source directory of the 593# project, which defaults to ${CMAKE_CURRENT_SOURCE_DIR}/${name}. Another to 594# enable or disable building it with everything else. 595# Additional parameter can be specified as the name of directory. 596macro(add_llvm_external_project name) 597 set(add_llvm_external_dir "${ARGN}") 598 if("${add_llvm_external_dir}" STREQUAL "") 599 set(add_llvm_external_dir ${name}) 600 endif() 601 list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE "${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}") 602 string(REPLACE "-" "_" nameUNDERSCORE ${name}) 603 string(TOUPPER ${nameUNDERSCORE} nameUPPER) 604 set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}" 605 CACHE PATH "Path to ${name} source directory") 606 if (NOT ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} STREQUAL "" 607 AND EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}/CMakeLists.txt) 608 option(LLVM_EXTERNAL_${nameUPPER}_BUILD 609 "Whether to build ${name} as part of LLVM" ON) 610 if (LLVM_EXTERNAL_${nameUPPER}_BUILD) 611 add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${add_llvm_external_dir}) 612 endif() 613 endif() 614endmacro(add_llvm_external_project) 615 616macro(add_llvm_tool_subdirectory name) 617 list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE "${CMAKE_CURRENT_SOURCE_DIR}/${name}") 618 add_subdirectory(${name}) 619endmacro(add_llvm_tool_subdirectory) 620 621macro(ignore_llvm_tool_subdirectory name) 622 list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE "${CMAKE_CURRENT_SOURCE_DIR}/${name}") 623endmacro(ignore_llvm_tool_subdirectory) 624 625function(add_llvm_implicit_external_projects) 626 set(list_of_implicit_subdirs "") 627 file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*") 628 foreach(dir ${sub-dirs}) 629 if(IS_DIRECTORY "${dir}") 630 list(FIND LLVM_IMPLICIT_PROJECT_IGNORE "${dir}" tool_subdir_ignore) 631 if( tool_subdir_ignore EQUAL -1 632 AND EXISTS "${dir}/CMakeLists.txt") 633 get_filename_component(fn "${dir}" NAME) 634 list(APPEND list_of_implicit_subdirs "${fn}") 635 endif() 636 endif() 637 endforeach() 638 639 foreach(external_proj ${list_of_implicit_subdirs}) 640 add_llvm_external_project("${external_proj}") 641 endforeach() 642endfunction(add_llvm_implicit_external_projects) 643 644# Generic support for adding a unittest. 645function(add_unittest test_suite test_name) 646 if( NOT LLVM_BUILD_TESTS ) 647 set(EXCLUDE_FROM_ALL ON) 648 endif() 649 650 include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include) 651 if (NOT LLVM_ENABLE_THREADS) 652 list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_PTHREAD=0) 653 endif () 654 655 if (SUPPORTS_NO_VARIADIC_MACROS_FLAG) 656 list(APPEND LLVM_COMPILE_FLAGS "-Wno-variadic-macros") 657 endif () 658 659 set(LLVM_REQUIRES_RTTI OFF) 660 661 add_llvm_executable(${test_name} ${ARGN}) 662 set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}) 663 set_output_directory(${test_name} ${outdir} ${outdir}) 664 target_link_libraries(${test_name} 665 gtest 666 gtest_main 667 LLVMSupport # gtest needs it for raw_ostream. 668 ) 669 670 add_dependencies(${test_suite} ${test_name}) 671 get_target_property(test_suite_folder ${test_suite} FOLDER) 672 if (NOT ${test_suite_folder} STREQUAL "NOTFOUND") 673 set_property(TARGET ${test_name} PROPERTY FOLDER "${test_suite_folder}") 674 endif () 675endfunction() 676 677function(llvm_add_go_executable binary pkgpath) 678 cmake_parse_arguments(ARG "ALL" "" "DEPENDS;GOFLAGS" ${ARGN}) 679 680 if(LLVM_BINDINGS MATCHES "go") 681 # FIXME: This should depend only on the libraries Go needs. 682 get_property(llvmlibs GLOBAL PROPERTY LLVM_LIBS) 683 set(binpath ${CMAKE_BINARY_DIR}/bin/${binary}${CMAKE_EXECUTABLE_SUFFIX}) 684 set(cc "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}") 685 set(cxx "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}") 686 set(cppflags "") 687 get_property(include_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES) 688 foreach(d ${include_dirs}) 689 set(cppflags "${cppflags} -I${d}") 690 endforeach(d) 691 set(ldflags "${CMAKE_EXE_LINKER_FLAGS}") 692 add_custom_command(OUTPUT ${binpath} 693 COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}" 694 ${ARG_GOFLAGS} build -o ${binpath} ${pkgpath} 695 DEPENDS llvm-config ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX} 696 ${llvmlibs} ${ARG_DEPENDS} 697 COMMENT "Building Go executable ${binary}" 698 VERBATIM) 699 if (ARG_ALL) 700 add_custom_target(${binary} ALL DEPENDS ${binpath}) 701 else() 702 add_custom_target(${binary} DEPENDS ${binpath}) 703 endif() 704 endif() 705endfunction() 706 707# This function provides an automatic way to 'configure'-like generate a file 708# based on a set of common and custom variables, specifically targeting the 709# variables needed for the 'lit.site.cfg' files. This function bundles the 710# common variables that any Lit instance is likely to need, and custom 711# variables can be passed in. 712function(configure_lit_site_cfg input output) 713 foreach(c ${LLVM_TARGETS_TO_BUILD}) 714 set(TARGETS_BUILT "${TARGETS_BUILT} ${c}") 715 endforeach(c) 716 set(TARGETS_TO_BUILD ${TARGETS_BUILT}) 717 718 set(SHLIBEXT "${LTDL_SHLIB_EXT}") 719 720 # Configuration-time: See Unit/lit.site.cfg.in 721 if (CMAKE_CFG_INTDIR STREQUAL ".") 722 set(LLVM_BUILD_MODE ".") 723 else () 724 set(LLVM_BUILD_MODE "%(build_mode)s") 725 endif () 726 727 # They below might not be the build tree but provided binary tree. 728 set(LLVM_SOURCE_DIR ${LLVM_MAIN_SRC_DIR}) 729 set(LLVM_BINARY_DIR ${LLVM_BINARY_DIR}) 730 string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_TOOLS_DIR ${LLVM_TOOLS_BINARY_DIR}) 731 string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_LIBS_DIR ${LLVM_LIBRARY_DIR}) 732 733 # SHLIBDIR points the build tree. 734 string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} SHLIBDIR "${LLVM_SHLIB_OUTPUT_INTDIR}") 735 736 set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE}) 737 # FIXME: "ENABLE_SHARED" doesn't make sense, since it is used just for 738 # plugins. We may rename it. 739 if(LLVM_ENABLE_PLUGINS) 740 set(ENABLE_SHARED "1") 741 else() 742 set(ENABLE_SHARED "0") 743 endif() 744 745 if(LLVM_ENABLE_ASSERTIONS AND NOT MSVC_IDE) 746 set(ENABLE_ASSERTIONS "1") 747 else() 748 set(ENABLE_ASSERTIONS "0") 749 endif() 750 751 set(HOST_OS ${CMAKE_SYSTEM_NAME}) 752 set(HOST_ARCH ${CMAKE_SYSTEM_PROCESSOR}) 753 754 set(HOST_CC "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}") 755 set(HOST_CXX "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}") 756 set(HOST_LDFLAGS "${CMAKE_EXE_LINKER_FLAGS}") 757 758 configure_file(${input} ${output} @ONLY) 759endfunction() 760 761# A raw function to create a lit target. This is used to implement the testuite 762# management functions. 763function(add_lit_target target comment) 764 parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN}) 765 set(LIT_ARGS "${ARG_ARGS} ${LLVM_LIT_ARGS}") 766 separate_arguments(LIT_ARGS) 767 if (NOT CMAKE_CFG_INTDIR STREQUAL ".") 768 list(APPEND LIT_ARGS --param build_mode=${CMAKE_CFG_INTDIR}) 769 endif () 770 if (LLVM_MAIN_SRC_DIR) 771 set (LIT_COMMAND ${PYTHON_EXECUTABLE} ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py) 772 else() 773 find_program(LIT_COMMAND llvm-lit) 774 endif () 775 list(APPEND LIT_COMMAND ${LIT_ARGS}) 776 foreach(param ${ARG_PARAMS}) 777 list(APPEND LIT_COMMAND --param ${param}) 778 endforeach() 779 if (ARG_DEFAULT_ARGS) 780 add_custom_target(${target} 781 COMMAND ${LIT_COMMAND} ${ARG_DEFAULT_ARGS} 782 COMMENT "${comment}" 783 ${cmake_3_2_USES_TERMINAL} 784 ) 785 else() 786 add_custom_target(${target} 787 COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, no tools built.") 788 message(STATUS "${target} does nothing.") 789 endif() 790 if (ARG_DEPENDS) 791 add_dependencies(${target} ${ARG_DEPENDS}) 792 endif() 793 794 # Tests should be excluded from "Build Solution". 795 set_target_properties(${target} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON) 796endfunction() 797 798# A function to add a set of lit test suites to be driven through 'check-*' targets. 799function(add_lit_testsuite target comment) 800 parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN}) 801 802 # EXCLUDE_FROM_ALL excludes the test ${target} out of check-all. 803 if(NOT EXCLUDE_FROM_ALL) 804 # Register the testsuites, params and depends for the global check rule. 805 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_TESTSUITES ${ARG_DEFAULT_ARGS}) 806 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_PARAMS ${ARG_PARAMS}) 807 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_DEPENDS ${ARG_DEPENDS}) 808 set_property(GLOBAL APPEND PROPERTY LLVM_LIT_EXTRA_ARGS ${ARG_ARGS}) 809 endif() 810 811 # Produce a specific suffixed check rule. 812 add_lit_target(${target} ${comment} 813 ${ARG_DEFAULT_ARGS} 814 PARAMS ${ARG_PARAMS} 815 DEPENDS ${ARG_DEPENDS} 816 ARGS ${ARG_ARGS} 817 ) 818endfunction() 819 820function(add_lit_testsuites project directory) 821 if (NOT CMAKE_CONFIGURATION_TYPES) 822 parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN}) 823 file(GLOB_RECURSE litCfg ${directory}/lit*.cfg) 824 set(lit_suites) 825 foreach(f ${litCfg}) 826 get_filename_component(dir ${f} DIRECTORY) 827 set(lit_suites ${lit_suites} ${dir}) 828 endforeach() 829 list(REMOVE_DUPLICATES lit_suites) 830 foreach(dir ${lit_suites}) 831 string(REPLACE ${directory} "" name_slash ${dir}) 832 if (name_slash) 833 string(REPLACE "/" "-" name_slash ${name_slash}) 834 string(REPLACE "\\" "-" name_dashes ${name_slash}) 835 string(TOLOWER "${project}${name_dashes}" name_var) 836 add_lit_target("check-${name_var}" "Running lit suite ${dir}" 837 ${dir} 838 PARAMS ${ARG_PARAMS} 839 DEPENDS ${ARG_DEPENDS} 840 ARGS ${ARG_ARGS} 841 ) 842 endif() 843 endforeach() 844 endif() 845endfunction() 846