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