Mercurial > hg > CbC > CbC_llvm
view flang/runtime/CMakeLists.txt @ 266:00f31e85ec16 default tip
Added tag current for changeset 31d058e83c98
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 14 Oct 2023 10:13:55 +0900 |
parents | 1f2b6ac9f198 |
children |
line wrap: on
line source
#===-- runtime/CMakeLists.txt ----------------------------------------------===# # # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. # See https://llvm.org/LICENSE.txt for license information. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # #===------------------------------------------------------------------------===# if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) cmake_minimum_required(VERSION 3.20.0) project(FlangRuntime C CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED TRUE) set(CMAKE_CXX_EXTENSIONS OFF) set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..") set(LLVM_COMMON_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../cmake") set(LLVM_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../llvm/cmake") set(CLANG_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../clang/cmake") # Add path for custom modules list(INSERT CMAKE_MODULE_PATH 0 "${FLANG_SOURCE_DIR}/cmake" "${FLANG_SOURCE_DIR}/cmake/modules" "${LLVM_COMMON_CMAKE_UTILS}" "${LLVM_COMMON_CMAKE_UTILS}/Modules" "${LLVM_CMAKE_UTILS}" "${LLVM_CMAKE_UTILS}/modules" "${CLANG_CMAKE_UTILS}/modules" ) include(AddClang) include(AddLLVM) include(AddFlang) include(HandleLLVMOptions) include(TestBigEndian) test_big_endian(IS_BIGENDIAN) if (IS_BIGENDIAN) add_compile_definitions(FLANG_BIG_ENDIAN=1) else () add_compile_definitions(FLANG_LITTLE_ENDIAN=1) endif () include_directories(BEFORE ${FLANG_SOURCE_DIR}/include) endif() include(CheckCXXSymbolExists) include(CheckCXXSourceCompiles) check_cxx_symbol_exists(strerror_r string.h HAVE_STRERROR_R) # Can't use symbol exists here as the function is overloaded in C++ check_cxx_source_compiles( "#include <string.h> int main() { char buf[4096]; return strerror_s(buf, 4096, 0); } " HAVE_DECL_STRERROR_S) check_cxx_compiler_flag(-fno-lto FLANG_RUNTIME_HAS_FNO_LTO_FLAG) if (FLANG_RUNTIME_HAS_FNO_LTO_FLAG) set(NO_LTO_FLAGS "-fno-lto") else() set(NO_LTO_FLAGS "") endif() configure_file(config.h.cmake config.h) # include_directories is used here instead of target_include_directories # because add_flang_library creates multiple objects (STATIC/SHARED, OBJECT) # with different names include_directories(AFTER ${CMAKE_CURRENT_BINARY_DIR}) append(${NO_LTO_FLAGS} CMAKE_C_FLAGS) append(${NO_LTO_FLAGS} CMAKE_CXX_FLAGS) # Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build, # to avoid an unwanted dependency on libstdc++/libc++.so. add_definitions(-U_GLIBCXX_ASSERTIONS) add_definitions(-U_LIBCPP_ENABLE_ASSERTIONS) add_subdirectory(FortranMain) set(sources ISO_Fortran_binding.cpp allocatable.cpp array-constructor.cpp assign.cpp buffer.cpp command.cpp complex-powi.cpp complex-reduction.c copy.cpp character.cpp connection.cpp derived.cpp derived-api.cpp descriptor.cpp descriptor-io.cpp dot-product.cpp edit-input.cpp edit-output.cpp environment.cpp extensions.cpp extrema.cpp file.cpp findloc.cpp format.cpp inquiry.cpp internal-unit.cpp iostat.cpp io-api.cpp io-error.cpp io-stmt.cpp main.cpp matmul-transpose.cpp matmul.cpp memory.cpp misc-intrinsic.cpp namelist.cpp non-tbp-dio.cpp numeric.cpp ragged.cpp random.cpp reduction.cpp pointer.cpp product.cpp stat.cpp stop.cpp sum.cpp support.cpp temporary-stack.cpp terminator.cpp time-intrinsic.cpp tools.cpp transformational.cpp type-code.cpp type-info.cpp unit.cpp unit-map.cpp utf.cpp ) option(FLANG_EXPERIMENTAL_CUDA_RUNTIME "Compile Fortran runtime as CUDA sources (experimental)" OFF ) # List of files that are buildable for all devices. set(supported_files transformational.cpp ) if (FLANG_EXPERIMENTAL_CUDA_RUNTIME) if (BUILD_SHARED_LIBS) message(FATAL_ERROR "BUILD_SHARED_LIBS is not supported for CUDA build of Fortran runtime" ) endif() enable_language(CUDA) # TODO: figure out how to make target property CUDA_SEPARABLE_COMPILATION # work, and avoid setting CMAKE_CUDA_SEPARABLE_COMPILATION. set(CMAKE_CUDA_SEPARABLE_COMPILATION ON) # Treat all supported sources as CUDA files. set_source_files_properties(${supported_files} PROPERTIES LANGUAGE CUDA) set(CUDA_COMPILE_OPTIONS) if ("${CMAKE_CUDA_COMPILER_ID}" MATCHES "Clang") # Allow varargs. set(CUDA_COMPILE_OPTIONS -Xclang -fcuda-allow-variadic-functions ) endif() set_source_files_properties(${supported_files} PROPERTIES COMPILE_OPTIONS "${CUDA_COMPILE_OPTIONS}" ) endif() set(FLANG_EXPERIMENTAL_OMP_OFFLOAD_BUILD "off" CACHE STRING "Compile Fortran runtime as OpenMP target offload sources (experimental). Valid options are 'off', 'host_device', 'nohost'") set(FLANG_OMP_DEVICE_ARCHITECTURES "all" CACHE STRING "List of OpenMP device architectures to be used to compile the Fortran runtime (e.g. 'gfx1103;sm_90')") if (NOT FLANG_EXPERIMENTAL_OMP_OFFLOAD_BUILD STREQUAL "off") # 'host_device' build only works with Clang compiler currently. # The build is done with the CMAKE_C/CXX_COMPILER, i.e. it does not use # the in-tree built Clang. We may have a mode that would use the in-tree # built Clang. # # 'nohost' is supposed to produce an LLVM Bitcode library, # and it has to be done with a C/C++ compiler producing LLVM Bitcode # compatible with the LLVM toolchain version distributed with the Flang # compiler. # In general, the in-tree built Clang should be used for 'nohost' build. # Note that 'nohost' build does not produce the host version of Flang # runtime library, so there will be two separate distributable objects. # 'nohost' build is a TODO. if (NOT FLANG_EXPERIMENTAL_OMP_OFFLOAD_BUILD STREQUAL "host_device") message(FATAL_ERROR "Unsupported OpenMP offload build of Flang runtime") endif() if (BUILD_SHARED_LIBS) message(FATAL_ERROR "BUILD_SHARED_LIBS is not supported for OpenMP offload build of Fortran runtime" ) endif() if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND "${CMAKE_C_COMPILER_ID}" MATCHES "Clang") set(all_amdgpu_architectures "gfx700;gfx701;gfx801;gfx803;gfx900;gfx902;gfx906" "gfx908;gfx90a;gfx90c;gfx940;gfx1010;gfx1030" "gfx1031;gfx1032;gfx1033;gfx1034;gfx1035;gfx1036" "gfx1100;gfx1101;gfx1102;gfx1103;gfx1150;gfx1151" ) set(all_nvptx_architectures "sm_35;sm_37;sm_50;sm_52;sm_53;sm_60;sm_61;sm_62" "sm_70;sm_72;sm_75;sm_80;sm_86;sm_89;sm_90" ) set(all_gpu_architectures "${all_amdgpu_architectures};${all_nvptx_architectures}" ) # TODO: support auto detection on the build system. if (FLANG_OMP_DEVICE_ARCHITECTURES STREQUAL "all") set(FLANG_OMP_DEVICE_ARCHITECTURES ${all_gpu_architectures}) endif() list(REMOVE_DUPLICATES FLANG_OMP_DEVICE_ARCHITECTURES) string(REPLACE ";" "," compile_for_architectures "${FLANG_OMP_DEVICE_ARCHITECTURES}" ) set(OMP_COMPILE_OPTIONS -fopenmp -fvisibility=hidden -fopenmp-cuda-mode --offload-arch=${compile_for_architectures} # Force LTO for the device part. -foffload-lto ) set_source_files_properties(${supported_files} PROPERTIES COMPILE_OPTIONS "${OMP_COMPILE_OPTIONS}" ) # Enable "declare target" in the source code. set_source_files_properties(${supported_files} PROPERTIES COMPILE_DEFINITIONS OMP_OFFLOAD_BUILD ) else() message(FATAL_ERROR "Flang runtime build is not supported for these compilers:\n" "CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}\n" "CMAKE_C_COMPILER_ID: ${CMAKE_C_COMPILER_ID}") endif() endif() add_flang_library(FortranRuntime ${sources} LINK_LIBS FortranDecimal INSTALL_WITH_TOOLCHAIN )