brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.2 KiB · c01eb56 Raw
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