599 lines · plain
1cmake_minimum_required(VERSION 3.20.0)2set(LLVM_SUBPROJECT_TITLE "Flang")3 4if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS)5 set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)6endif()7include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake8 NO_POLICY_SCOPE)9 10set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)11 12# Flang requires C++17.13set(CMAKE_CXX_STANDARD 17)14set(CMAKE_CXX_STANDARD_REQUIRED TRUE)15set(CMAKE_CXX_EXTENSIONS OFF)16 17if (LLVM_ENABLE_EH)18 # To match with the flang guidelines we currently disable19 # building with exception support in core LLVM.20 message(FATAL_ERROR "Flang does not currently support building with \21 LLVM exceptions enabled. Please disable LLVM_ENABLE_EH when building \22 flang.")23endif()24 25set(FLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})26 27# Python is needed for symbol extracting tool28set(LLVM_MINIMUM_PYTHON_VERSION 3.8)29find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED30 COMPONENTS Interpreter)31 32if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE)33 message(FATAL_ERROR "In-source builds are not allowed. \34 Please create a directory and run cmake from there,\35 passing the path to this source directory as the last argument.\36 This process created the file `CMakeCache.txt' and the directory\37 `CMakeFiles'. Please delete them.")38endif()39 40option(FLANG_ENABLE_WERROR "Fail and stop building flang if a warning is triggered." OFF)41 42# Check for a standalone build and configure as appropriate from43# there.44if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)45 message("Building Flang as a standalone project.")46 project(Flang)47 set(FLANG_STANDALONE_BUILD ON)48else()49 set(FLANG_STANDALONE_BUILD OFF)50endif()51 52# Must go below project(..)53include(GNUInstallDirs)54 55# MSVC + clang-cl build requires clang_rt.builtin.${target} library56if (MSVC AND CMAKE_CXX_COMPILER_ID MATCHES Clang)57 include(HandleCompilerRT)58 find_compiler_rt_library(builtins CLANG_RT_BUILTINS_LIBRARY)59 get_filename_component(LIBDIR "${CLANG_RT_BUILTINS_LIBRARY}" DIRECTORY)60 if (IS_DIRECTORY "${LIBDIR}")61 link_libraries(${CLANG_RT_BUILTINS_LIBRARY})62 endif()63 64 if (MSVC_VERSION EQUAL 1942)65 message(FATAL_ERROR "Flang cannot be built with clang and the MSVC 17.12 "66 "toolchain version. Please upgrade to 17.13 or later, or switch "67 "to the 17.10 LTSC release. "68 "See https://github.com/microsoft/STL/issues/4959 for more details.")69 endif()70endif()71 72if(CMAKE_SIZEOF_VOID_P EQUAL 4)73 message(FATAL_ERROR "flang isn't supported on 32 bit CPUs")74endif()75 76set(MLIR_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../mlir" CACHE PATH "Path to MLIR source tree")77 78if (FLANG_STANDALONE_BUILD)79 set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})80 set(CMAKE_INCLUDE_CURRENT_DIR ON)81 if (NOT MSVC_IDE)82 set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS}83 CACHE BOOL "Enable assertions")84 # Assertions follow llvm's configuration.85 mark_as_advanced(LLVM_ENABLE_ASSERTIONS)86 endif()87 88 # Build with _XOPEN_SOURCE on AIX to avoid errors caused by _ALL_SOURCE.89 # We need to enable the large-file API as well.90 if (UNIX AND CMAKE_SYSTEM_NAME MATCHES "AIX")91 add_compile_definitions(_XOPEN_SOURCE=700)92 add_compile_definitions(_LARGE_FILE_API)93 endif()94 95 # If the user specifies a relative path to LLVM_DIR, the calls to include96 # LLVM modules fail. Append the absolute path to LLVM_DIR instead.97 if (LLVM_DIR)98 get_filename_component(LLVM_DIR_ABSOLUTE ${LLVM_DIR}99 REALPATH BASE_DIR ${CMAKE_CURRENT_BINARY_DIR})100 list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR_ABSOLUTE})101 endif()102 # We need a pre-built/installed version of LLVM.103 find_package(LLVM REQUIRED HINTS "${LLVM_DIR_ABSOLUTE}")104 if (NOT LLVM_DIR_ABSOLUTE)105 # If the user did not specify a LLVM_DIR (and therefore LLVM_DIR_ABSOLUTE106 # was not set), append the discovered path to CMAKE_MODULE_PATH.107 list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR})108 endif()109 110 # Users might specify a path to CLANG_DIR that's:111 # * a full path, or112 # * a path relative to the path of this script.113 # Append the absolute path to CLANG_DIR so that find_package works in both114 # cases.115 if (CLANG_DIR)116 get_filename_component(117 CLANG_DIR_ABSOLUTE118 ${CLANG_DIR}119 REALPATH120 BASE_DIR ${CMAKE_CURRENT_BINARY_DIR})121 list(APPEND CMAKE_MODULE_PATH ${CLANG_DIR_ABSOLUTE})122 123 # TODO: Remove when libclangDriver is lifted out of Clang124 find_package(Clang REQUIRED PATHS "${CLANG_DIR_ABSOLUTE}" NO_DEFAULT_PATH)125 else()126 find_package(Clang REQUIRED)127 list(APPEND CMAKE_MODULE_PATH ${Clang_DIR})128 endif()129 130 # If LLVM links to zlib we need the imported targets so we can too.131 if(LLVM_ENABLE_ZLIB)132 find_package(ZLIB REQUIRED)133 endif()134 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)135 if(CMAKE_COMPILER_IS_GNUCXX)136 set(USE_NO_MAYBE_UNINITIALIZED 1)137 endif()138 139 # The path is needed to locate extract_symbols.py140 if (NOT DEFINED LLVM_MAIN_SRC_DIR)141 set(LLVM_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm")142 endif()143 144 separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})145 add_definitions(${LLVM_DEFINITIONS_LIST})146 list(APPEND CMAKE_REQUIRED_DEFINITIONS ${LLVM_DEFINITIONS_LIST})147 148 include(AddLLVM)149 include(HandleLLVMOptions)150 include(VersionFromVCS)151 include(GetErrcMessages)152 153 include(AddClang)154 155 include(TableGen)156 # If the user specifies a relative path to MLIR_DIR, the calls to include157 # MLIR modules fail. Append the absolute path to MLIR_DIR instead.158 if (MLIR_DIR)159 get_filename_component(MLIR_DIR_ABSOLUTE ${MLIR_DIR}160 REALPATH BASE_DIR ${CMAKE_CURRENT_BINARY_DIR})161 list(APPEND CMAKE_MODULE_PATH ${MLIR_DIR_ABSOLUTE})162 endif()163 find_package(MLIR REQUIRED CONFIG HINTS ${MLIR_DIR_ABSOLUTE})164 if (NOT MLIR_DIR_ABSOLUTE)165 list(APPEND CMAKE_MODULE_PATH ${MLIR_DIR})166 endif()167 # Use SYSTEM for the same reasons as for LLVM includes168 include_directories(SYSTEM ${MLIR_INCLUDE_DIRS})169 include(AddMLIR)170 find_program(MLIR_TABLEGEN_EXE "mlir-tblgen" ${LLVM_TOOLS_BINARY_DIR}171 NO_DEFAULT_PATH)172 173 option(LLVM_INSTALL_TOOLCHAIN_ONLY174 "Only include toolchain files in the 'install' target." OFF)175 option(LLVM_FORCE_USE_OLD_TOOLCHAIN176 "Set to ON to force using an old, unsupported host toolchain." OFF)177 178 179 # Add LLVM include files as if they were SYSTEM because there are complex unused180 # parameter issues that may or may not appear depending on the environments and181 # compilers (ifdefs are involved). This allows warnings from LLVM headers to be182 # ignored while keeping -Wunused-parameter a fatal error inside f18 code base.183 # This may have to be fine-tuned if flang headers are consider part of this184 # LLVM_INCLUDE_DIRS when merging in the monorepo (Warning from flang headers185 # should not be suppressed).186 include_directories(SYSTEM ${LLVM_INCLUDE_DIRS})187 add_definitions(${LLVM_DEFINITIONS})188 189 # LLVM's cmake configuration files currently sneak in a c++11 flag.190 # We look for it here and remove it from Flang's compile flags to191 # avoid some mixed compilation flangs (e.g. -std=c++11 ... -std=c++17).192 if (DEFINED LLVM_CXX_STD)193 message("LLVM configuration set a C++ standard: ${LLVM_CXX_STD}")194 if (NOT LLVM_CXX_STD EQUAL "c++17")195 message("Flang: Overriding LLVM's 'cxx_std' setting...")196 message(" removing '-std=${LLVM_CXX_STD}'")197 message(" CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'")198 string(REPLACE " -std=${LLVM_CXX_STD}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")199 message(" [NEW] CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'")200 endif()201 endif()202 203 link_directories("${LLVM_LIBRARY_DIR}")204 205 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)206 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY207 ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})208 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY209 ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})210 211 set(LLVM_EXTERNAL_LIT "${LLVM_TOOLS_BINARY_DIR}/llvm-lit" CACHE STRING "Command used to spawn lit")212 set(LIT_ARGS_DEFAULT "-sv")213 if (MSVC OR XCODE)214 set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")215 endif()216 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")217 218 option(FLANG_INCLUDE_TESTS219 "Generate build targets for the Flang unit tests."220 ON)221 222 get_errc_messages(LLVM_LIT_ERRC_MESSAGES)223 224#Handle unittests when out-of-tree225 set(FLANG_GTEST_AVAIL 0)226 if (FLANG_INCLUDE_TESTS)227 set(UNITTEST_DIR ${LLVM_THIRD_PARTY_DIR}/unittest)228 if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h)229 if (NOT TARGET llvm_gtest)230 add_subdirectory(${UNITTEST_DIR} third-party/unittest)231 endif()232 set(FLANG_GTEST_AVAIL 1)233 else()234 message(WARNING235 "Unit-tests will be skipped as LLVM install does not include google-test related headers and libraries.")236 set(FLANG_GTEST_AVAIL 0)237 endif()238 endif()239 if (FLANG_GTEST_AVAIL)240 add_custom_target(check-all DEPENDS check-flang FlangUnitTests)241 else()242 add_custom_target(check-all DEPENDS check-flang )243 endif()244 if (LLVM_BUILD_DOCS)245 add_custom_target(doxygen ALL)246 endif()247 248else()249 option(FLANG_INCLUDE_TESTS250 "Generate build targets for the Flang unit tests."251 ${LLVM_INCLUDE_TESTS})252 set(FLANG_GTEST_AVAIL 1)253 254 if(FLANG_STANDALONE_BUILD)255 set(FLANG_BINARY_DIR ${CMAKE_BINARY_DIR}/tools/flang)256 else()257 set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})258 endif()259 260 set(MLIR_INCLUDE_DIRS ${MLIR_MAIN_SRC_DIR}/include ) # --includedir261 set(MLIR_TABLEGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tools/mlir/include)262 include_directories(SYSTEM ${MLIR_INCLUDE_DIRS})263 include_directories(SYSTEM ${MLIR_TABLEGEN_OUTPUT_DIR})264endif()265 266if (FLANG_STANDALONE_BUILD)267 message(STATUS "Not building Flang-RT. For a usable Fortran toolchain, compile a standalone Flang-RT.")268elseif (NOT "flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)269 message(STATUS "Not building Flang-RT. For a usable Fortran toolchain, either set FLANG_ENABLE_FLANG_RT=ON, add LLVM_ENABLE_RUNTIMES=flang-rt, or compile a standalone Flang-RT.")270endif ()271 272set(FLANG_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH273 "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')")274mark_as_advanced(FLANG_TOOLS_INSTALL_DIR)275 276set(FLANG_INTRINSIC_MODULES_DIR ${CMAKE_BINARY_DIR}/include/flang)277set(FLANG_INCLUDE_DIR ${FLANG_BINARY_DIR}/include)278 279# TODO: Remove when libclangDriver is lifted out of Clang280if(FLANG_STANDALONE_BUILD)281 set(CLANG_INCLUDE_DIR ${CLANG_INCLUDE_DIRS} )282 # No need to specify TableGen output dir as that's embedded in CLANG_DIR283else()284 set(CLANG_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/../clang/include )285 # Specify TableGen output dir for things like DiagnosticCommonKinds.inc,286 # DiagnosticDriverKinds.inc (required for reporting diagnostics)287 set(CLANG_TABLEGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tools/clang/include)288 include_directories(SYSTEM ${CLANG_TABLEGEN_OUTPUT_DIR})289endif()290include_directories(SYSTEM ${CLANG_INCLUDE_DIR})291 292# tco tool and FIR lib output directories293if(FLANG_STANDALONE_BUILD)294 set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin)295 set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib)296endif()297# Always build tco tool298set(LLVM_BUILD_TOOLS ON)299 300include_directories(BEFORE301 ${FLANG_BINARY_DIR}/include302 ${FLANG_SOURCE_DIR}/include)303 304# Add Flang-centric modules to cmake path.305list(INSERT CMAKE_MODULE_PATH 0306 "${FLANG_SOURCE_DIR}/cmake/modules"307 "${LLVM_COMMON_CMAKE_UTILS}/Modules"308 )309include(AddFlang)310 311if (NOT DEFAULT_SYSROOT)312 set(DEFAULT_SYSROOT "" CACHE PATH313 "The <path> to use for the system root for all compiler invocations (--sysroot=<path>).")314endif()315 316if (NOT ENABLE_LINKER_BUILD_ID)317 set(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld")318endif()319 320set(FLANG_DEFAULT_LINKER "${CLANG_DEFAULT_LINKER}" CACHE STRING321 "Default linker to use (linker name or absolute path, empty for platform default)")322 323set(FLANG_DEFAULT_RTLIB "" CACHE STRING324 "Default Fortran runtime library to use (\"libflang_rt.runtime\"), leave empty for platform default.")325 326if (NOT(FLANG_DEFAULT_RTLIB STREQUAL ""))327 message(WARNING "Resetting Flang's default runtime library to use platform default.")328 set(FLANG_DEFAULT_RTLIB "" CACHE STRING329 "Default runtime library to use (empty for platform default)" FORCE)330endif()331 332 333 334set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")335if (NOT PACKAGE_VERSION)336 set(PACKAGE_VERSION ${LLVM_VERSION_MAJOR})337endif()338 339 340if (NOT DEFINED FLANG_VERSION_MAJOR)341 set(FLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})342endif()343 344if (NOT DEFINED FLANG_VERSION_MINOR)345 set(FLANG_VERSION_MINOR ${LLVM_VERSION_MINOR})346endif()347 348if (NOT DEFINED FLANG_VERSION_PATCHLEVEL)349 set(FLANG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH})350endif()351 352# Unlike PACKAGE_VERSION, FLANG_VERSION does not include LLVM_VERSION_SUFFIX.353set(FLANG_VERSION "${FLANG_VERSION_MAJOR}.${FLANG_VERSION_MINOR}.${FLANG_VERSION_PATCHLEVEL}")354message(STATUS "Flang version: ${FLANG_VERSION}")355# Flang executable version information356set(FLANG_EXECUTABLE_VERSION357 "${FLANG_VERSION_MAJOR}" CACHE STRING358 "Major version number to appended to the flang executable name.")359set(LIBFLANG_LIBRARY_VERSION360 "${FLANG_VERSION_MAJOR}" CACHE STRING361 "Major version number to appended to the libflang library.")362 363mark_as_advanced(FLANG_EXECUTABLE_VERSION LIBFLANG_LIBRARY_VERSION)364 365set(FLANG_VENDOR ${PACKAGE_VENDOR} CACHE STRING366 "Vendor-specific Flang version information.")367set(FLANG_VENDOR_UTI "org.llvm.flang" CACHE STRING368 "Vendor-specific uti.")369 370if (FLANG_VENDOR)371 add_definitions(-DFLANG_VENDOR="${FLANG_VENDOR} ")372endif()373 374set(FLANG_REPOSITORY_STRING "" CACHE STRING375 "Vendor-specific text for showing the repository the source is taken from.")376if (FLANG_REPOSITORY_STRING)377 add_definitions(-DFLANG_REPOSITORY_STRING="${FLANG_REPOSITORY_STRING}")378endif()379 380# Configure Flang's Version.inc file.381configure_file(382 ${CMAKE_CURRENT_SOURCE_DIR}/include/flang/Version.inc.in383 ${CMAKE_CURRENT_BINARY_DIR}/include/flang/Version.inc)384# Configure Flang's version info header file.385configure_file(386 ${FLANG_SOURCE_DIR}/include/flang/Config/config.h.cmake387 ${FLANG_BINARY_DIR}/include/flang/Config/config.h)388 389if (FLANG_ENABLE_WERROR)390 # The following is taken from llvm/cmake/modules/HandleLLVMOptions.cmake391 # Keep this up-to-date with that file392 if( MSVC )393 append("/WX" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)394 endif()395 if ( LLVM_COMPILER_IS_GCC_COMPATIBLE )396 append("-Werror" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)397 append("-Wno-error" CMAKE_REQUIRED_FLAGS)398 endif( LLVM_COMPILER_IS_GCC_COMPATIBLE )399endif()400 401# Builtin check_cxx_compiler_flag doesn't seem to work correctly402macro(check_compiler_flag flag resultVar)403 unset(${resultVar} CACHE)404 check_cxx_compiler_flag("${flag}" ${resultVar})405endmacro()406 407check_compiler_flag("-Werror -Wno-deprecated-copy" CXX_SUPPORTS_NO_DEPRECATED_COPY_FLAG)408if (CXX_SUPPORTS_NO_DEPRECATED_COPY_FLAG)409 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-copy")410endif()411check_compiler_flag("-Wstring-conversion" CXX_SUPPORTS_NO_STRING_CONVERSION_FLAG)412if (CXX_SUPPORTS_NO_STRING_CONVERSION_FLAG)413 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-string-conversion")414endif()415check_compiler_flag("-Wno-ctad-maybe-unsupported" CXX_SUPPORTS_NO_CTAD_MAYBE_UNSUPPORTED_FLAG)416if (CXX_SUPPORTS_NO_CTAD_MAYBE_UNSUPPORTED_FLAG)417 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-ctad-maybe-unsupported")418endif()419 420# Add appropriate flags for GCC421if (LLVM_COMPILER_IS_GCC_COMPATIBLE)422 423 if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")424 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-semantic-interposition")425 else()426 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-command-line-argument -Wstring-conversion \427 -Wcovered-switch-default")428 endif() # Clang.429 430 check_cxx_compiler_flag("-Werror -Wnested-anon-types" CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG)431 if (CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG)432 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nested-anon-types")433 endif()434 435 # Add to build type flags.436 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUGF18")437 set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -DCHECK=\"(void)\"")438 439 # Building shared libraries is bad for performance with GCC by default440 # due to the need to preserve the right to override external entry points441 if (BUILD_SHARED_LIBS AND NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))442 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-semantic-interposition")443 endif()444 445 # GCC requires this flag in order for precompiled headers to work with ccache446 if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_DISABLE_PRECOMPILE_HEADERS)447 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpch-preprocess")448 endif()449endif()450 451# Clang on Darwin enables non-POSIX extensions by default, which allows the452# macro HUGE to leak out of <math.h> even when it is never directly included,453# conflicting with Flang's HUGE symbols.454# Set _POSIX_C_SOURCE to avoid including these extensions.455if (APPLE)456 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_POSIX_C_SOURCE=200809")457endif()458 459# Clang requires this flag in order for precompiled headers to work with ccache460if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT CMAKE_DISABLE_PRECOMPILE_HEADERS)461 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Xclang -fno-pch-timestamp")462endif()463 464list(REMOVE_DUPLICATES CMAKE_CXX_FLAGS)465 466# Determine HOST_LINK_VERSION on Darwin.467set(HOST_LINK_VERSION)468if (APPLE)469 set(LD_V_OUTPUT)470 execute_process(471 COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1"472 RESULT_VARIABLE HAD_ERROR473 OUTPUT_VARIABLE LD_V_OUTPUT)474 if (NOT HAD_ERROR)475 if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*")476 string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})477 elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*")478 string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})479 endif()480 else()481 message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}")482 endif()483endif()484 485# Set up job pools for flang. Some of the flang sources take a lot of memory to486# compile, so allow users to limit the number of parallel flang jobs. This is487# useful for building flang alongside several other projects since you can use488# the maximum number of build jobs for the other projects while limiting the489# number of flang compile jobs.490set(FLANG_PARALLEL_COMPILE_JOBS CACHE STRING491 "The maximum number of concurrent compilation jobs for Flang (Ninja only)")492if (FLANG_PARALLEL_COMPILE_JOBS)493 set_property(GLOBAL APPEND PROPERTY JOB_POOLS flang_compile_job_pool=${FLANG_PARALLEL_COMPILE_JOBS})494endif()495 496include(AddFlang)497include(FlangCommon)498include(GetClangResourceDir)499 500get_clang_resource_dir(HEADER_BINARY_DIR PREFIX ${LLVM_LIBRARY_OUTPUT_INTDIR}/.. SUBDIR include)501 502if (FLANG_INCLUDE_TESTS)503 add_compile_definitions(FLANG_INCLUDE_TESTS=1)504endif()505 506add_subdirectory(include)507add_subdirectory(lib)508add_subdirectory(cmake/modules)509 510option(FLANG_INCLUDE_TOOLS "Generate build targets for the Flang tools." ON)511option(FLANG_BUILD_TOOLS512 "Build the Flang tools. If OFF, just generate build targets." ON)513if (FLANG_INCLUDE_TOOLS)514 add_subdirectory(tools)515endif()516 517if (LLVM_INCLUDE_EXAMPLES)518 add_subdirectory(examples)519endif()520 521if (FLANG_INCLUDE_TESTS)522 add_subdirectory(test)523 if (FLANG_GTEST_AVAIL)524 add_subdirectory(unittests)525 endif ()526endif()527 528option(FLANG_INCLUDE_DOCS "Generate build targets for the Flang docs."529 ${LLVM_INCLUDE_DOCS})530if (FLANG_INCLUDE_DOCS)531 add_subdirectory(docs)532endif()533 534# Custom target to install Flang libraries.535add_custom_target(flang-libraries)536set_target_properties(flang-libraries PROPERTIES FOLDER "Flang/Meta")537 538if (NOT LLVM_ENABLE_IDE)539 add_llvm_install_targets(install-flang-libraries540 DEPENDS flang-libraries541 COMPONENT flang-libraries)542endif()543 544get_property(FLANG_LIBS GLOBAL PROPERTY FLANG_LIBS)545if (FLANG_LIBS)546 list(REMOVE_DUPLICATES FLANG_LIBS)547 foreach(lib ${FLANG_LIBS})548 add_dependencies(flang-libraries ${lib})549 if (NOT LLVM_ENABLE_IDE)550 add_dependencies(install-flang-libraries install-${lib})551 endif()552 endforeach()553endif()554 555if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)556 add_llvm_install_targets(install-flang-headers557 COMPONENT flang-headers)558 559 install(DIRECTORY include/flang560 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"561 COMPONENT flang-headers562 FILES_MATCHING563 PATTERN "*.def"564 PATTERN "*.h"565 PATTERN "*.inc"566 PATTERN "*.td"567 PATTERN "config.h" EXCLUDE568 PATTERN ".git" EXCLUDE569 PATTERN "CMakeFiles" EXCLUDE)570 571 install(DIRECTORY ${FLANG_INCLUDE_DIR}/flang572 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"573 COMPONENT flang-headers574 FILES_MATCHING575 PATTERN "*.inc"576 )577endif()578 579# Put ISO_Fortran_binding.h into the include files of the build area now580# so that we can run tests before installing581configure_file(582 ${FLANG_SOURCE_DIR}/include/flang/ISO_Fortran_binding.h583 ${HEADER_BINARY_DIR}/ISO_Fortran_binding.h COPYONLY)584 585# llvm-test-suite explicitly searches for this header file586# (`ISO_FORTRAN_C_HEADER`), cannot hide it in Clang's resource dir.587configure_file(588 ${FLANG_SOURCE_DIR}/include/flang/ISO_Fortran_binding.h589 ${LLVM_RUNTIME_OUTPUT_INTDIR}/../include/flang/ISO_Fortran_binding.h COPYONLY)590 591# And also install it into the install area592get_clang_resource_dir(HEADER_INSTALL_DIR SUBDIR include)593install(594 FILES include/flang/ISO_Fortran_binding.h595 DESTINATION ${HEADER_INSTALL_DIR}596 COMPONENT flang-fortran-binding)597add_llvm_install_targets(install-flang-fortran-binding598 COMPONENT flang-fortran-binding)599