Mercurial > hg > CbC > CbC_llvm
diff flang/CMakeLists.txt @ 173:0572611fdcc8 llvm10 llvm12
reorgnization done
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 11:55:54 +0900 |
parents | |
children | 2e18cbf3894f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flang/CMakeLists.txt Mon May 25 11:55:54 2020 +0900 @@ -0,0 +1,378 @@ +cmake_minimum_required(VERSION 3.9.0) + +# RPATH settings on macOS do not affect INSTALL_NAME. +if (POLICY CMP0068) + cmake_policy(SET CMP0068 NEW) + set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON) +endif() + +# Include file check macros honor CMAKE_REQUIRED_LIBRARIES. +if(POLICY CMP0075) + cmake_policy(SET CMP0075 NEW) +endif() + +# option() honors normal variables. +if (POLICY CMP0077) + cmake_policy(SET CMP0077 NEW) +endif() + +option(LINK_WITH_FIR "Link driver with FIR and LLVM" ON) + +# Flang requires C++17. +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED TRUE) +set(CMAKE_CXX_EXTENSIONS OFF) + +set(FLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE) + message(FATAL_ERROR "In-source builds are not allowed. \ + Please create a directory and run cmake from there,\ + passing the path to this source directory as the last argument.\ + This process created the file `CMakeCache.txt' and the directory\ + `CMakeFiles'. Please delete them.") +endif() + +# Add Flang-centric modules to cmake path. +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") +include(AddFlang) + +# Check for a standalone build and configure as appropriate from +# there. +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) +message("Building Flang as a standalone project.") +project(Flang) + + set(FLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) + if (NOT MSVC_IDE) + set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS} + CACHE BOOL "Enable assertions") + # Assertions follow llvm's configuration. + mark_as_advanced(LLVM_ENABLE_ASSERTIONS) + endif() + + # We need a pre-built/installed version of LLVM. + find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_PATH}") + list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR}) + + # If LLVM links to zlib we need the imported targets so we can too. + if(LLVM_ENABLE_ZLIB) + find_package(ZLIB REQUIRED) + endif() + + include(CMakeParseArguments) + include(AddLLVM) + include(HandleLLVMOptions) + include(VersionFromVCS) + + if(LINK_WITH_FIR) + include(TableGen) + find_package(MLIR REQUIRED CONFIG) + # Use SYSTEM for the same reasons as for LLVM includes + include_directories(SYSTEM ${MLIR_INCLUDE_DIRS}) + list(APPEND CMAKE_MODULE_PATH ${MLIR_DIR}) + include(AddMLIR) + find_program(MLIR_TABLEGEN_EXE "mlir-tblgen" ${LLVM_TOOLS_BINARY_DIR} + NO_DEFAULT_PATH) + endif() + + option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON) + option(LLVM_INSTALL_TOOLCHAIN_ONLY + "Only include toolchain files in the 'install' target." OFF) + option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN + "Set to ON to force using an old, unsupported host toolchain." OFF) + + + # Add LLVM include files as if they were SYSTEM because there are complex unused + # parameter issues that may or may not appear depending on the environments and + # compilers (ifdefs are involved). This allows warnings from LLVM headers to be + # ignored while keeping -Wunused-parameter a fatal error inside f18 code base. + # This may have to be fine-tuned if flang headers are consider part of this + # LLVM_INCLUDE_DIRS when merging in the monorepo (Warning from flang headers + # should not be suppressed). + include_directories(SYSTEM ${LLVM_INCLUDE_DIRS}) + add_definitions(${LLVM_DEFINITIONS}) + + # LLVM's cmake configuration files currently sneak in a c++11 flag. + # We look for it here and remove it from Flang's compile flags to + # avoid some mixed compilation flangs (e.g. -std=c++11 ... -std=c++17). + if (DEFINED LLVM_CXX_STD) + message("LLVM configuration set a C++ standard: ${LLVM_CXX_STD}") + if (NOT LLVM_CXX_STD EQUAL "c++17") + message("Flang: Overriding LLVM's 'cxx_std' setting...") + message(" removing '-std=${LLVM_CXX_STD}'") + message(" CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'") + string(REPLACE " -std=${LLVM_CXX_STD}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + message(" [NEW] CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}'") + endif() + endif() + + link_directories("${LLVM_LIBRARY_DIR}") + + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}) + + set(BACKEND_PACKAGE_STRING "LLVM ${LLVM_PACKAGE_VERSION}") + set(LLVM_EXTERNAL_LIT "${LLVM_TOOLS_BINARY_DIR}/llvm-lit" CACHE STRING "Command used to spawn lit") + + option(FLANG_INCLUDE_TESTS + "Generate build targets for the Flang unit tests." + ON) + add_custom_target(check-all DEPENDS check-flang) + if (LLVM_BUILD_DOCS) + add_custom_target(doxygen ALL) + endif() + +else() + option(FLANG_INCLUDE_TESTS + "Generate build targets for the Flang unit tests." + ${LLVM_INCLUDE_TESTS}) + set(FLANG_BINARY_DIR ${CMAKE_BINARY_DIR}/tools/flang) + set(BACKEND_PACKAGE_STRING "${PACKAGE_STRING}") + if (LINK_WITH_FIR) + set(MLIR_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../mlir/include ) # --src-root + set(MLIR_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/../mlir/include ) # --includedir + set(MLIR_TABLEGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/tools/mlir/include) + set(MLIR_TABLEGEN_EXE $<TARGET_FILE:mlir-tblgen>) + include_directories(SYSTEM ${MLIR_INCLUDE_DIR}) + include_directories(SYSTEM ${MLIR_TABLEGEN_OUTPUT_DIR}) + endif() +endif() + +if(LINK_WITH_FIR) + # tco tool and FIR lib output directories + set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin) + set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib) + # Always build tco tool + set(LLVM_BUILD_TOOLS ON) + message(STATUS "Linking driver with FIR and LLVM") + llvm_map_components_to_libnames(LLVM_COMMON_LIBS support) + message(STATUS "LLVM libraries: ${LLVM_COMMON_LIBS}") +endif() + +# Add Flang-centric modules to cmake path. +include_directories(BEFORE + ${FLANG_BINARY_DIR}/include + ${FLANG_SOURCE_DIR}/include) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") + +if (NOT DEFAULT_SYSROOT) + set(DEFAULT_SYSROOT "" CACHE PATH + "The <path> to use for the system root for all compiler invocations (--sysroot=<path>).") +endif() + +if (NOT ENABLE_LINKER_BUILD_ID) + set(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld") +endif() + +set(FLANG_DEFAULT_LINKER "" CACHE STRING + "Default linker to use (linker name or absolute path, empty for platform default)") + +set(FLANG_DEFAULT_RTLIB "" CACHE STRING + "Default Fortran runtime library to use (\"libFortranRuntime\"), leave empty for platform default.") + +if (NOT(FLANG_DEFAULT_RTLIB STREQUAL "")) + message(WARNING "Resetting Flang's default runtime library to use platform default.") + set(FLANG_DEFAULT_RTLIB "" CACHE STRING + "Default runtime library to use (empty for platform default)" FORCE) +endif() + + + +set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}") +# Override LLVM versioning for now... +set(FLANG_VERSION_MAJOR "0") +set(FLANG_VERSION_MINOR "1") +set(FLANG_VERSION_PATCHLEVEL "0") + + +if (NOT DEFINED FLANG_VERSION_MAJOR) + set(FLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR}) +endif() + +if (NOT DEFINED FLANG_VERSION_MINOR) + set(FLANG_VERSION_MINOR ${LLVM_VERSION_MINOR}) +endif() + +if (NOT DEFINED FLANG_VERSION_PATCHLEVEL) + set(FLANG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH}) +endif() + +# Unlike PACKAGE_VERSION, FLANG_VERSION does not include LLVM_VERSION_SUFFIX. +set(FLANG_VERSION "${FLANG_VERSION_MAJOR}.${FLANG_VERSION_MINOR}.${FLANG_VERSION_PATCHLEVEL}") +message(STATUS "Flang version: ${FLANG_VERSION}") +# Flang executable version information +set(FLANG_EXECUTABLE_VERSION + "${FLANG_VERSION_MAJOR}" CACHE STRING + "Major version number to appended to the flang executable name.") +set(LIBFLANG_LIBRARY_VERSION + "${FLANG_VERSION_MAJOR}" CACHE STRING + "Major version number to appended to the libflang library.") + +mark_as_advanced(FLANG_EXECUTABLE_VERSION LIBFLANG_LIBRARY_VERSION) + +set(FLANG_VENDOR ${PACKAGE_VENDOR} CACHE STRING + "Vendor-specific Flang version information.") +set(FLANG_VENDOR_UTI "org.llvm.flang" CACHE STRING + "Vendor-specific uti.") + +if (FLANG_VENDOR) + add_definitions(-DFLANG_VENDOR="${FLANG_VENDOR} ") +endif() + +set(FLANG_REPOSITORY_STRING "" CACHE STRING + "Vendor-specific text for showing the repository the source is taken from.") +if (FLANG_REPOSITORY_STRING) + add_definitions(-DFLANG_REPOSITORY_STRING="${FLANG_REPOSITORY_STRING}") +endif() + +# Configure Flang's Version.inc file. +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/include/flang/Version.inc.in + ${CMAKE_CURRENT_BINARY_DIR}/include/flang/Version.inc) +# Configure Flang's version info header file. +configure_file( + ${FLANG_SOURCE_DIR}/include/flang/Config/config.h.cmake + ${FLANG_BINARY_DIR}/include/flang/Config/config.h) + +# Add global F18 flags. +set(CMAKE_CXX_FLAGS "-fno-rtti -fno-exceptions -pedantic -Wall -Wextra -Werror -Wcast-qual -Wimplicit-fallthrough -Wdelete-non-virtual-dtor ${CMAKE_CXX_FLAGS}") + +# Builtin check_cxx_compiler_flag doesn't seem to work correctly +macro(check_compiler_flag flag resultVar) + unset(${resultVar} CACHE) + check_cxx_compiler_flag("${flag}" ${resultVar}) +endmacro() + +check_compiler_flag("-Werror -Wno-deprecated-copy" CXX_SUPPORTS_NO_DEPRECATED_COPY_FLAG) +if (CXX_SUPPORTS_NO_DEPRECATED_COPY_FLAG) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-copy") +endif() +check_compiler_flag("-Wstring-conversion" CXX_SUPPORTS_NO_STRING_CONVERSION_FLAG) +if (CXX_SUPPORTS_NO_STRING_CONVERSION_FLAG) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-string-conversion") +endif() + +# Add appropriate flags for GCC +if (LLVM_COMPILER_IS_GCC_COMPATIBLE) + + if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing -fno-semantic-interposition") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-command-line-argument -Wstring-conversion \ + -Wcovered-switch-default") + endif() # Clang. + + check_cxx_compiler_flag("-Werror -Wnested-anon-types" CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG) + if (CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nested-anon-types") + endif() + + # Add to or adjust build type flags. + # + # TODO: This needs some extra thought. CMake's default for release builds + # is -O3, which can cause build failures on certain platforms (and compilers) + # with the current code base -- some templated functions are inlined and don't + # become available at link time when using -O3 (with Clang under MacOS/darwin). + # If we reset CMake's default flags we also clobber any user provided settings; + # make it difficult to customize a build in this regard... The setup below + # has this side effect but enables successful builds across multiple platforms + # in release mode... + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUGF18") + set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -DCHECK=\"(void)\"") # do we need -O2 here? + set(CMAKE_CXX_FLAGS_RELEASE "-O2") + + # Building shared libraries is bad for performance with GCC by default + # due to the need to preserve the right to override external entry points + if (BUILD_SHARED_LIBS AND NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-semantic-interposition") + endif() + +endif() + +list(REMOVE_DUPLICATES CMAKE_CXX_FLAGS) + +# Determine HOST_LINK_VERSION on Darwin. +set(HOST_LINK_VERSION) +if (APPLE) + set(LD_V_OUTPUT) + execute_process( + COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1" + RESULT_VARIABLE HAD_ERROR + OUTPUT_VARIABLE LD_V_OUTPUT) + if (NOT HAD_ERROR) + if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*") + string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT}) + elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*") + string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT}) + endif() + else() + message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}") + endif() +endif() + +include(CMakeParseArguments) +include(AddFlang) + + +add_subdirectory(include) +add_subdirectory(lib) +add_subdirectory(cmake/modules) + +option(FLANG_BUILD_TOOLS + "Build the Flang tools. If OFF, just generate build targets." ON) +if (FLANG_BUILD_TOOLS) + add_subdirectory(tools) +endif() +add_subdirectory(runtime) + +if (FLANG_INCLUDE_TESTS) + enable_testing() + add_subdirectory(test) + add_subdirectory(unittests) +endif() + +option(FLANG_INCLUDE_DOCS "Generate build targets for the Flang docs." + ${LLVM_INCLUDE_DOCS}) +if (FLANG_INCLUDE_DOCS) + add_subdirectory(docs) +endif() + +# Custom target to install Flang libraries. +add_custom_target(flang-libraries) +set_target_properties(flang-libraries PROPERTIES FOLDER "Misc") + +if (NOT LLVM_ENABLE_IDE) + add_llvm_install_targets(install-flang-libraries + DEPENDS flang-libraries + COMPONENT flang-libraries) +endif() + +get_property(FLANG_LIBS GLOBAL PROPERTY FLANG_LIBS) +if (FLANG_LIBS) + list(REMOVE_DUPLICATES FLANG_LIBS) + foreach(lib ${FLANG_LIBS}) + add_dependencies(flang-libraries ${lib}) + if (NOT LLVM_ENABLE_IDE) + add_dependencies(install-flang-libraries install-${lib}) + endif() + endforeach() +endif() + +if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) + install(DIRECTORY include/flang + DESTINATION include + COMPONENT flang-headers + FILES_MATCHING + PATTERN "*.def" + PATTERN "*.h" + PATTERN "*.inc" + PATTERN "*.td" + PATTERN "config.h" EXCLUDE + PATTERN ".git" EXCLUDE + PATTERN "CMakeFiles" EXCLUDE) +endif()