[mlir][sparse] add asserts on reading in tensor data
[lldb.git] / flang / CMakeLists.txt
1 cmake_minimum_required(VERSION 3.13.4)
2
3 set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
4
5 option(LINK_WITH_FIR "Link driver with FIR and LLVM" ON)
6 option(FLANG_BUILD_NEW_DRIVER "Build the flang compiler driver" OFF)
7
8 # Flang requires C++17.
9 set(CMAKE_CXX_STANDARD 17)
10 set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
11 set(CMAKE_CXX_EXTENSIONS OFF)
12
13 set(FLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
14
15 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE)
16   message(FATAL_ERROR "In-source builds are not allowed. \
17           Please create a directory and run cmake from there,\
18           passing the path to this source directory as the last argument.\
19           This process created the file `CMakeCache.txt' and the directory\
20           `CMakeFiles'. Please delete them.")
21 endif()
22
23 # Add Flang-centric modules to cmake path.
24 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
25 include(AddFlang)
26
27 option(FLANG_ENABLE_WERROR "Fail and stop building flang if a warning is triggered." OFF)
28
29 # Check for a standalone build and configure as appropriate from
30 # there.
31 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
32   message("Building Flang as a standalone project.")
33   project(Flang)
34   set(FLANG_STANDALONE_BUILD ON)
35
36   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)
42   endif()
43
44   # We need a pre-built/installed version of LLVM.
45   find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_PATH}")
46   # 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})
50
51   if(FLANG_BUILD_NEW_DRIVER)
52     # TODO: Remove when libclangDriver is lifted out of Clang
53     list(APPEND CMAKE_MODULE_PATH ${CLANG_DIR})
54     find_package(Clang REQUIRED HINTS "${CLANG_DIR}")
55   endif()
56
57   # If LLVM links to zlib we need the imported targets so we can too.
58   if(LLVM_ENABLE_ZLIB)
59     find_package(ZLIB REQUIRED)
60   endif()
61   option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
62   if(CMAKE_COMPILER_IS_GNUCXX)
63     set(USE_NO_MAYBE_UNINITIALIZED 1)
64   endif()
65
66   include(CMakeParseArguments)
67   include(AddLLVM)
68   include(HandleLLVMOptions)
69   include(VersionFromVCS)
70
71   if(FLANG_BUILD_NEW_DRIVER)
72     include(AddClang)
73   endif()
74
75   if(LINK_WITH_FIR)
76     include(TableGen)
77     find_package(MLIR REQUIRED CONFIG)
78     # Use SYSTEM for the same reasons as for LLVM includes
79     include_directories(SYSTEM ${MLIR_INCLUDE_DIRS})
80     # If the user specifies a relative path to MLIR_DIR, the calls to include
81     # MLIR modules fail. Append the absolute path to MLIR_DIR instead.
82     get_filename_component(MLIR_DIR_ABSOLUTE ${MLIR_DIR} REALPATH)
83     list(APPEND CMAKE_MODULE_PATH ${MLIR_DIR_ABSOLUTE})
84     include(AddMLIR)
85     find_program(MLIR_TABLEGEN_EXE "mlir-tblgen" ${LLVM_TOOLS_BINARY_DIR}
86       NO_DEFAULT_PATH)
87   endif()
88
89   option(LLVM_INSTALL_TOOLCHAIN_ONLY
90     "Only include toolchain files in the 'install' target." OFF)
91   option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
92     "Set to ON to force using an old, unsupported host toolchain." OFF)
93
94
95   # Add LLVM include files as if they were SYSTEM because there are complex unused
96   # parameter issues that may or may not appear depending on the environments and
97   # compilers (ifdefs are involved). This allows warnings from LLVM headers to be
98   # ignored while keeping -Wunused-parameter a fatal error inside f18 code base.
99   # This may have to be fine-tuned if flang headers are consider part of this
100   # LLVM_INCLUDE_DIRS when merging in the monorepo (Warning from flang headers
101   # should not be suppressed).
102   include_directories(SYSTEM ${LLVM_INCLUDE_DIRS})
103   add_definitions(${LLVM_DEFINITIONS})
104
105   # LLVM's cmake configuration files currently sneak in a c++11 flag.
106   # We look for it here and remove it from Flang's compile flags to
107   # avoid some mixed compilation flangs (e.g. -std=c++11 ... -std=c++17).
108   if (DEFINED LLVM_CXX_STD)
109     message("LLVM configuration set a C++ standard: ${LLVM_CXX_STD}")
110     if (NOT LLVM_CXX_STD EQUAL "c++17")
111       message("Flang: Overriding LLVM's 'cxx_std' setting...")
112       message("    removing '-std=${LLVM_CXX_STD}'")
113       message("    CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'")
114       string(REPLACE " -std=${LLVM_CXX_STD}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
115       message("    [NEW] CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'")
116     endif()
117   endif()
118
119   link_directories("${LLVM_LIBRARY_DIR}")
120
121   set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
122   set(CMAKE_LIBRARY_OUTPUT_DIRECTORY
123     ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
124   set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
125     ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
126
127   set(BACKEND_PACKAGE_STRING "LLVM ${LLVM_PACKAGE_VERSION}")
128   set(LLVM_EXTERNAL_LIT "${LLVM_TOOLS_BINARY_DIR}/llvm-lit" CACHE STRING "Command used to spawn lit")
129
130   option(FLANG_INCLUDE_TESTS
131          "Generate build targets for the Flang unit tests."
132          ON)
133
134 #Handle unittests when out-of-tree
135 #LLVM_BUILD_MAIN_SRC_DIR - Path to llvm source when out-of-tree.
136   set(FLANG_GTEST_AVAIL 0)
137   if (FLANG_INCLUDE_TESTS)
138     set(UNITTEST_DIR ${LLVM_BUILD_MAIN_SRC_DIR}/utils/unittest)
139     if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h)
140       if (NOT TARGET gtest)
141         add_library(gtest
142           ${UNITTEST_DIR}/googletest/src/gtest-all.cc
143           ${UNITTEST_DIR}/googlemock/src/gmock-all.cc
144           )
145         target_include_directories(gtest
146           PUBLIC
147           "${UNITTEST_DIR}/googletest/include"
148           "${UNITTEST_DIR}/googlemock/include"
149
150           PRIVATE
151           "${UNITTEST_DIR}/googletest"
152           "${UNITTEST_DIR}/googlemock"
153           )
154          find_package(Threads)
155          target_link_libraries(gtest PUBLIC Threads::Threads)
156         add_library(gtest_main ${UNITTEST_DIR}/UnitTestMain/TestMain.cpp)
157         target_link_libraries(gtest_main PUBLIC gtest)
158       endif()
159       set(FLANG_GTEST_AVAIL 1)
160     else()
161       message(WARNING
162       "Unit-tests will be skipped as LLVM install does not include google-test related headers and libraries.")
163       set(FLANG_GTEST_AVAIL 0)
164     endif()
165   endif()
166   if (FLANG_GTEST_AVAIL)
167     add_custom_target(check-all DEPENDS check-flang FlangUnitTests)
168   else()
169     add_custom_target(check-all DEPENDS check-flang )
170   endif()
171   if (LLVM_BUILD_DOCS)
172     add_custom_target(doxygen ALL)
173   endif()
174
175 else()
176   set(FLANG_STANDALONE_BUILD OFF)
177   option(FLANG_INCLUDE_TESTS
178          "Generate build targets for the Flang unit tests."
179          ${LLVM_INCLUDE_TESTS})
180   set(FLANG_GTEST_AVAIL 1)
181
182   if(FLANG_STANDALONE_BUILD)
183     set(FLANG_BINARY_DIR ${CMAKE_BINARY_DIR}/tools/flang)
184   else()
185     set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
186   endif()
187
188   set(BACKEND_PACKAGE_STRING "${PACKAGE_STRING}")
189   if (LINK_WITH_FIR)
190     set(MLIR_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../mlir/include ) # --src-root
191     set(MLIR_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/../mlir/include ) # --includedir
192     set(MLIR_TABLEGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tools/mlir/include)
193     set(MLIR_TABLEGEN_EXE $<TARGET_FILE:mlir-tblgen>)
194     include_directories(SYSTEM ${MLIR_INCLUDE_DIR})
195     include_directories(SYSTEM ${MLIR_TABLEGEN_OUTPUT_DIR})
196   endif()
197 endif()
198
199 if(FLANG_BUILD_NEW_DRIVER)
200     # TODO: Remove when libclangDriver is lifted out of Clang
201     if(FLANG_STANDALONE_BUILD)
202       set(CLANG_INCLUDE_DIR ${CLANG_INCLUDE_DIRS} )
203       # No need to specify TableGen output dir as that's embedded in CLANG_DIR
204     else()
205       set(CLANG_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/../clang/include )
206       # Specify TableGen output dir for things like DiagnosticCommonKinds.inc,
207       # DiagnosticDriverKinds.inc (required for reporting diagnostics)
208       set(CLANG_TABLEGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tools/clang/include)
209       include_directories(SYSTEM ${CLANG_TABLEGEN_OUTPUT_DIR})
210     endif()
211     include_directories(SYSTEM ${CLANG_INCLUDE_DIR})
212 endif()
213
214 if(LINK_WITH_FIR)
215   # tco tool and FIR lib output directories
216   if(FLANG_STANDALONE_BUILD)
217     set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin)
218     set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib)
219   endif()
220   # Always build tco tool
221   set(LLVM_BUILD_TOOLS ON)
222   set(LLVM_COMMON_COMPONENTS Support)
223   message(STATUS "Linking driver with FIR and LLVM, using LLVM components: ${LLVM_COMMON_COMPONENTS}")
224 endif()
225
226 # Add Flang-centric modules to cmake path.
227 include_directories(BEFORE
228   ${FLANG_BINARY_DIR}/include
229   ${FLANG_SOURCE_DIR}/include)
230
231 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
232
233 if (NOT DEFAULT_SYSROOT)
234   set(DEFAULT_SYSROOT "" CACHE PATH
235     "The <path> to use for the system root for all compiler invocations (--sysroot=<path>).")
236 endif()
237
238 if (NOT ENABLE_LINKER_BUILD_ID)
239   set(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld")
240 endif()
241
242 set(FLANG_DEFAULT_LINKER "" CACHE STRING
243   "Default linker to use (linker name or absolute path, empty for platform default)")
244
245 set(FLANG_DEFAULT_RTLIB "" CACHE STRING
246    "Default Fortran runtime library to use (\"libFortranRuntime\"), leave empty for platform default.")
247
248 if (NOT(FLANG_DEFAULT_RTLIB STREQUAL ""))
249   message(WARNING "Resetting Flang's default runtime library to use platform default.")
250   set(FLANG_DEFAULT_RTLIB "" CACHE STRING
251       "Default runtime library to use (empty for platform default)" FORCE)
252 endif()
253
254
255
256 set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
257
258
259 if (NOT DEFINED FLANG_VERSION_MAJOR)
260   set(FLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
261 endif()
262
263 if (NOT DEFINED FLANG_VERSION_MINOR)
264   set(FLANG_VERSION_MINOR ${LLVM_VERSION_MINOR})
265 endif()
266
267 if (NOT DEFINED FLANG_VERSION_PATCHLEVEL)
268   set(FLANG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH})
269 endif()
270
271 # Unlike PACKAGE_VERSION, FLANG_VERSION does not include LLVM_VERSION_SUFFIX.
272 set(FLANG_VERSION "${FLANG_VERSION_MAJOR}.${FLANG_VERSION_MINOR}.${FLANG_VERSION_PATCHLEVEL}")
273 message(STATUS "Flang version: ${FLANG_VERSION}")
274 # Flang executable version information
275 set(FLANG_EXECUTABLE_VERSION
276     "${FLANG_VERSION_MAJOR}" CACHE STRING
277     "Major version number to appended to the flang executable name.")
278 set(LIBFLANG_LIBRARY_VERSION
279     "${FLANG_VERSION_MAJOR}" CACHE STRING
280     "Major version number to appended to the libflang library.")
281
282 mark_as_advanced(FLANG_EXECUTABLE_VERSION LIBFLANG_LIBRARY_VERSION)
283
284 set(FLANG_VENDOR ${PACKAGE_VENDOR} CACHE STRING
285   "Vendor-specific Flang version information.")
286 set(FLANG_VENDOR_UTI "org.llvm.flang" CACHE STRING
287   "Vendor-specific uti.")
288
289 if (FLANG_VENDOR)
290   add_definitions(-DFLANG_VENDOR="${FLANG_VENDOR} ")
291 endif()
292
293 set(FLANG_REPOSITORY_STRING "" CACHE STRING
294   "Vendor-specific text for showing the repository the source is taken from.")
295 if (FLANG_REPOSITORY_STRING)
296   add_definitions(-DFLANG_REPOSITORY_STRING="${FLANG_REPOSITORY_STRING}")
297 endif()
298
299 # Configure Flang's Version.inc file.
300 configure_file(
301   ${CMAKE_CURRENT_SOURCE_DIR}/include/flang/Version.inc.in
302   ${CMAKE_CURRENT_BINARY_DIR}/include/flang/Version.inc)
303 # Configure Flang's version info header file.
304 configure_file(
305   ${FLANG_SOURCE_DIR}/include/flang/Config/config.h.cmake
306   ${FLANG_BINARY_DIR}/include/flang/Config/config.h)
307
308 if (FLANG_ENABLE_WERROR)
309   # The following is taken from llvm/cmake/modules/HandleLLVMOptions.cmake
310   # Keep this up-to-date with that file
311   if( MSVC )
312     append("/WX" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
313   endif()
314   if ( LLVM_COMPILER_IS_GCC_COMPATIBLE )
315     append("-Werror" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
316     append("-Wno-error" CMAKE_REQUIRED_FLAGS)
317   endif( LLVM_COMPILER_IS_GCC_COMPATIBLE )
318 endif()
319
320 # Builtin check_cxx_compiler_flag doesn't seem to work correctly
321 macro(check_compiler_flag flag resultVar)
322   unset(${resultVar} CACHE)
323   check_cxx_compiler_flag("${flag}" ${resultVar})
324 endmacro()
325
326 check_compiler_flag("-Werror -Wno-deprecated-copy" CXX_SUPPORTS_NO_DEPRECATED_COPY_FLAG)
327 if (CXX_SUPPORTS_NO_DEPRECATED_COPY_FLAG)
328   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-copy")
329 endif()
330 check_compiler_flag("-Wstring-conversion" CXX_SUPPORTS_NO_STRING_CONVERSION_FLAG)
331 if (CXX_SUPPORTS_NO_STRING_CONVERSION_FLAG)
332   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-string-conversion")
333 endif()
334
335 # Add appropriate flags for GCC
336 if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
337
338   if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
339     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing -fno-semantic-interposition")
340   else()
341     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-command-line-argument -Wstring-conversion \
342           -Wcovered-switch-default")
343   endif()  # Clang.
344
345   check_cxx_compiler_flag("-Werror -Wnested-anon-types" CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG)
346   if (CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG)
347     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nested-anon-types")
348   endif()
349
350   # Add to build type flags.
351   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUGF18")
352   set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -DCHECK=\"(void)\"")
353
354   # Building shared libraries is bad for performance with GCC by default
355   # due to the need to preserve the right to override external entry points
356   if (BUILD_SHARED_LIBS AND NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
357    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-semantic-interposition")
358   endif()
359
360 endif()
361
362 list(REMOVE_DUPLICATES CMAKE_CXX_FLAGS)
363
364 # Determine HOST_LINK_VERSION on Darwin.
365 set(HOST_LINK_VERSION)
366 if (APPLE)
367   set(LD_V_OUTPUT)
368   execute_process(
369     COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1"
370     RESULT_VARIABLE HAD_ERROR
371     OUTPUT_VARIABLE LD_V_OUTPUT)
372   if (NOT HAD_ERROR)
373     if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*")
374       string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
375     elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*")
376       string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
377     endif()
378   else()
379     message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}")
380   endif()
381 endif()
382
383 include(CMakeParseArguments)
384 include(AddFlang)
385
386
387 add_subdirectory(include)
388 add_subdirectory(lib)
389 add_subdirectory(cmake/modules)
390
391 option(FLANG_BUILD_TOOLS
392   "Build the Flang tools. If OFF, just generate build targets." ON)
393 if (FLANG_BUILD_TOOLS)
394   add_subdirectory(tools)
395 endif()
396 add_subdirectory(runtime)
397
398 if (FLANG_INCLUDE_TESTS)
399   add_subdirectory(test)
400   if (FLANG_GTEST_AVAIL)
401     add_subdirectory(unittests)
402   endif ()
403 endif()
404
405 option(FLANG_INCLUDE_DOCS "Generate build targets for the Flang docs."
406        ${LLVM_INCLUDE_DOCS})
407 if (FLANG_INCLUDE_DOCS)
408   add_subdirectory(docs)
409 endif()
410
411 # Custom target to install Flang libraries.
412 add_custom_target(flang-libraries)
413 set_target_properties(flang-libraries PROPERTIES FOLDER "Misc")
414
415 if (NOT LLVM_ENABLE_IDE)
416   add_llvm_install_targets(install-flang-libraries
417    DEPENDS flang-libraries
418    COMPONENT flang-libraries)
419 endif()
420
421 get_property(FLANG_LIBS GLOBAL PROPERTY FLANG_LIBS)
422 if (FLANG_LIBS)
423   list(REMOVE_DUPLICATES FLANG_LIBS)
424   foreach(lib ${FLANG_LIBS})
425     add_dependencies(flang-libraries ${lib})
426     if (NOT LLVM_ENABLE_IDE)
427       add_dependencies(install-flang-libraries install-${lib})
428     endif()
429   endforeach()
430 endif()
431
432 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
433   install(DIRECTORY include/flang
434     DESTINATION include
435     COMPONENT flang-headers
436     FILES_MATCHING
437     PATTERN "*.def"
438     PATTERN "*.h"
439     PATTERN "*.inc"
440     PATTERN "*.td"
441     PATTERN "config.h" EXCLUDE
442     PATTERN ".git"     EXCLUDE
443     PATTERN "CMakeFiles" EXCLUDE)
444 endif()