Mark de Wever | cbaa359 | 2023-05-24 16:12:32 | [diff] [blame] | 1 | cmake_minimum_required(VERSION 3.20.0) |
Tim Keith | d45e6c7 | 2018-01-31 00:37:59 | [diff] [blame] | 2 | |
Michał Górny | 9dd01a5 | 2022-10-24 04:31:37 | [diff] [blame] | 3 | if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) |
| 4 | set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) |
| 5 | endif() |
| 6 | include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake |
| 7 | NO_POLICY_SCOPE) |
| 8 | |
Raul Tambre | 480643a | 2021-01-10 12:11:35 | [diff] [blame] | 9 | set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON) |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 10 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 11 | # Flang requires C++17. |
| 12 | set(CMAKE_CXX_STANDARD 17) |
| 13 | set(CMAKE_CXX_STANDARD_REQUIRED TRUE) |
| 14 | set(CMAKE_CXX_EXTENSIONS OFF) |
| 15 | |
Patrick McCormick | f7e58c9 | 2023-04-26 19:49:58 | [diff] [blame] | 16 | if (LLVM_ENABLE_EH) |
| 17 | # To match with the flang guidelines we currently disable |
| 18 | # building with exception support in core LLVM. |
| 19 | message(FATAL_ERROR "Flang does not currently support building with \ |
| 20 | LLVM exceptions enabled. Please disable LLVM_ENABLE_EH when building \ |
| 21 | flang.") |
| 22 | endif() |
| 23 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 24 | set(FLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) |
| 25 | |
| 26 | if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE) |
| 27 | message(FATAL_ERROR "In-source builds are not allowed. \ |
| 28 | Please create a directory and run cmake from there,\ |
| 29 | passing the path to this source directory as the last argument.\ |
| 30 | This process created the file `CMakeCache.txt' and the directory\ |
| 31 | `CMakeFiles'. Please delete them.") |
Stephane Chauveau | 8f6f23f | 2018-02-19 13:28:12 | [diff] [blame] | 32 | endif() |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 33 | |
Isuru Fernando | 9017b9c | 2020-07-14 15:59:26 | [diff] [blame] | 34 | option(FLANG_ENABLE_WERROR "Fail and stop building flang if a warning is triggered." OFF) |
Isuru Fernando | 3862cbb | 2020-06-08 14:08:35 | [diff] [blame] | 35 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 36 | # Check for a standalone build and configure as appropriate from |
| 37 | # there. |
| 38 | if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) |
Isuru Fernando | 3862cbb | 2020-06-08 14:08:35 | [diff] [blame] | 39 | message("Building Flang as a standalone project.") |
| 40 | project(Flang) |
sameeran joshi | fa5d416 | 2020-06-22 04:54:28 | [diff] [blame] | 41 | set(FLANG_STANDALONE_BUILD ON) |
John Ericson | df31ff1 | 2022-01-19 06:45:07 | [diff] [blame] | 42 | else() |
| 43 | set(FLANG_STANDALONE_BUILD OFF) |
| 44 | endif() |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 45 | |
John Ericson | df31ff1 | 2022-01-19 06:45:07 | [diff] [blame] | 46 | # Must go below project(..) |
| 47 | include(GNUInstallDirs) |
| 48 | |
Muhammad Omair Javaid | c687c2c | 2022-11-30 11:28:13 | [diff] [blame] | 49 | # MSVC + clang-cl build requires clang_rt.builtin.${target} library |
| 50 | if (MSVC AND CMAKE_CXX_COMPILER_ID MATCHES Clang) |
| 51 | include(HandleCompilerRT) |
| 52 | find_compiler_rt_library(builtins CLANG_RT_BUILTINS_LIBRARY) |
| 53 | get_filename_component(LIBDIR "${CLANG_RT_BUILTINS_LIBRARY}" DIRECTORY) |
| 54 | if (IS_DIRECTORY "${LIBDIR}") |
| 55 | link_libraries(${CLANG_RT_BUILTINS_LIBRARY}) |
| 56 | endif() |
| 57 | endif() |
| 58 | |
Sylvestre Ledru | 8e20cb6 | 2023-01-06 16:12:03 | [diff] [blame] | 59 | if(CMAKE_SIZEOF_VOID_P EQUAL 4) |
| 60 | message(FATAL_ERROR "flang isn't supported on 32 bit CPUs") |
| 61 | endif() |
| 62 | |
John Ericson | df31ff1 | 2022-01-19 06:45:07 | [diff] [blame] | 63 | if (FLANG_STANDALONE_BUILD) |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 64 | set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) |
Hussain Kadhem | 287f201 | 2023-06-03 13:13:09 | [diff] [blame] | 65 | set(CMAKE_INCLUDE_CURRENT_DIR ON) |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 66 | if (NOT MSVC_IDE) |
| 67 | set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS} |
| 68 | CACHE BOOL "Enable assertions") |
| 69 | # Assertions follow llvm's configuration. |
| 70 | mark_as_advanced(LLVM_ENABLE_ASSERTIONS) |
peter klausler | 9702fca | 2018-04-27 19:37:47 | [diff] [blame] | 71 | endif() |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 72 | |
| 73 | # We need a pre-built/installed version of LLVM. |
Alfonso Gregory | a2c319f | 2021-09-16 16:27:53 | [diff] [blame] | 74 | find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}") |
Diana Picus | d4b88ac | 2020-09-03 11:39:29 | [diff] [blame] | 75 | # If the user specifies a relative path to LLVM_DIR, the calls to include |
| 76 | # LLVM modules fail. Append the absolute path to LLVM_DIR instead. |
| 77 | get_filename_component(LLVM_DIR_ABSOLUTE ${LLVM_DIR} REALPATH) |
| 78 | list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR_ABSOLUTE}) |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 79 | |
Andrzej Warzynski | 7b73ca3 | 2021-07-12 08:44:38 | [diff] [blame] | 80 | # Users might specify a path to CLANG_DIR that's: |
| 81 | # * a full path, or |
| 82 | # * a path relative to the path of this script. |
| 83 | # Append the absolute path to CLANG_DIR so that find_package works in both |
| 84 | # cases. |
| 85 | get_filename_component( |
| 86 | CLANG_DIR_ABSOLUTE |
| 87 | ${CLANG_DIR} |
| 88 | REALPATH |
| 89 | ${CMAKE_CURRENT_SOURCE_DIR}) |
| 90 | list(APPEND CMAKE_MODULE_PATH ${CLANG_DIR_ABSOLUTE}) |
Andrzej Warzynski | af80568 | 2021-03-22 17:04:01 | [diff] [blame] | 91 | |
Andrzej Warzynski | 7b73ca3 | 2021-07-12 08:44:38 | [diff] [blame] | 92 | # TODO: Remove when libclangDriver is lifted out of Clang |
| 93 | find_package(Clang REQUIRED PATHS "${CLANG_DIR_ABSOLUTE}" NO_DEFAULT_PATH) |
| 94 | if (NOT Clang_FOUND) |
| 95 | message(FATAL_ERROR "Failed to find Clang") |
Caroline Concatto | 257b297 | 2020-09-11 09:17:31 | [diff] [blame] | 96 | endif() |
| 97 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 98 | # If LLVM links to zlib we need the imported targets so we can too. |
| 99 | if(LLVM_ENABLE_ZLIB) |
| 100 | find_package(ZLIB REQUIRED) |
| 101 | endif() |
Isuru Fernando | 3862cbb | 2020-06-08 14:08:35 | [diff] [blame] | 102 | option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON) |
Tim Keith | a9795b6 | 2020-08-11 14:20:13 | [diff] [blame] | 103 | if(CMAKE_COMPILER_IS_GNUCXX) |
| 104 | set(USE_NO_MAYBE_UNINITIALIZED 1) |
| 105 | endif() |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 106 | |
| 107 | include(CMakeParseArguments) |
| 108 | include(AddLLVM) |
| 109 | include(HandleLLVMOptions) |
| 110 | include(VersionFromVCS) |
Andrzej Warzynski | 787c443 | 2021-08-20 10:25:11 | [diff] [blame] | 111 | include(GetErrcMessages) |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 112 | |
Andrzej Warzynski | 7b73ca3 | 2021-07-12 08:44:38 | [diff] [blame] | 113 | include(AddClang) |
Andrzej Warzynski | 42e89ab | 2020-10-14 16:40:29 | [diff] [blame] | 114 | |
Sourabh Singh Tomar | 6a7deff | 2021-02-10 12:53:10 | [diff] [blame] | 115 | include(TableGen) |
| 116 | find_package(MLIR REQUIRED CONFIG) |
| 117 | # Use SYSTEM for the same reasons as for LLVM includes |
| 118 | include_directories(SYSTEM ${MLIR_INCLUDE_DIRS}) |
| 119 | # If the user specifies a relative path to MLIR_DIR, the calls to include |
| 120 | # MLIR modules fail. Append the absolute path to MLIR_DIR instead. |
| 121 | get_filename_component(MLIR_DIR_ABSOLUTE ${MLIR_DIR} REALPATH) |
| 122 | list(APPEND CMAKE_MODULE_PATH ${MLIR_DIR_ABSOLUTE}) |
| 123 | include(AddMLIR) |
| 124 | find_program(MLIR_TABLEGEN_EXE "mlir-tblgen" ${LLVM_TOOLS_BINARY_DIR} |
| 125 | NO_DEFAULT_PATH) |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 126 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 127 | option(LLVM_INSTALL_TOOLCHAIN_ONLY |
| 128 | "Only include toolchain files in the 'install' target." OFF) |
Jonas Hahnfeld | 0b3c48d | 2023-05-17 08:28:58 | [diff] [blame] | 129 | option(LLVM_FORCE_USE_OLD_TOOLCHAIN |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 130 | "Set to ON to force using an old, unsupported host toolchain." OFF) |
| 131 | |
| 132 | |
| 133 | # Add LLVM include files as if they were SYSTEM because there are complex unused |
| 134 | # parameter issues that may or may not appear depending on the environments and |
| 135 | # compilers (ifdefs are involved). This allows warnings from LLVM headers to be |
| 136 | # ignored while keeping -Wunused-parameter a fatal error inside f18 code base. |
| 137 | # This may have to be fine-tuned if flang headers are consider part of this |
| 138 | # LLVM_INCLUDE_DIRS when merging in the monorepo (Warning from flang headers |
| 139 | # should not be suppressed). |
| 140 | include_directories(SYSTEM ${LLVM_INCLUDE_DIRS}) |
| 141 | add_definitions(${LLVM_DEFINITIONS}) |
| 142 | |
| 143 | # LLVM's cmake configuration files currently sneak in a c++11 flag. |
| 144 | # We look for it here and remove it from Flang's compile flags to |
| 145 | # avoid some mixed compilation flangs (e.g. -std=c++11 ... -std=c++17). |
| 146 | if (DEFINED LLVM_CXX_STD) |
| 147 | message("LLVM configuration set a C++ standard: ${LLVM_CXX_STD}") |
| 148 | if (NOT LLVM_CXX_STD EQUAL "c++17") |
| 149 | message("Flang: Overriding LLVM's 'cxx_std' setting...") |
| 150 | message(" removing '-std=${LLVM_CXX_STD}'") |
| 151 | message(" CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'") |
| 152 | string(REPLACE " -std=${LLVM_CXX_STD}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") |
| 153 | message(" [NEW] CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'") |
| 154 | endif() |
| 155 | endif() |
| 156 | |
| 157 | link_directories("${LLVM_LIBRARY_DIR}") |
| 158 | |
| 159 | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) |
| 160 | set(CMAKE_LIBRARY_OUTPUT_DIRECTORY |
John Ericson | e941b03 | 2022-08-19 02:44:46 | [diff] [blame] | 161 | ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}) |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 162 | set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY |
John Ericson | e941b03 | 2022-08-19 02:44:46 | [diff] [blame] | 163 | ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}) |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 164 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 165 | set(LLVM_EXTERNAL_LIT "${LLVM_TOOLS_BINARY_DIR}/llvm-lit" CACHE STRING "Command used to spawn lit") |
| 166 | |
| 167 | option(FLANG_INCLUDE_TESTS |
| 168 | "Generate build targets for the Flang unit tests." |
| 169 | ON) |
sameeran joshi | 93f602b | 2020-06-02 17:15:44 | [diff] [blame] | 170 | |
Andrzej Warzynski | 787c443 | 2021-08-20 10:25:11 | [diff] [blame] | 171 | get_errc_messages(LLVM_LIT_ERRC_MESSAGES) |
| 172 | |
sameeran joshi | 93f602b | 2020-06-02 17:15:44 | [diff] [blame] | 173 | #Handle unittests when out-of-tree |
sameeran joshi | 93f602b | 2020-06-02 17:15:44 | [diff] [blame] | 174 | set(FLANG_GTEST_AVAIL 0) |
| 175 | if (FLANG_INCLUDE_TESTS) |
Michał Górny | 58d1988 | 2022-11-23 12:19:47 | [diff] [blame] | 176 | set(UNITTEST_DIR ${LLVM_THIRD_PARTY_DIR}/unittest) |
sameeran joshi | 93f602b | 2020-06-02 17:15:44 | [diff] [blame] | 177 | if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h) |
Stella Laurenzo | 38151a0 | 2022-03-04 20:08:04 | [diff] [blame] | 178 | if (NOT TARGET llvm_gtest) |
Michał Górny | 02a2e18 | 2022-11-23 15:07:03 | [diff] [blame] | 179 | add_subdirectory(${UNITTEST_DIR} third-party/unittest) |
sameeran joshi | 93f602b | 2020-06-02 17:15:44 | [diff] [blame] | 180 | endif() |
| 181 | set(FLANG_GTEST_AVAIL 1) |
| 182 | else() |
| 183 | message(WARNING |
| 184 | "Unit-tests will be skipped as LLVM install does not include google-test related headers and libraries.") |
| 185 | set(FLANG_GTEST_AVAIL 0) |
| 186 | endif() |
| 187 | endif() |
| 188 | if (FLANG_GTEST_AVAIL) |
| 189 | add_custom_target(check-all DEPENDS check-flang FlangUnitTests) |
| 190 | else() |
| 191 | add_custom_target(check-all DEPENDS check-flang ) |
| 192 | endif() |
sameeran joshi | 807fe05 | 2020-04-27 09:22:36 | [diff] [blame] | 193 | if (LLVM_BUILD_DOCS) |
| 194 | add_custom_target(doxygen ALL) |
| 195 | endif() |
| 196 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 197 | else() |
| 198 | option(FLANG_INCLUDE_TESTS |
| 199 | "Generate build targets for the Flang unit tests." |
| 200 | ${LLVM_INCLUDE_TESTS}) |
sameeran joshi | 93f602b | 2020-06-02 17:15:44 | [diff] [blame] | 201 | set(FLANG_GTEST_AVAIL 1) |
| 202 | |
Andrzej Warzynski | 621681e | 2020-08-01 19:53:27 | [diff] [blame] | 203 | if(FLANG_STANDALONE_BUILD) |
| 204 | set(FLANG_BINARY_DIR ${CMAKE_BINARY_DIR}/tools/flang) |
| 205 | else() |
| 206 | set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) |
| 207 | endif() |
| 208 | |
Renaud-K | e2dd633 | 2022-11-02 23:02:04 | [diff] [blame] | 209 | set(MLIR_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../mlir ) # --src-root |
| 210 | set(MLIR_INCLUDE_DIR ${MLIR_MAIN_SRC_DIR}/include ) # --includedir |
Sourabh Singh Tomar | 6a7deff | 2021-02-10 12:53:10 | [diff] [blame] | 211 | set(MLIR_TABLEGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tools/mlir/include) |
Sourabh Singh Tomar | 6a7deff | 2021-02-10 12:53:10 | [diff] [blame] | 212 | include_directories(SYSTEM ${MLIR_INCLUDE_DIR}) |
| 213 | include_directories(SYSTEM ${MLIR_TABLEGEN_OUTPUT_DIR}) |
peter klausler | 9702fca | 2018-04-27 19:37:47 | [diff] [blame] | 214 | endif() |
John Ericson | 07b7498 | 2022-06-11 06:11:59 | [diff] [blame] | 215 | |
| 216 | set(FLANG_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH |
| 217 | "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')") |
| 218 | mark_as_advanced(FLANG_TOOLS_INSTALL_DIR) |
| 219 | |
Tim Keith | 8e1c09e | 2021-03-15 15:02:58 | [diff] [blame] | 220 | set(FLANG_INTRINSIC_MODULES_DIR ${CMAKE_BINARY_DIR}/include/flang) |
Renaud-K | 1e11616 | 2021-05-10 23:41:29 | [diff] [blame] | 221 | set(FLANG_INCLUDE_DIR ${FLANG_BINARY_DIR}/include) |
Tim Keith | e8707d3 | 2018-02-14 23:29:18 | [diff] [blame] | 222 | |
Andrzej Warzynski | 7b73ca3 | 2021-07-12 08:44:38 | [diff] [blame] | 223 | # TODO: Remove when libclangDriver is lifted out of Clang |
| 224 | if(FLANG_STANDALONE_BUILD) |
| 225 | set(CLANG_INCLUDE_DIR ${CLANG_INCLUDE_DIRS} ) |
| 226 | # No need to specify TableGen output dir as that's embedded in CLANG_DIR |
| 227 | else() |
| 228 | set(CLANG_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/../clang/include ) |
| 229 | # Specify TableGen output dir for things like DiagnosticCommonKinds.inc, |
| 230 | # DiagnosticDriverKinds.inc (required for reporting diagnostics) |
| 231 | set(CLANG_TABLEGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tools/clang/include) |
| 232 | include_directories(SYSTEM ${CLANG_TABLEGEN_OUTPUT_DIR}) |
Caroline Concatto | 257b297 | 2020-09-11 09:17:31 | [diff] [blame] | 233 | endif() |
Andrzej Warzynski | 7b73ca3 | 2021-07-12 08:44:38 | [diff] [blame] | 234 | include_directories(SYSTEM ${CLANG_INCLUDE_DIR}) |
Caroline Concatto | 257b297 | 2020-09-11 09:17:31 | [diff] [blame] | 235 | |
Sourabh Singh Tomar | 6a7deff | 2021-02-10 12:53:10 | [diff] [blame] | 236 | # tco tool and FIR lib output directories |
| 237 | if(FLANG_STANDALONE_BUILD) |
| 238 | set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin) |
| 239 | set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib) |
Tim Keith | 1c9f8d4 | 2019-03-13 19:41:15 | [diff] [blame] | 240 | endif() |
Sourabh Singh Tomar | 6a7deff | 2021-02-10 12:53:10 | [diff] [blame] | 241 | # Always build tco tool |
| 242 | set(LLVM_BUILD_TOOLS ON) |
Stephane Chauveau | 8f6f23f | 2018-02-19 13:28:12 | [diff] [blame] | 243 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 244 | include_directories(BEFORE |
| 245 | ${FLANG_BINARY_DIR}/include |
| 246 | ${FLANG_SOURCE_DIR}/include) |
peter klausler | 85ea49e | 2019-01-23 00:03:02 | [diff] [blame] | 247 | |
Shoaib Meenai | 30b7dfa | 2021-05-12 19:59:23 | [diff] [blame] | 248 | # Add Flang-centric modules to cmake path. |
John Ericson | 5c3347a | 2021-04-04 17:02:18 | [diff] [blame] | 249 | list(INSERT CMAKE_MODULE_PATH 0 |
| 250 | "${FLANG_SOURCE_DIR}/cmake/modules" |
John Ericson | b3af9fb | 2022-01-01 17:51:16 | [diff] [blame] | 251 | "${LLVM_COMMON_CMAKE_UTILS}/Modules" |
John Ericson | 5c3347a | 2021-04-04 17:02:18 | [diff] [blame] | 252 | ) |
Shoaib Meenai | 30b7dfa | 2021-05-12 19:59:23 | [diff] [blame] | 253 | include(AddFlang) |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 254 | |
| 255 | if (NOT DEFAULT_SYSROOT) |
| 256 | set(DEFAULT_SYSROOT "" CACHE PATH |
| 257 | "The <path> to use for the system root for all compiler invocations (--sysroot=<path>).") |
Stephane Chauveau | 8f6f23f | 2018-02-19 13:28:12 | [diff] [blame] | 258 | endif() |
| 259 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 260 | if (NOT ENABLE_LINKER_BUILD_ID) |
| 261 | set(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld") |
| 262 | endif() |
| 263 | |
| 264 | set(FLANG_DEFAULT_LINKER "" CACHE STRING |
| 265 | "Default linker to use (linker name or absolute path, empty for platform default)") |
| 266 | |
| 267 | set(FLANG_DEFAULT_RTLIB "" CACHE STRING |
| 268 | "Default Fortran runtime library to use (\"libFortranRuntime\"), leave empty for platform default.") |
| 269 | |
| 270 | if (NOT(FLANG_DEFAULT_RTLIB STREQUAL "")) |
| 271 | message(WARNING "Resetting Flang's default runtime library to use platform default.") |
| 272 | set(FLANG_DEFAULT_RTLIB "" CACHE STRING |
| 273 | "Default runtime library to use (empty for platform default)" FORCE) |
| 274 | endif() |
| 275 | |
| 276 | |
| 277 | |
| 278 | set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}") |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 279 | |
| 280 | |
| 281 | if (NOT DEFINED FLANG_VERSION_MAJOR) |
| 282 | set(FLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR}) |
| 283 | endif() |
| 284 | |
| 285 | if (NOT DEFINED FLANG_VERSION_MINOR) |
| 286 | set(FLANG_VERSION_MINOR ${LLVM_VERSION_MINOR}) |
| 287 | endif() |
| 288 | |
| 289 | if (NOT DEFINED FLANG_VERSION_PATCHLEVEL) |
| 290 | set(FLANG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH}) |
| 291 | endif() |
| 292 | |
| 293 | # Unlike PACKAGE_VERSION, FLANG_VERSION does not include LLVM_VERSION_SUFFIX. |
Stephane Chauveau | 8f6f23f | 2018-02-19 13:28:12 | [diff] [blame] | 294 | set(FLANG_VERSION "${FLANG_VERSION_MAJOR}.${FLANG_VERSION_MINOR}.${FLANG_VERSION_PATCHLEVEL}") |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 295 | message(STATUS "Flang version: ${FLANG_VERSION}") |
| 296 | # Flang executable version information |
| 297 | set(FLANG_EXECUTABLE_VERSION |
| 298 | "${FLANG_VERSION_MAJOR}" CACHE STRING |
| 299 | "Major version number to appended to the flang executable name.") |
| 300 | set(LIBFLANG_LIBRARY_VERSION |
| 301 | "${FLANG_VERSION_MAJOR}" CACHE STRING |
| 302 | "Major version number to appended to the libflang library.") |
Stephane Chauveau | 8f6f23f | 2018-02-19 13:28:12 | [diff] [blame] | 303 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 304 | mark_as_advanced(FLANG_EXECUTABLE_VERSION LIBFLANG_LIBRARY_VERSION) |
Stephane Chauveau | 8f6f23f | 2018-02-19 13:28:12 | [diff] [blame] | 305 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 306 | set(FLANG_VENDOR ${PACKAGE_VENDOR} CACHE STRING |
| 307 | "Vendor-specific Flang version information.") |
| 308 | set(FLANG_VENDOR_UTI "org.llvm.flang" CACHE STRING |
| 309 | "Vendor-specific uti.") |
Stephane Chauveau | 8f6f23f | 2018-02-19 13:28:12 | [diff] [blame] | 310 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 311 | if (FLANG_VENDOR) |
| 312 | add_definitions(-DFLANG_VENDOR="${FLANG_VENDOR} ") |
| 313 | endif() |
peter klausler | 57f4186 | 2018-06-14 20:43:02 | [diff] [blame] | 314 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 315 | set(FLANG_REPOSITORY_STRING "" CACHE STRING |
| 316 | "Vendor-specific text for showing the repository the source is taken from.") |
| 317 | if (FLANG_REPOSITORY_STRING) |
| 318 | add_definitions(-DFLANG_REPOSITORY_STRING="${FLANG_REPOSITORY_STRING}") |
| 319 | endif() |
Stephane Chauveau | 8f6f23f | 2018-02-19 13:28:12 | [diff] [blame] | 320 | |
Michael Kruse | 84e1258 | 2021-09-03 19:48:40 | [diff] [blame] | 321 | include(TestBigEndian) |
| 322 | test_big_endian(IS_BIGENDIAN) |
| 323 | if (IS_BIGENDIAN) |
| 324 | add_compile_definitions(FLANG_BIG_ENDIAN=1) |
| 325 | else () |
| 326 | add_compile_definitions(FLANG_LITTLE_ENDIAN=1) |
| 327 | endif () |
| 328 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 329 | # Configure Flang's Version.inc file. |
| 330 | configure_file( |
| 331 | ${CMAKE_CURRENT_SOURCE_DIR}/include/flang/Version.inc.in |
| 332 | ${CMAKE_CURRENT_BINARY_DIR}/include/flang/Version.inc) |
| 333 | # Configure Flang's version info header file. |
Stephane Chauveau | 8f6f23f | 2018-02-19 13:28:12 | [diff] [blame] | 334 | configure_file( |
| 335 | ${FLANG_SOURCE_DIR}/include/flang/Config/config.h.cmake |
| 336 | ${FLANG_BINARY_DIR}/include/flang/Config/config.h) |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 337 | |
Isuru Fernando | 3862cbb | 2020-06-08 14:08:35 | [diff] [blame] | 338 | if (FLANG_ENABLE_WERROR) |
| 339 | # The following is taken from llvm/cmake/modules/HandleLLVMOptions.cmake |
| 340 | # Keep this up-to-date with that file |
| 341 | if( MSVC ) |
| 342 | append("/WX" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) |
| 343 | endif() |
| 344 | if ( LLVM_COMPILER_IS_GCC_COMPATIBLE ) |
| 345 | append("-Werror" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) |
| 346 | append("-Wno-error" CMAKE_REQUIRED_FLAGS) |
| 347 | endif( LLVM_COMPILER_IS_GCC_COMPATIBLE ) |
Isuru Fernando | 3862cbb | 2020-06-08 14:08:35 | [diff] [blame] | 348 | endif() |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 349 | |
| 350 | # Builtin check_cxx_compiler_flag doesn't seem to work correctly |
| 351 | macro(check_compiler_flag flag resultVar) |
| 352 | unset(${resultVar} CACHE) |
| 353 | check_cxx_compiler_flag("${flag}" ${resultVar}) |
| 354 | endmacro() |
| 355 | |
| 356 | check_compiler_flag("-Werror -Wno-deprecated-copy" CXX_SUPPORTS_NO_DEPRECATED_COPY_FLAG) |
| 357 | if (CXX_SUPPORTS_NO_DEPRECATED_COPY_FLAG) |
Isuru Fernando | 3862cbb | 2020-06-08 14:08:35 | [diff] [blame] | 358 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-copy") |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 359 | endif() |
| 360 | check_compiler_flag("-Wstring-conversion" CXX_SUPPORTS_NO_STRING_CONVERSION_FLAG) |
| 361 | if (CXX_SUPPORTS_NO_STRING_CONVERSION_FLAG) |
Isuru Fernando | 3862cbb | 2020-06-08 14:08:35 | [diff] [blame] | 362 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-string-conversion") |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 363 | endif() |
David Blaikie | 357e99a | 2022-08-16 17:42:45 | [diff] [blame] | 364 | check_compiler_flag("-Wno-ctad-maybe-unsupported" CXX_SUPPORTS_NO_CTAD_MAYBE_UNSUPPORTED_FLAG) |
| 365 | if (CXX_SUPPORTS_NO_CTAD_MAYBE_UNSUPPORTED_FLAG) |
| 366 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-ctad-maybe-unsupported") |
| 367 | endif() |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 368 | |
| 369 | # Add appropriate flags for GCC |
| 370 | if (LLVM_COMPILER_IS_GCC_COMPATIBLE) |
| 371 | |
| 372 | if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") |
| 373 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing -fno-semantic-interposition") |
| 374 | else() |
| 375 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-command-line-argument -Wstring-conversion \ |
| 376 | -Wcovered-switch-default") |
| 377 | endif() # Clang. |
| 378 | |
| 379 | check_cxx_compiler_flag("-Werror -Wnested-anon-types" CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG) |
| 380 | if (CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG) |
| 381 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nested-anon-types") |
| 382 | endif() |
| 383 | |
David Truby | 81bf1e2 | 2020-05-29 13:03:21 | [diff] [blame] | 384 | # Add to build type flags. |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 385 | set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUGF18") |
David Truby | 81bf1e2 | 2020-05-29 13:03:21 | [diff] [blame] | 386 | set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -DCHECK=\"(void)\"") |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 387 | |
| 388 | # Building shared libraries is bad for performance with GCC by default |
| 389 | # due to the need to preserve the right to override external entry points |
| 390 | if (BUILD_SHARED_LIBS AND NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) |
| 391 | set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-semantic-interposition") |
| 392 | endif() |
| 393 | |
| 394 | endif() |
| 395 | |
| 396 | list(REMOVE_DUPLICATES CMAKE_CXX_FLAGS) |
| 397 | |
| 398 | # Determine HOST_LINK_VERSION on Darwin. |
| 399 | set(HOST_LINK_VERSION) |
| 400 | if (APPLE) |
| 401 | set(LD_V_OUTPUT) |
| 402 | execute_process( |
| 403 | COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1" |
| 404 | RESULT_VARIABLE HAD_ERROR |
| 405 | OUTPUT_VARIABLE LD_V_OUTPUT) |
| 406 | if (NOT HAD_ERROR) |
| 407 | if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*") |
| 408 | string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT}) |
| 409 | elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*") |
| 410 | string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT}) |
| 411 | endif() |
| 412 | else() |
| 413 | message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}") |
| 414 | endif() |
| 415 | endif() |
| 416 | |
| 417 | include(CMakeParseArguments) |
| 418 | include(AddFlang) |
| 419 | |
Renaud-K | ba65584 | 2022-11-02 22:39:58 | [diff] [blame] | 420 | if (FLANG_INCLUDE_TESTS) |
| 421 | add_compile_definitions(FLANG_INCLUDE_TESTS=1) |
| 422 | endif() |
Andrzej Warzynski | c1f068b | 2021-07-01 08:27:31 | [diff] [blame] | 423 | |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 424 | add_subdirectory(include) |
| 425 | add_subdirectory(lib) |
| 426 | add_subdirectory(cmake/modules) |
| 427 | |
| 428 | option(FLANG_BUILD_TOOLS |
| 429 | "Build the Flang tools. If OFF, just generate build targets." ON) |
| 430 | if (FLANG_BUILD_TOOLS) |
| 431 | add_subdirectory(tools) |
| 432 | endif() |
| 433 | add_subdirectory(runtime) |
Stuart Ellis | f52fc59 | 2021-08-12 10:42:08 | [diff] [blame] | 434 | |
Slava Zakharin | 1c5d121 | 2023-03-13 21:50:13 | [diff] [blame] | 435 | if (LLVM_INCLUDE_EXAMPLES) |
| 436 | add_subdirectory(examples) |
Andrzej Warzynski | 8150c1b | 2021-08-12 16:11:54 | [diff] [blame] | 437 | endif() |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 438 | |
| 439 | if (FLANG_INCLUDE_TESTS) |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 440 | add_subdirectory(test) |
sameeran joshi | 93f602b | 2020-06-02 17:15:44 | [diff] [blame] | 441 | if (FLANG_GTEST_AVAIL) |
| 442 | add_subdirectory(unittests) |
| 443 | endif () |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 444 | endif() |
| 445 | |
sameeran joshi | 807fe05 | 2020-04-27 09:22:36 | [diff] [blame] | 446 | option(FLANG_INCLUDE_DOCS "Generate build targets for the Flang docs." |
| 447 | ${LLVM_INCLUDE_DOCS}) |
| 448 | if (FLANG_INCLUDE_DOCS) |
| 449 | add_subdirectory(docs) |
| 450 | endif() |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 451 | |
| 452 | # Custom target to install Flang libraries. |
| 453 | add_custom_target(flang-libraries) |
| 454 | set_target_properties(flang-libraries PROPERTIES FOLDER "Misc") |
| 455 | |
| 456 | if (NOT LLVM_ENABLE_IDE) |
| 457 | add_llvm_install_targets(install-flang-libraries |
| 458 | DEPENDS flang-libraries |
| 459 | COMPONENT flang-libraries) |
| 460 | endif() |
| 461 | |
| 462 | get_property(FLANG_LIBS GLOBAL PROPERTY FLANG_LIBS) |
| 463 | if (FLANG_LIBS) |
| 464 | list(REMOVE_DUPLICATES FLANG_LIBS) |
| 465 | foreach(lib ${FLANG_LIBS}) |
| 466 | add_dependencies(flang-libraries ${lib}) |
| 467 | if (NOT LLVM_ENABLE_IDE) |
| 468 | add_dependencies(install-flang-libraries install-${lib}) |
| 469 | endif() |
| 470 | endforeach() |
| 471 | endif() |
| 472 | |
| 473 | if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) |
| 474 | install(DIRECTORY include/flang |
John Ericson | 5c3347a | 2021-04-04 17:02:18 | [diff] [blame] | 475 | DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 476 | COMPONENT flang-headers |
| 477 | FILES_MATCHING |
| 478 | PATTERN "*.def" |
| 479 | PATTERN "*.h" |
| 480 | PATTERN "*.inc" |
| 481 | PATTERN "*.td" |
| 482 | PATTERN "config.h" EXCLUDE |
| 483 | PATTERN ".git" EXCLUDE |
| 484 | PATTERN "CMakeFiles" EXCLUDE) |
Stella Laurenzo | 38151a0 | 2022-03-04 20:08:04 | [diff] [blame] | 485 | |
Renaud-K | 1e11616 | 2021-05-10 23:41:29 | [diff] [blame] | 486 | install(DIRECTORY ${FLANG_INCLUDE_DIR}/flang |
John Ericson | 5c3347a | 2021-04-04 17:02:18 | [diff] [blame] | 487 | DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" |
Renaud-K | 1e11616 | 2021-05-10 23:41:29 | [diff] [blame] | 488 | COMPONENT flang-headers |
| 489 | FILES_MATCHING |
| 490 | PATTERN "*.inc" |
| 491 | ) |
Patrick McCormick | 6c16aa4 | 2020-02-25 23:22:14 | [diff] [blame] | 492 | endif() |