blob: e6ebd26203a1087c1da938e1aed73c4d5eba1ae2 [file] [log] [blame]
Louis Dionneafa1afd2020-04-22 15:15:051cmake_minimum_required(VERSION 3.13.4)
Tim Keithd45e6c72018-01-31 00:37:592
Raul Tambre480643a2021-01-10 12:11:353set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
Patrick McCormick6c16aa42020-02-25 23:22:144
Patrick McCormick6c16aa42020-02-25 23:22:145# Flang requires C++17.
6set(CMAKE_CXX_STANDARD 17)
7set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
8set(CMAKE_CXX_EXTENSIONS OFF)
9
10set(FLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
11
12if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE)
13 message(FATAL_ERROR "In-source builds are not allowed. \
14 Please create a directory and run cmake from there,\
15 passing the path to this source directory as the last argument.\
16 This process created the file `CMakeCache.txt' and the directory\
17 `CMakeFiles'. Please delete them.")
Stephane Chauveau8f6f23f2018-02-19 13:28:1218endif()
Patrick McCormick6c16aa42020-02-25 23:22:1419
Isuru Fernando9017b9c2020-07-14 15:59:2620option(FLANG_ENABLE_WERROR "Fail and stop building flang if a warning is triggered." OFF)
Isuru Fernando3862cbb2020-06-08 14:08:3521
Patrick McCormick6c16aa42020-02-25 23:22:1422# Check for a standalone build and configure as appropriate from
23# there.
24if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
Isuru Fernando3862cbb2020-06-08 14:08:3525 message("Building Flang as a standalone project.")
26 project(Flang)
sameeran joshifa5d4162020-06-22 04:54:2827 set(FLANG_STANDALONE_BUILD ON)
John Ericsondf31ff12022-01-19 06:45:0728else()
29 set(FLANG_STANDALONE_BUILD OFF)
30endif()
Patrick McCormick6c16aa42020-02-25 23:22:1431
John Ericsondf31ff12022-01-19 06:45:0732# Must go below project(..)
33include(GNUInstallDirs)
34
35if (FLANG_STANDALONE_BUILD)
Patrick McCormick6c16aa42020-02-25 23:22:1436 set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
37 if (NOT MSVC_IDE)
38 set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS}
39 CACHE BOOL "Enable assertions")
40 # Assertions follow llvm's configuration.
41 mark_as_advanced(LLVM_ENABLE_ASSERTIONS)
peter klausler9702fca2018-04-27 19:37:4742 endif()
Patrick McCormick6c16aa42020-02-25 23:22:1443
44 # We need a pre-built/installed version of LLVM.
Alfonso Gregorya2c319f2021-09-16 16:27:5345 find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}")
Diana Picusd4b88ac2020-09-03 11:39:2946 # If the user specifies a relative path to LLVM_DIR, the calls to include
47 # LLVM modules fail. Append the absolute path to LLVM_DIR instead.
48 get_filename_component(LLVM_DIR_ABSOLUTE ${LLVM_DIR} REALPATH)
49 list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR_ABSOLUTE})
Patrick McCormick6c16aa42020-02-25 23:22:1450
Andrzej Warzynski7b73ca32021-07-12 08:44:3851 # Users might specify a path to CLANG_DIR that's:
52 # * a full path, or
53 # * a path relative to the path of this script.
54 # Append the absolute path to CLANG_DIR so that find_package works in both
55 # cases.
56 get_filename_component(
57 CLANG_DIR_ABSOLUTE
58 ${CLANG_DIR}
59 REALPATH
60 ${CMAKE_CURRENT_SOURCE_DIR})
61 list(APPEND CMAKE_MODULE_PATH ${CLANG_DIR_ABSOLUTE})
Andrzej Warzynskiaf805682021-03-22 17:04:0162
Andrzej Warzynski7b73ca32021-07-12 08:44:3863 # TODO: Remove when libclangDriver is lifted out of Clang
64 find_package(Clang REQUIRED PATHS "${CLANG_DIR_ABSOLUTE}" NO_DEFAULT_PATH)
65 if (NOT Clang_FOUND)
66 message(FATAL_ERROR "Failed to find Clang")
Caroline Concatto257b2972020-09-11 09:17:3167 endif()
68
Patrick McCormick6c16aa42020-02-25 23:22:1469 # If LLVM links to zlib we need the imported targets so we can too.
70 if(LLVM_ENABLE_ZLIB)
71 find_package(ZLIB REQUIRED)
72 endif()
Isuru Fernando3862cbb2020-06-08 14:08:3573 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
Tim Keitha9795b62020-08-11 14:20:1374 if(CMAKE_COMPILER_IS_GNUCXX)
75 set(USE_NO_MAYBE_UNINITIALIZED 1)
76 endif()
Patrick McCormick6c16aa42020-02-25 23:22:1477
78 include(CMakeParseArguments)
79 include(AddLLVM)
80 include(HandleLLVMOptions)
81 include(VersionFromVCS)
Andrzej Warzynski787c4432021-08-20 10:25:1182 include(GetErrcMessages)
Patrick McCormick6c16aa42020-02-25 23:22:1483
Andrzej Warzynski7b73ca32021-07-12 08:44:3884 include(AddClang)
Andrzej Warzynski42e89ab2020-10-14 16:40:2985
Sourabh Singh Tomar6a7deff2021-02-10 12:53:1086 include(TableGen)
87 find_package(MLIR REQUIRED CONFIG)
88 # Use SYSTEM for the same reasons as for LLVM includes
89 include_directories(SYSTEM ${MLIR_INCLUDE_DIRS})
90 # If the user specifies a relative path to MLIR_DIR, the calls to include
91 # MLIR modules fail. Append the absolute path to MLIR_DIR instead.
92 get_filename_component(MLIR_DIR_ABSOLUTE ${MLIR_DIR} REALPATH)
93 list(APPEND CMAKE_MODULE_PATH ${MLIR_DIR_ABSOLUTE})
94 include(AddMLIR)
95 find_program(MLIR_TABLEGEN_EXE "mlir-tblgen" ${LLVM_TOOLS_BINARY_DIR}
96 NO_DEFAULT_PATH)
Patrick McCormick6c16aa42020-02-25 23:22:1497
Patrick McCormick6c16aa42020-02-25 23:22:1498 option(LLVM_INSTALL_TOOLCHAIN_ONLY
99 "Only include toolchain files in the 'install' target." OFF)
100 option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
101 "Set to ON to force using an old, unsupported host toolchain." OFF)
102
103
104 # Add LLVM include files as if they were SYSTEM because there are complex unused
105 # parameter issues that may or may not appear depending on the environments and
106 # compilers (ifdefs are involved). This allows warnings from LLVM headers to be
107 # ignored while keeping -Wunused-parameter a fatal error inside f18 code base.
108 # This may have to be fine-tuned if flang headers are consider part of this
109 # LLVM_INCLUDE_DIRS when merging in the monorepo (Warning from flang headers
110 # should not be suppressed).
111 include_directories(SYSTEM ${LLVM_INCLUDE_DIRS})
112 add_definitions(${LLVM_DEFINITIONS})
113
114 # LLVM's cmake configuration files currently sneak in a c++11 flag.
115 # We look for it here and remove it from Flang's compile flags to
116 # avoid some mixed compilation flangs (e.g. -std=c++11 ... -std=c++17).
117 if (DEFINED LLVM_CXX_STD)
118 message("LLVM configuration set a C++ standard: ${LLVM_CXX_STD}")
119 if (NOT LLVM_CXX_STD EQUAL "c++17")
120 message("Flang: Overriding LLVM's 'cxx_std' setting...")
121 message(" removing '-std=${LLVM_CXX_STD}'")
122 message(" CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'")
123 string(REPLACE " -std=${LLVM_CXX_STD}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
124 message(" [NEW] CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'")
125 endif()
126 endif()
127
128 link_directories("${LLVM_LIBRARY_DIR}")
129
130 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
131 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY
132 ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
133 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
134 ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
135
136 set(BACKEND_PACKAGE_STRING "LLVM ${LLVM_PACKAGE_VERSION}")
137 set(LLVM_EXTERNAL_LIT "${LLVM_TOOLS_BINARY_DIR}/llvm-lit" CACHE STRING "Command used to spawn lit")
138
139 option(FLANG_INCLUDE_TESTS
140 "Generate build targets for the Flang unit tests."
141 ON)
sameeran joshi93f602b2020-06-02 17:15:44142
Andrzej Warzynski787c4432021-08-20 10:25:11143 get_errc_messages(LLVM_LIT_ERRC_MESSAGES)
144
sameeran joshi93f602b2020-06-02 17:15:44145#Handle unittests when out-of-tree
146#LLVM_BUILD_MAIN_SRC_DIR - Path to llvm source when out-of-tree.
147 set(FLANG_GTEST_AVAIL 0)
148 if (FLANG_INCLUDE_TESTS)
149 set(UNITTEST_DIR ${LLVM_BUILD_MAIN_SRC_DIR}/utils/unittest)
150 if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h)
Stella Laurenzo38151a02022-03-04 20:08:04151 if (NOT TARGET llvm_gtest)
152 add_library(llvm_gtest
sameeran joshi93f602b2020-06-02 17:15:44153 ${UNITTEST_DIR}/googletest/src/gtest-all.cc
154 ${UNITTEST_DIR}/googlemock/src/gmock-all.cc
155 )
Stella Laurenzo38151a02022-03-04 20:08:04156 target_include_directories(llvm_gtest
sameeran joshi93f602b2020-06-02 17:15:44157 PUBLIC
158 "${UNITTEST_DIR}/googletest/include"
159 "${UNITTEST_DIR}/googlemock/include"
160
161 PRIVATE
162 "${UNITTEST_DIR}/googletest"
163 "${UNITTEST_DIR}/googlemock"
164 )
165 find_package(Threads)
Stella Laurenzo38151a02022-03-04 20:08:04166 target_link_libraries(llvm_gtest PUBLIC Threads::Threads)
167 add_library(llvm_gtest_main ${UNITTEST_DIR}/UnitTestMain/TestMain.cpp)
168 target_link_libraries(gtest_main PUBLIC llvm_gtest)
sameeran joshi93f602b2020-06-02 17:15:44169 endif()
170 set(FLANG_GTEST_AVAIL 1)
171 else()
172 message(WARNING
173 "Unit-tests will be skipped as LLVM install does not include google-test related headers and libraries.")
174 set(FLANG_GTEST_AVAIL 0)
175 endif()
176 endif()
177 if (FLANG_GTEST_AVAIL)
178 add_custom_target(check-all DEPENDS check-flang FlangUnitTests)
179 else()
180 add_custom_target(check-all DEPENDS check-flang )
181 endif()
sameeran joshi807fe052020-04-27 09:22:36182 if (LLVM_BUILD_DOCS)
183 add_custom_target(doxygen ALL)
184 endif()
185
Patrick McCormick6c16aa42020-02-25 23:22:14186else()
Patrick McCormick6c16aa42020-02-25 23:22:14187 option(FLANG_INCLUDE_TESTS
188 "Generate build targets for the Flang unit tests."
189 ${LLVM_INCLUDE_TESTS})
sameeran joshi93f602b2020-06-02 17:15:44190 set(FLANG_GTEST_AVAIL 1)
191
Andrzej Warzynski621681e2020-08-01 19:53:27192 if(FLANG_STANDALONE_BUILD)
193 set(FLANG_BINARY_DIR ${CMAKE_BINARY_DIR}/tools/flang)
194 else()
195 set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
196 endif()
197
Patrick McCormick6c16aa42020-02-25 23:22:14198 set(BACKEND_PACKAGE_STRING "${PACKAGE_STRING}")
Sourabh Singh Tomar6a7deff2021-02-10 12:53:10199 set(MLIR_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../mlir/include ) # --src-root
200 set(MLIR_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/../mlir/include ) # --includedir
201 set(MLIR_TABLEGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tools/mlir/include)
202 set(MLIR_TABLEGEN_EXE $<TARGET_FILE:mlir-tblgen>)
203 include_directories(SYSTEM ${MLIR_INCLUDE_DIR})
204 include_directories(SYSTEM ${MLIR_TABLEGEN_OUTPUT_DIR})
peter klausler9702fca2018-04-27 19:37:47205endif()
Tim Keith8e1c09e2021-03-15 15:02:58206set(FLANG_INTRINSIC_MODULES_DIR ${CMAKE_BINARY_DIR}/include/flang)
Renaud-K1e116162021-05-10 23:41:29207set(FLANG_INCLUDE_DIR ${FLANG_BINARY_DIR}/include)
Tim Keithe8707d32018-02-14 23:29:18208
Andrzej Warzynski7b73ca32021-07-12 08:44:38209# TODO: Remove when libclangDriver is lifted out of Clang
210if(FLANG_STANDALONE_BUILD)
211 set(CLANG_INCLUDE_DIR ${CLANG_INCLUDE_DIRS} )
212 # No need to specify TableGen output dir as that's embedded in CLANG_DIR
213else()
214 set(CLANG_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/../clang/include )
215 # Specify TableGen output dir for things like DiagnosticCommonKinds.inc,
216 # DiagnosticDriverKinds.inc (required for reporting diagnostics)
217 set(CLANG_TABLEGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tools/clang/include)
218 include_directories(SYSTEM ${CLANG_TABLEGEN_OUTPUT_DIR})
Caroline Concatto257b2972020-09-11 09:17:31219endif()
Andrzej Warzynski7b73ca32021-07-12 08:44:38220include_directories(SYSTEM ${CLANG_INCLUDE_DIR})
Caroline Concatto257b2972020-09-11 09:17:31221
Sourabh Singh Tomar6a7deff2021-02-10 12:53:10222# tco tool and FIR lib output directories
223if(FLANG_STANDALONE_BUILD)
224 set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin)
225 set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib)
Tim Keith1c9f8d42019-03-13 19:41:15226endif()
Sourabh Singh Tomar6a7deff2021-02-10 12:53:10227# Always build tco tool
228set(LLVM_BUILD_TOOLS ON)
Stephane Chauveau8f6f23f2018-02-19 13:28:12229
Patrick McCormick6c16aa42020-02-25 23:22:14230include_directories(BEFORE
231 ${FLANG_BINARY_DIR}/include
232 ${FLANG_SOURCE_DIR}/include)
peter klausler85ea49e2019-01-23 00:03:02233
John Ericsonb3af9fb2022-01-01 17:51:16234if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS)
235 set(LLVM_COMMON_CMAKE_UTILS ${FLANG_SOURCE_DIR}/../cmake)
236endif()
237
Shoaib Meenai30b7dfa2021-05-12 19:59:23238# Add Flang-centric modules to cmake path.
John Ericson5c3347a2021-04-04 17:02:18239list(INSERT CMAKE_MODULE_PATH 0
240 "${FLANG_SOURCE_DIR}/cmake/modules"
John Ericsonb3af9fb2022-01-01 17:51:16241 "${LLVM_COMMON_CMAKE_UTILS}/Modules"
John Ericson5c3347a2021-04-04 17:02:18242 )
Shoaib Meenai30b7dfa2021-05-12 19:59:23243include(AddFlang)
Patrick McCormick6c16aa42020-02-25 23:22:14244
245if (NOT DEFAULT_SYSROOT)
246 set(DEFAULT_SYSROOT "" CACHE PATH
247 "The <path> to use for the system root for all compiler invocations (--sysroot=<path>).")
Stephane Chauveau8f6f23f2018-02-19 13:28:12248endif()
249
Patrick McCormick6c16aa42020-02-25 23:22:14250if (NOT ENABLE_LINKER_BUILD_ID)
251 set(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld")
252endif()
253
254set(FLANG_DEFAULT_LINKER "" CACHE STRING
255 "Default linker to use (linker name or absolute path, empty for platform default)")
256
257set(FLANG_DEFAULT_RTLIB "" CACHE STRING
258 "Default Fortran runtime library to use (\"libFortranRuntime\"), leave empty for platform default.")
259
260if (NOT(FLANG_DEFAULT_RTLIB STREQUAL ""))
261 message(WARNING "Resetting Flang's default runtime library to use platform default.")
262 set(FLANG_DEFAULT_RTLIB "" CACHE STRING
263 "Default runtime library to use (empty for platform default)" FORCE)
264endif()
265
266
267
268set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
Patrick McCormick6c16aa42020-02-25 23:22:14269
270
271if (NOT DEFINED FLANG_VERSION_MAJOR)
272 set(FLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
273endif()
274
275if (NOT DEFINED FLANG_VERSION_MINOR)
276 set(FLANG_VERSION_MINOR ${LLVM_VERSION_MINOR})
277endif()
278
279if (NOT DEFINED FLANG_VERSION_PATCHLEVEL)
280 set(FLANG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH})
281endif()
282
283# Unlike PACKAGE_VERSION, FLANG_VERSION does not include LLVM_VERSION_SUFFIX.
Stephane Chauveau8f6f23f2018-02-19 13:28:12284set(FLANG_VERSION "${FLANG_VERSION_MAJOR}.${FLANG_VERSION_MINOR}.${FLANG_VERSION_PATCHLEVEL}")
Patrick McCormick6c16aa42020-02-25 23:22:14285message(STATUS "Flang version: ${FLANG_VERSION}")
286# Flang executable version information
287set(FLANG_EXECUTABLE_VERSION
288 "${FLANG_VERSION_MAJOR}" CACHE STRING
289 "Major version number to appended to the flang executable name.")
290set(LIBFLANG_LIBRARY_VERSION
291 "${FLANG_VERSION_MAJOR}" CACHE STRING
292 "Major version number to appended to the libflang library.")
Stephane Chauveau8f6f23f2018-02-19 13:28:12293
Patrick McCormick6c16aa42020-02-25 23:22:14294mark_as_advanced(FLANG_EXECUTABLE_VERSION LIBFLANG_LIBRARY_VERSION)
Stephane Chauveau8f6f23f2018-02-19 13:28:12295
Patrick McCormick6c16aa42020-02-25 23:22:14296set(FLANG_VENDOR ${PACKAGE_VENDOR} CACHE STRING
297 "Vendor-specific Flang version information.")
298set(FLANG_VENDOR_UTI "org.llvm.flang" CACHE STRING
299 "Vendor-specific uti.")
Stephane Chauveau8f6f23f2018-02-19 13:28:12300
Patrick McCormick6c16aa42020-02-25 23:22:14301if (FLANG_VENDOR)
302 add_definitions(-DFLANG_VENDOR="${FLANG_VENDOR} ")
303endif()
peter klausler57f41862018-06-14 20:43:02304
Patrick McCormick6c16aa42020-02-25 23:22:14305set(FLANG_REPOSITORY_STRING "" CACHE STRING
306 "Vendor-specific text for showing the repository the source is taken from.")
307if (FLANG_REPOSITORY_STRING)
308 add_definitions(-DFLANG_REPOSITORY_STRING="${FLANG_REPOSITORY_STRING}")
309endif()
Stephane Chauveau8f6f23f2018-02-19 13:28:12310
Michael Kruse84e12582021-09-03 19:48:40311include(TestBigEndian)
312test_big_endian(IS_BIGENDIAN)
313if (IS_BIGENDIAN)
314 add_compile_definitions(FLANG_BIG_ENDIAN=1)
315else ()
316 add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
317endif ()
318
Patrick McCormick6c16aa42020-02-25 23:22:14319# Configure Flang's Version.inc file.
320configure_file(
321 ${CMAKE_CURRENT_SOURCE_DIR}/include/flang/Version.inc.in
322 ${CMAKE_CURRENT_BINARY_DIR}/include/flang/Version.inc)
323# Configure Flang's version info header file.
Stephane Chauveau8f6f23f2018-02-19 13:28:12324configure_file(
325 ${FLANG_SOURCE_DIR}/include/flang/Config/config.h.cmake
326 ${FLANG_BINARY_DIR}/include/flang/Config/config.h)
Patrick McCormick6c16aa42020-02-25 23:22:14327
Isuru Fernando3862cbb2020-06-08 14:08:35328if (FLANG_ENABLE_WERROR)
329 # The following is taken from llvm/cmake/modules/HandleLLVMOptions.cmake
330 # Keep this up-to-date with that file
331 if( MSVC )
332 append("/WX" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
333 endif()
334 if ( LLVM_COMPILER_IS_GCC_COMPATIBLE )
335 append("-Werror" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
336 append("-Wno-error" CMAKE_REQUIRED_FLAGS)
337 endif( LLVM_COMPILER_IS_GCC_COMPATIBLE )
Isuru Fernando3862cbb2020-06-08 14:08:35338endif()
Patrick McCormick6c16aa42020-02-25 23:22:14339
340# Builtin check_cxx_compiler_flag doesn't seem to work correctly
341macro(check_compiler_flag flag resultVar)
342 unset(${resultVar} CACHE)
343 check_cxx_compiler_flag("${flag}" ${resultVar})
344endmacro()
345
346check_compiler_flag("-Werror -Wno-deprecated-copy" CXX_SUPPORTS_NO_DEPRECATED_COPY_FLAG)
347if (CXX_SUPPORTS_NO_DEPRECATED_COPY_FLAG)
Isuru Fernando3862cbb2020-06-08 14:08:35348 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-copy")
Patrick McCormick6c16aa42020-02-25 23:22:14349endif()
350check_compiler_flag("-Wstring-conversion" CXX_SUPPORTS_NO_STRING_CONVERSION_FLAG)
351if (CXX_SUPPORTS_NO_STRING_CONVERSION_FLAG)
Isuru Fernando3862cbb2020-06-08 14:08:35352 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-string-conversion")
Patrick McCormick6c16aa42020-02-25 23:22:14353endif()
354
355# Add appropriate flags for GCC
356if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
357
358 if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
359 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing -fno-semantic-interposition")
360 else()
361 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-command-line-argument -Wstring-conversion \
362 -Wcovered-switch-default")
363 endif() # Clang.
364
365 check_cxx_compiler_flag("-Werror -Wnested-anon-types" CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG)
366 if (CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG)
367 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nested-anon-types")
368 endif()
369
David Truby81bf1e22020-05-29 13:03:21370 # Add to build type flags.
Patrick McCormick6c16aa42020-02-25 23:22:14371 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUGF18")
David Truby81bf1e22020-05-29 13:03:21372 set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -DCHECK=\"(void)\"")
Patrick McCormick6c16aa42020-02-25 23:22:14373
374 # Building shared libraries is bad for performance with GCC by default
375 # due to the need to preserve the right to override external entry points
376 if (BUILD_SHARED_LIBS AND NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
377 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-semantic-interposition")
378 endif()
379
380endif()
381
382list(REMOVE_DUPLICATES CMAKE_CXX_FLAGS)
383
384# Determine HOST_LINK_VERSION on Darwin.
385set(HOST_LINK_VERSION)
386if (APPLE)
387 set(LD_V_OUTPUT)
388 execute_process(
389 COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1"
390 RESULT_VARIABLE HAD_ERROR
391 OUTPUT_VARIABLE LD_V_OUTPUT)
392 if (NOT HAD_ERROR)
393 if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*")
394 string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
395 elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*")
396 string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
397 endif()
398 else()
399 message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}")
400 endif()
401endif()
402
403include(CMakeParseArguments)
404include(AddFlang)
405
Andrzej Warzynskic1f068b2021-07-01 08:27:31406
Patrick McCormick6c16aa42020-02-25 23:22:14407add_subdirectory(include)
408add_subdirectory(lib)
409add_subdirectory(cmake/modules)
410
411option(FLANG_BUILD_TOOLS
412 "Build the Flang tools. If OFF, just generate build targets." ON)
413if (FLANG_BUILD_TOOLS)
414 add_subdirectory(tools)
415endif()
416add_subdirectory(runtime)
Stuart Ellisf52fc592021-08-12 10:42:08417
418option(FLANG_BUILD_EXAMPLES "Build Flang example programs by default." OFF)
Andrzej Warzynski8150c1b2021-08-12 16:11:54419if (FLANG_BUILD_EXAMPLES AND FLANG_STANDALONE_BUILD)
420 message(FATAL_ERROR "Examples are not supported in out-of-tree builds.")
421endif()
Andrzej Warzynski062644b2021-06-16 08:00:50422add_subdirectory(examples)
Patrick McCormick6c16aa42020-02-25 23:22:14423
424if (FLANG_INCLUDE_TESTS)
Patrick McCormick6c16aa42020-02-25 23:22:14425 add_subdirectory(test)
sameeran joshi93f602b2020-06-02 17:15:44426 if (FLANG_GTEST_AVAIL)
427 add_subdirectory(unittests)
428 endif ()
Patrick McCormick6c16aa42020-02-25 23:22:14429endif()
430
sameeran joshi807fe052020-04-27 09:22:36431option(FLANG_INCLUDE_DOCS "Generate build targets for the Flang docs."
432 ${LLVM_INCLUDE_DOCS})
433if (FLANG_INCLUDE_DOCS)
434 add_subdirectory(docs)
435endif()
Patrick McCormick6c16aa42020-02-25 23:22:14436
437# Custom target to install Flang libraries.
438add_custom_target(flang-libraries)
439set_target_properties(flang-libraries PROPERTIES FOLDER "Misc")
440
441if (NOT LLVM_ENABLE_IDE)
442 add_llvm_install_targets(install-flang-libraries
443 DEPENDS flang-libraries
444 COMPONENT flang-libraries)
445endif()
446
447get_property(FLANG_LIBS GLOBAL PROPERTY FLANG_LIBS)
448if (FLANG_LIBS)
449 list(REMOVE_DUPLICATES FLANG_LIBS)
450 foreach(lib ${FLANG_LIBS})
451 add_dependencies(flang-libraries ${lib})
452 if (NOT LLVM_ENABLE_IDE)
453 add_dependencies(install-flang-libraries install-${lib})
454 endif()
455 endforeach()
456endif()
457
458if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
459 install(DIRECTORY include/flang
John Ericson5c3347a2021-04-04 17:02:18460 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
Patrick McCormick6c16aa42020-02-25 23:22:14461 COMPONENT flang-headers
462 FILES_MATCHING
463 PATTERN "*.def"
464 PATTERN "*.h"
465 PATTERN "*.inc"
466 PATTERN "*.td"
467 PATTERN "config.h" EXCLUDE
468 PATTERN ".git" EXCLUDE
469 PATTERN "CMakeFiles" EXCLUDE)
Stella Laurenzo38151a02022-03-04 20:08:04470
Renaud-K1e116162021-05-10 23:41:29471 install(DIRECTORY ${FLANG_INCLUDE_DIR}/flang
John Ericson5c3347a2021-04-04 17:02:18472 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
Renaud-K1e116162021-05-10 23:41:29473 COMPONENT flang-headers
474 FILES_MATCHING
475 PATTERN "*.inc"
476 )
Patrick McCormick6c16aa42020-02-25 23:22:14477endif()