1# 2#//===----------------------------------------------------------------------===// 3#// 4#// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5#// See https://llvm.org/LICENSE.txt for license information. 6#// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7#// 8#//===----------------------------------------------------------------------===// 9# 10 11include(ExtendPath) 12 13# The generated headers will be placed in clang's resource directory if present. 14if(OPENMP_STANDALONE_BUILD OR NOT LLVM_RUNTIMES_BUILD) 15 set(LIBOMP_HEADERS_INTDIR ${CMAKE_CURRENT_BINARY_DIR}) 16else() 17 set(LIBOMP_HEADERS_INTDIR ${LLVM_BINARY_DIR}/${LIBOMP_HEADERS_INSTALL_PATH}) 18endif() 19 20# Configure omp.h, kmp_config.h and omp-tools.h if necessary 21configure_file(${LIBOMP_INC_DIR}/omp.h.var ${LIBOMP_HEADERS_INTDIR}/omp.h @ONLY) 22configure_file(${LIBOMP_INC_DIR}/ompx.h.var ${LIBOMP_HEADERS_INTDIR}/ompx.h @ONLY) 23configure_file(kmp_config.h.cmake kmp_config.h @ONLY) 24if(${LIBOMP_OMPT_SUPPORT}) 25 configure_file(${LIBOMP_INC_DIR}/omp-tools.h.var ${LIBOMP_HEADERS_INTDIR}/omp-tools.h @ONLY) 26endif() 27 28# Generate message catalog files: kmp_i18n_id.inc and kmp_i18n_default.inc 29set(LIBOMP_MESSAGE_CONVERTER_EXTRA_ARGS "") 30if("${CMAKE_SYSTEM_NAME}" STREQUAL "Emscripten") 31 # Required as Python doesn't inherit CMake's environment setup and uses the host system as the target system by default 32 set(LIBOMP_MESSAGE_CONVERTER_EXTRA_ARGS ${LIBOMP_MESSAGE_CONVERTER_EXTRA_ARGS} --target-system-override=${CMAKE_SYSTEM_NAME}) 33endif() 34 35add_custom_command( 36 OUTPUT kmp_i18n_id.inc 37 COMMAND ${Python3_EXECUTABLE} ${LIBOMP_TOOLS_DIR}/message-converter.py 38 --enum=kmp_i18n_id.inc ${LIBOMP_MESSAGE_CONVERTER_EXTRA_ARGS} ${LIBOMP_SRC_DIR}/i18n/en_US.txt 39 DEPENDS ${LIBOMP_SRC_DIR}/i18n/en_US.txt ${LIBOMP_TOOLS_DIR}/message-converter.py 40) 41add_custom_command( 42 OUTPUT kmp_i18n_default.inc 43 COMMAND ${Python3_EXECUTABLE} ${LIBOMP_TOOLS_DIR}/message-converter.py 44 --default=kmp_i18n_default.inc ${LIBOMP_MESSAGE_CONVERTER_EXTRA_ARGS} ${LIBOMP_SRC_DIR}/i18n/en_US.txt 45 DEPENDS ${LIBOMP_SRC_DIR}/i18n/en_US.txt ${LIBOMP_TOOLS_DIR}/message-converter.py 46) 47 48# Set the -D definitions for all sources 49# UNICODE and _UNICODE are set in LLVM's CMake system. They affect the 50# ittnotify code and should only be set when compiling ittnotify_static.cpp 51# on Windows (done below). 52# TODO: Fix the UNICODE usage in ittnotify code for Windows. 53remove_definitions(-DUNICODE -D_UNICODE) 54libomp_get_definitions_flags(LIBOMP_CONFIGURED_DEFINITIONS_FLAGS) 55add_definitions(${LIBOMP_CONFIGURED_DEFINITIONS_FLAGS}) 56 57# Set the -I includes for all sources 58include_directories( 59 ${CMAKE_CURRENT_BINARY_DIR} 60 ${LIBOMP_SRC_DIR} 61 ${LIBOMP_SRC_DIR}/i18n 62 ${LIBOMP_INC_DIR} 63 ${LIBOMP_SRC_DIR}/thirdparty/ittnotify 64) 65 66# Building with time profiling support requires LLVM directory includes. 67if(LIBOMP_PROFILING_SUPPORT) 68 include_directories( 69 ${LLVM_MAIN_INCLUDE_DIR} 70 ${LLVM_INCLUDE_DIR} 71 ) 72endif() 73 74# Getting correct source files to build library 75set(LIBOMP_CXXFILES) 76set(LIBOMP_ASMFILES) 77set(LIBOMP_GNUASMFILES) 78if(STUBS_LIBRARY) 79 set(LIBOMP_CXXFILES kmp_stub.cpp) 80else() 81 # Get C++ files 82 set(LIBOMP_CXXFILES 83 kmp_alloc.cpp 84 kmp_atomic.cpp 85 kmp_csupport.cpp 86 kmp_debug.cpp 87 kmp_itt.cpp 88 kmp_environment.cpp 89 kmp_error.cpp 90 kmp_global.cpp 91 kmp_i18n.cpp 92 kmp_io.cpp 93 kmp_runtime.cpp 94 kmp_settings.cpp 95 kmp_str.cpp 96 kmp_tasking.cpp 97 kmp_threadprivate.cpp 98 kmp_utility.cpp 99 kmp_barrier.cpp 100 kmp_wait_release.cpp 101 kmp_affinity.cpp 102 kmp_dispatch.cpp 103 kmp_lock.cpp 104 kmp_sched.cpp 105 kmp_collapse.cpp 106 ) 107 if(WIN32) 108 # Windows specific files 109 libomp_append(LIBOMP_CXXFILES z_Windows_NT_util.cpp) 110 libomp_append(LIBOMP_CXXFILES z_Windows_NT-586_util.cpp) 111 if(${LIBOMP_ARCH} STREQUAL "i386" OR ${LIBOMP_ARCH} STREQUAL "x86_64") 112 libomp_append(LIBOMP_ASMFILES z_Windows_NT-586_asm.asm) # Windows assembly file 113 elseif((${LIBOMP_ARCH} STREQUAL "aarch64" OR ${LIBOMP_ARCH} STREQUAL "arm") AND (NOT MSVC OR CMAKE_C_COMPILER_ID STREQUAL "Clang")) 114 # z_Linux_asm.S works for AArch64 and ARM Windows too. 115 libomp_append(LIBOMP_GNUASMFILES z_Linux_asm.S) 116 else() 117 # AArch64 with MSVC gets implementations of the functions from 118 # ifdeffed sections in z_Windows_NT-586_util.cpp. 119 endif() 120 else() 121 # Unix specific files 122 libomp_append(LIBOMP_CXXFILES z_Linux_util.cpp) 123 libomp_append(LIBOMP_CXXFILES kmp_gsupport.cpp) 124 if(${CMAKE_SYSTEM_NAME} MATCHES "AIX") 125 libomp_append(LIBOMP_GNUASMFILES z_AIX_asm.S) # AIX assembly file 126 else() 127 libomp_append(LIBOMP_GNUASMFILES z_Linux_asm.S) # Unix assembly file 128 endif() 129 endif() 130 libomp_append(LIBOMP_CXXFILES thirdparty/ittnotify/ittnotify_static.cpp LIBOMP_USE_ITT_NOTIFY) 131 libomp_append(LIBOMP_CXXFILES kmp_debugger.cpp LIBOMP_USE_DEBUGGER) 132 libomp_append(LIBOMP_CXXFILES kmp_stats.cpp LIBOMP_STATS) 133 libomp_append(LIBOMP_CXXFILES kmp_stats_timing.cpp LIBOMP_STATS) 134 libomp_append(LIBOMP_CXXFILES kmp_taskdeps.cpp) 135 libomp_append(LIBOMP_CXXFILES kmp_cancel.cpp) 136endif() 137# Files common to stubs and normal library 138libomp_append(LIBOMP_CXXFILES kmp_ftn_cdecl.cpp) 139libomp_append(LIBOMP_CXXFILES kmp_ftn_extra.cpp) 140libomp_append(LIBOMP_CXXFILES kmp_version.cpp) 141libomp_append(LIBOMP_CXXFILES ompt-general.cpp IF_TRUE LIBOMP_OMPT_SUPPORT) 142libomp_append(LIBOMP_CXXFILES ompd-specific.cpp IF_TRUE LIBOMP_OMPD_SUPPORT) 143 144set(LIBOMP_SOURCE_FILES ${LIBOMP_CXXFILES} ${LIBOMP_ASMFILES} ${LIBOMP_GNUASMFILES}) 145# For Windows, there is a resource file (.rc -> .res) that is also compiled 146libomp_append(LIBOMP_SOURCE_FILES libomp.rc WIN32) 147 148# Get compiler and assembler flags 149libomp_get_cxxflags(LIBOMP_CONFIGURED_CXXFLAGS) 150libomp_get_asmflags(LIBOMP_CONFIGURED_ASMFLAGS) 151# Set the compiler flags for each type of source 152set_source_files_properties(${LIBOMP_CXXFILES} PROPERTIES COMPILE_FLAGS "${LIBOMP_CONFIGURED_CXXFLAGS}") 153set_source_files_properties(${LIBOMP_ASMFILES} ${LIBOMP_GNUASMFILES} PROPERTIES COMPILE_FLAGS "${LIBOMP_CONFIGURED_ASMFLAGS}") 154 155# Remove any cmake-automatic linking of the standard C++ library. 156# We neither need (nor want) the standard C++ library dependency even though we compile c++ files. 157if(NOT ${LIBOMP_USE_STDCPPLIB}) 158 set(LIBOMP_LINKER_LANGUAGE C) 159 set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES) 160else() 161 set(LIBOMP_LINKER_LANGUAGE CXX) 162endif() 163 164if(UNIX) 165 set(LIBOMP_DL_LIBS ${CMAKE_DL_LIBS}) 166endif() 167 168# Disable libstdc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build, to 169# avoid an unwanted dependency on libstdc++.so. 170if(NOT WIN32) 171 add_definitions(-U_GLIBCXX_ASSERTIONS) 172endif() 173 174# Add the OpenMP library 175libomp_get_ldflags(LIBOMP_CONFIGURED_LDFLAGS) 176 177libomp_get_libflags(LIBOMP_CONFIGURED_LIBFLAGS) 178# Build libomp library. Add LLVMSupport dependency if building in-tree with libomptarget profiling enabled. 179if(OPENMP_STANDALONE_BUILD OR (NOT OPENMP_ENABLE_LIBOMP_PROFILING)) 180 add_library(omp ${LIBOMP_LIBRARY_KIND} ${LIBOMP_SOURCE_FILES}) 181 set_property(TARGET omp PROPERTY FOLDER "OpenMP/Libraries") 182 # Linking command will include libraries in LIBOMP_CONFIGURED_LIBFLAGS 183 target_link_libraries(omp ${LIBOMP_CONFIGURED_LIBFLAGS} ${LIBOMP_DL_LIBS}) 184else() 185 add_llvm_library(omp ${LIBOMP_LIBRARY_KIND} ${LIBOMP_SOURCE_FILES} PARTIAL_SOURCES_INTENDED 186 LINK_LIBS ${LIBOMP_CONFIGURED_LIBFLAGS} ${LIBOMP_DL_LIBS} 187 LINK_COMPONENTS Support 188 BUILDTREE_ONLY 189 ) 190 # libomp must be a C++ library such that it can link libLLVMSupport 191 set(LIBOMP_LINKER_LANGUAGE CXX) 192endif() 193if(${LIBOMP_USE_HWLOC}) 194 target_include_directories(omp 195 PUBLIC 196 "$<BUILD_INTERFACE:${LIBOMP_HWLOC_INCLUDE_DIR}>" 197 "$<INSTALL_INTERFACE:${LIBOMP_HWLOC_INCLUDE_DIR}>" 198 ) 199endif() 200 201if(OPENMP_MSVC_NAME_SCHEME) 202 if(uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") 203 set(LIBOMP_PDB_NAME ${LIBOMP_DEFAULT_LIB_NAME}${MSVC_TOOLS_VERSION}d.${LIBOMP_ARCH}) 204 set(LIBOMP_LIB_FILE ${LIBOMP_PDB_NAME}${LIBOMP_LIBRARY_SUFFIX}) 205 else() 206 # ${LIBOMP_LIB_NAME} is ${LIBOMP_DEFAULT_LIB_NAME}${MSVC_TOOLS_VERSION}.${LIBOMP_ARCH} 207 set(LIBOMP_PDB_NAME ${LIBOMP_LIB_NAME}) 208 endif() 209 210 # in debug 211 # LIBOMP_LIB_FILE should be LIBOMP_LIB_FILE_DBG = ${LIBOMP_LIB_NAME_DBG}${LIBOMP_LIBRARY_SUFFIX} 212 # = ${LIBOMP_DEFAULT_LIB_NAME}${MSVC_TOOLS_VERSION}d.${LIBOMP_ARCH}${LIBOMP_LIBRARY_SUFFIX} 213 # COMPILE_PDB_NAME/PDB_NAME should be LIBOMP_LIB_NAME_DBG = ${LIBOMP_DEFAULT_LIB_NAME}${MSVC_TOOLS_VERSION}d.${LIBOMP_ARCH} 214 set_target_properties(omp PROPERTIES 215 PREFIX "" SUFFIX "" OUTPUT_NAME "${LIBOMP_LIB_FILE}" 216 PDB_NAME "${LIBOMP_PDB_NAME}" 217 COMPILE_PDB_NAME "${LIBOMP_PDB_NAME}" 218 LINK_FLAGS "${LIBOMP_CONFIGURED_LDFLAGS}" 219 LINKER_LANGUAGE ${LIBOMP_LINKER_LANGUAGE} 220 ) 221elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX") 222 set(LIBOMP_SHARED_OUTPUT_NAME "omp" CACHE STRING "Output name for the shared libomp runtime library.") 223 set_target_properties(omp PROPERTIES 224 OUTPUT_NAME "${LIBOMP_SHARED_OUTPUT_NAME}" 225 LINK_FLAGS "${LIBOMP_CONFIGURED_LDFLAGS}" 226 LINKER_LANGUAGE ${LIBOMP_LINKER_LANGUAGE} 227 VERSION "1.0" 228 SOVERSION "1" 229 ) 230else() 231 set_target_properties(omp PROPERTIES 232 PREFIX "" SUFFIX "" OUTPUT_NAME "${LIBOMP_LIB_FILE}" 233 LINK_FLAGS "${LIBOMP_CONFIGURED_LDFLAGS}" 234 LINKER_LANGUAGE ${LIBOMP_LINKER_LANGUAGE} 235 ) 236endif() 237 238# Get the library's location within the build tree for the unit tester 239if(NOT WIN32) 240 get_target_property(LIBOMP_LIBRARY_DIR omp LIBRARY_OUTPUT_DIRECTORY) 241else() 242 get_target_property(LIBOMP_LIBRARY_DIR omp RUNTIME_OUTPUT_DIRECTORY) 243endif() 244if(NOT LIBOMP_LIBRARY_DIR) 245 set(LIBOMP_LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) 246 set(LIBOMP_LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE) 247else() 248 set(LIBOMP_LIBRARY_DIR ${LIBOMP_LIBRARY_DIR} PARENT_SCOPE) 249endif() 250set(LIBOMP_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}) 251set(LIBOMP_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE) 252 253# Add symbolic links to libomp 254if(NOT WIN32) 255 add_custom_command(TARGET omp POST_BUILD 256 COMMAND ${CMAKE_COMMAND} -E create_symlink ${LIBOMP_LIB_FILE} 257 libgomp${LIBOMP_LIBRARY_SUFFIX} 258 COMMAND ${CMAKE_COMMAND} -E create_symlink ${LIBOMP_LIB_FILE} 259 libiomp5${LIBOMP_LIBRARY_SUFFIX} 260 WORKING_DIRECTORY ${LIBOMP_LIBRARY_DIR} 261 ) 262 if(LIBOMP_ENABLE_SHARED) 263 if(APPLE) 264 set(VERSIONED_LIBGOMP_NAME libgomp.1${LIBOMP_LIBRARY_SUFFIX}) 265 else() 266 set(VERSIONED_LIBGOMP_NAME libgomp${LIBOMP_LIBRARY_SUFFIX}.1) 267 endif() 268 add_custom_command(TARGET omp POST_BUILD 269 COMMAND ${CMAKE_COMMAND} -E create_symlink ${LIBOMP_LIB_FILE} ${VERSIONED_LIBGOMP_NAME} 270 WORKING_DIRECTORY ${LIBOMP_LIBRARY_DIR} 271 ) 272 endif() 273endif() 274 275# Definitions for testing, for reuse when testing libomptarget-nvptx. 276set(LIBOMPTARGET_OPENMP_HEADER_FOLDER "${LIBOMP_INCLUDE_DIR}" CACHE STRING 277 "Path to folder containing omp.h") 278set(LIBOMPTARGET_OPENMP_HOST_RTL_FOLDER "${LIBOMP_LIBRARY_DIR}" CACHE STRING 279 "Path to folder containing libomp.so, and libLLVMSupport.so with profiling enabled") 280 281# Create *.inc before compiling any sources 282# objects depend on : .inc files 283add_custom_target(libomp-needed-headers DEPENDS kmp_i18n_id.inc kmp_i18n_default.inc) 284set_target_properties(libomp-needed-headers PROPERTIES FOLDER "OpenMP/Sourcegenning") 285add_dependencies(omp libomp-needed-headers) 286 287# Windows specific build rules 288if(WIN32) 289 configure_file(libomp.rc.var libomp.rc @ONLY) 290 # z_Windows_NT-586_asm.asm requires definitions to be sent via command line 291 # It only needs the architecture macro and OMPT_SUPPORT=0|1 292 libomp_append(LIBOMP_MASM_DEFINITIONS "-D_M_IA32" IF_TRUE IA32) 293 libomp_append(LIBOMP_MASM_DEFINITIONS "-D_M_AMD64" IF_TRUE INTEL64) 294 libomp_append(LIBOMP_MASM_DEFINITIONS "-DOMPT_SUPPORT" IF_TRUE_1_0 LIBOMP_OMPT_SUPPORT) 295 libomp_append(LIBOMP_MASM_DEFINITIONS "-DOMPD_SUPPORT" IF_TRUE_1_0 LIBOMP_OMPD_SUPPORT) 296 libomp_list_to_string("${LIBOMP_MASM_DEFINITIONS}" LIBOMP_MASM_DEFINITIONS) 297 set_property(SOURCE z_Windows_NT-586_asm.asm APPEND_STRING PROPERTY COMPILE_FLAGS " ${LIBOMP_MASM_DEFINITIONS}") 298 set_source_files_properties(thirdparty/ittnotify/ittnotify_static.cpp PROPERTIES COMPILE_DEFINITIONS "UNICODE") 299 300 # Create Windows import library 301 # On debug LIBOMP_IMP_LIB_FILE should be LIBOMP_IMP_LIB_FILE_DBG = ${LIBOMP_DEFAULT_LIB_NAME_DBG}${CMAKE_STATIC_LIBRARY_SUFFIX} 302 # ${LIBOMP_DEFAULT_LIB_NAME}d${CMAKE_STATIC_LIBRARY_SUFFIX} 303 # and the ARCHIVE_OUTPUT_NAME of ompdbg should be ${LIBOMP_DEFAULT_LIB_NAME_DBG}${LIBOMP_LIBRARY_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX} 304 305 if(OPENMP_MSVC_NAME_SCHEME) 306 if(uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") 307 set(LIBOMP_IMP_LIB_FILE ${LIBOMP_DEFAULT_LIB_NAME}d${CMAKE_STATIC_LIBRARY_SUFFIX}) 308 set(LIBOMP_GENERATED_IMP_LIB_FILENAME ${LIBOMP_DEFAULT_LIB_NAME}d${LIBOMP_LIBRARY_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}) 309 else() 310 set(LIBOMP_IMP_LIB_FILE ${LIBOMP_DEFAULT_LIB_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}) 311 set(LIBOMP_GENERATED_IMP_LIB_FILENAME ${LIBOMP_DEFAULT_LIB_NAME}${LIBOMP_LIBRARY_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}) 312 endif() 313 else() 314 set(LIBOMP_IMP_LIB_FILE ${LIBOMP_LIB_NAME}${CMAKE_IMPORT_LIBRARY_SUFFIX}) 315 set(LIBOMP_GENERATED_IMP_LIB_FILENAME ${LIBOMP_LIB_FILE}${CMAKE_STATIC_LIBRARY_SUFFIX}) 316 endif() 317 set_target_properties(omp PROPERTIES 318 VERSION ${LIBOMP_VERSION_MAJOR}.${LIBOMP_VERSION_MINOR} # uses /version flag 319 IMPORT_PREFIX "" IMPORT_SUFFIX "" # control generated import library name when building omp 320 ARCHIVE_OUTPUT_NAME ${LIBOMP_GENERATED_IMP_LIB_FILENAME} 321 ) 322 323 set(LIBOMP_IMP_LIB_TARGET omp) 324 set(LIBOMP_GENERATED_DEF_FILE ${LIBOMP_LIB_NAME}.def) 325 add_custom_target(libomp-needed-def-file DEPENDS ${LIBOMP_GENERATED_DEF_FILE}) 326 set_target_properties(libomp-needed-def-file PROPERTIES FOLDER "OpenMP/Sourcegenning") 327 add_dependencies(omp libomp-needed-def-file) 328 329 # Create the main def file with ordinals to use for building the runtime dll to maintain backwards compatible exports order 330 libomp_get_gdflags(LIBOMP_GDFLAGS) 331 libomp_string_to_list("${LIBOMP_GDFLAGS}" LIBOMP_GDFLAGS) 332 333 add_custom_command( 334 OUTPUT ${LIBOMP_GENERATED_DEF_FILE} 335 COMMAND ${Python3_EXECUTABLE} ${LIBOMP_TOOLS_DIR}/generate-def.py ${LIBOMP_GDFLAGS} --name ${LIBOMP_LIB_FILE} 336 -o ${LIBOMP_GENERATED_DEF_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/dllexports 337 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/dllexports ${LIBOMP_TOOLS_DIR}/generate-def.py 338 ) 339 340 if(MSVC) 341 # For toolchains that generated the import library importing by ordinal, re-generate it to import by name 342 set(LIBOMP_IMP_LIB_TARGET ompimp) 343 # Create the auxiliary def file without ordinals to use for building the import library to import by name 344 set(LIBOMPIMP_GENERATED_DEF_FILE ${LIBOMP_LIB_NAME}.imp.def) 345 add_custom_target(libompimp-needed-def-file DEPENDS ${LIBOMPIMP_GENERATED_DEF_FILE}) 346 set_target_properties(libompimp-needed-def-file PROPERTIES FOLDER "OpenMP/Resources") 347 add_custom_command( 348 OUTPUT ${LIBOMPIMP_GENERATED_DEF_FILE} 349 COMMAND ${Python3_EXECUTABLE} ${LIBOMP_TOOLS_DIR}/generate-def.py ${LIBOMP_GDFLAGS} 350 --name ${LIBOMP_LIB_FILE} --no-ordinals 351 -o ${LIBOMPIMP_GENERATED_DEF_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/dllexports 352 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/dllexports ${LIBOMP_TOOLS_DIR}/generate-def.py 353 ) 354 # while this merely generates an import library off a def file, CMAKE still requires it to have a "source" so feed it a dummy one, 355 # making it a .txt which CMAKE will filter out from the librarian (a .cpp will make lib.exe punt trying to resolve the .def symbols) 356 add_library(${LIBOMP_IMP_LIB_TARGET} STATIC kmp_dummy.txt) 357 set_target_properties(${LIBOMP_IMP_LIB_TARGET} PROPERTIES FOLDER "OpenMP/Libraries") 358 set_target_properties(${LIBOMP_IMP_LIB_TARGET} PROPERTIES 359 PREFIX "" SUFFIX "" OUTPUT_NAME "${LIBOMP_IMP_LIB_FILE}" LINKER_LANGUAGE ${LIBOMP_LINKER_LANGUAGE} 360 STATIC_LIBRARY_OPTIONS "${CMAKE_LINK_DEF_FILE_FLAG}${CMAKE_CURRENT_BINARY_DIR}/${LIBOMPIMP_GENERATED_DEF_FILE}") 361 add_dependencies(${LIBOMP_IMP_LIB_TARGET} libompimp-needed-def-file) 362 add_dependencies(omp ${LIBOMP_IMP_LIB_TARGET}) 363 endif() 364endif() 365 366# Building the Fortran module files 367# One compilation step creates both omp_lib.mod and omp_lib_kinds.mod 368configure_file(${LIBOMP_INC_DIR}/omp_lib.h.var omp_lib.h @ONLY) 369configure_file(${LIBOMP_INC_DIR}/omp_lib.F90.var omp_lib.F90 @ONLY) 370 371set(BUILD_FORTRAN_MODULES False) 372if (NOT ${LIBOMP_FORTRAN_MODULES_COMPILER} STREQUAL "") 373 # If libomp is built as an LLVM runtime and the flang compiler is available, 374 # compile the Fortran module files. 375 message(STATUS "configuring openmp to build Fortran module files using ${LIBOMP_FORTRAN_MODULES_COMPILER}") 376 set(LIBOMP_FORTRAN_SOURCE_FILE omp_lib.F90) 377 add_custom_target(libomp-mod ALL DEPENDS omp_lib.mod omp_lib_kinds.mod) 378 add_custom_command( 379 OUTPUT omp_lib.mod omp_lib_kinds.mod 380 COMMAND ${LIBOMP_FORTRAN_MODULES_COMPILER} -cpp -fsyntax-only ${LIBOMP_FORTRAN_SOURCE_FILE} 381 DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${LIBOMP_FORTRAN_SOURCE_FILE} 382 ${CMAKE_CURRENT_BINARY_DIR}/omp_lib.h 383 ) 384 set(BUILD_FORTRAN_MODULES True) 385elseif(${LIBOMP_FORTRAN_MODULES}) 386 # The following requests explicit building of the Fortran module files 387 # Workaround for gfortran to build modules with the 388 # omp_sched_monotonic integer parameter 389 if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") 390 set(ADDITIONAL_Fortran_FLAGS "-fno-range-check") 391 endif() 392 add_custom_target(libomp-mod ALL DEPENDS omp_lib.mod omp_lib_kinds.mod) 393 set_target_properties(libomp-mod PROPERTIES FOLDER "OpenMP/Misc") 394 libomp_get_fflags(LIBOMP_CONFIGURED_FFLAGS) 395 if(CMAKE_Fortran_COMPILER_SUPPORTS_F90) 396 set(LIBOMP_FORTRAN_SOURCE_FILE omp_lib.F90) 397 else() 398 message(FATAL_ERROR "Fortran module build requires Fortran 90 compiler") 399 endif() 400 add_custom_command( 401 OUTPUT omp_lib.mod omp_lib_kinds.mod 402 COMMAND ${CMAKE_Fortran_COMPILER} -c ${ADDITIONAL_Fortran_FLAGS} 403 ${LIBOMP_CONFIGURED_FFLAGS} ${LIBOMP_FORTRAN_SOURCE_FILE} 404 DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${LIBOMP_FORTRAN_SOURCE_FILE} 405 ${CMAKE_CURRENT_BINARY_DIR}/omp_lib.h 406 ) 407 set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES omp_lib${CMAKE_C_OUTPUT_EXTENSION}) 408 set(BUILD_FORTRAN_MODULES True) 409endif() 410 411# Move files to exports/ directory if requested 412if(${LIBOMP_COPY_EXPORTS}) 413 include(LibompExports) 414endif() 415 416# Micro test rules for after library has been built (cmake/LibompMicroTests.cmake) 417include(LibompMicroTests) 418add_custom_target(libomp-micro-tests) 419set_target_properties(libomp-micro-tests PROPERTIES FOLDER "OpenMP/Tests") 420if(NOT ${MIC} AND NOT CMAKE_CROSSCOMPILING) 421 add_dependencies(libomp-micro-tests libomp-test-touch) 422endif() 423if(NOT WIN32 AND NOT APPLE) 424 add_dependencies(libomp-micro-tests libomp-test-relo) 425endif() 426if(NOT WIN32 AND NOT APPLE) 427 add_dependencies(libomp-micro-tests libomp-test-execstack) 428endif() 429add_dependencies(libomp-micro-tests libomp-test-deps) 430 431# `omp` needs to be exported if in-tree build. 432set(export_to_llvmexports) 433if (NOT OPENMP_STANDALONE_BUILD) 434 get_target_export_arg(omp LLVM export_to_llvmexports) 435 set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS omp) 436endif() 437 438# Install rules 439# We want to install libomp in ${DESTDIR}/${CMAKE_INSTALL_FULL_LIBDIR} 440# We want to install headers in ${DESTDIR}/${CMAKE_INSTALL_FULL_INCLUDEDIR} 441if(WIN32) 442 install(TARGETS omp ${export_to_llvmexports} RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") 443 install(TARGETS ${LIBOMP_IMP_LIB_TARGET} ARCHIVE DESTINATION "${OPENMP_INSTALL_LIBDIR}") 444 # Create aliases (regular copies) of the library for backwards compatibility 445 set(LIBOMP_ALIASES "libiomp5md") 446 foreach(alias IN LISTS LIBOMP_ALIASES) 447 install(CODE "execute_process(COMMAND \"\${CMAKE_COMMAND}\" -E copy \"${LIBOMP_LIB_FILE}\" 448 \"${alias}${LIBOMP_LIBRARY_SUFFIX}\" WORKING_DIRECTORY \"${CMAKE_INSTALL_FULL_BINDIR}\")") 449 extend_path(outdir "${CMAKE_INSTALL_PREFIX}" "${OPENMP_INSTALL_LIBDIR}") 450 install(CODE "execute_process(COMMAND \"\${CMAKE_COMMAND}\" -E copy \"${LIBOMP_IMP_LIB_FILE}\" 451 \"${alias}${CMAKE_STATIC_LIBRARY_SUFFIX}\" WORKING_DIRECTORY \"${outdir}\")") 452 endforeach() 453else() 454 455 install(TARGETS omp ${export_to_llvmexports} ${LIBOMP_INSTALL_KIND} DESTINATION "${OPENMP_INSTALL_LIBDIR}") 456 457 if(${LIBOMP_INSTALL_ALIASES}) 458 # Create aliases (symlinks) of the library for backwards compatibility 459 extend_path(outdir "${CMAKE_INSTALL_PREFIX}" "${OPENMP_INSTALL_LIBDIR}") 460 set(LIBOMP_ALIASES "libgomp;libiomp5") 461 foreach(alias IN LISTS LIBOMP_ALIASES) 462 install(CODE "execute_process(COMMAND \"\${CMAKE_COMMAND}\" -E create_symlink \"${LIBOMP_LIB_FILE}\" 463 \"${alias}${LIBOMP_LIBRARY_SUFFIX}\" WORKING_DIRECTORY 464 \"\$ENV{DESTDIR}${outdir}\")") 465 endforeach() 466 if(LIBOMP_ENABLE_SHARED) 467 install(CODE "execute_process(COMMAND \"\${CMAKE_COMMAND}\" -E create_symlink \"${LIBOMP_LIB_FILE}\" 468 \"${VERSIONED_LIBGOMP_NAME}\" WORKING_DIRECTORY 469 \"\$ENV{DESTDIR}${outdir}\")") 470 endif() 471 endif() 472endif() 473install( 474 FILES 475 ${LIBOMP_HEADERS_INTDIR}/omp.h 476 ${LIBOMP_HEADERS_INTDIR}/ompx.h 477 DESTINATION ${LIBOMP_HEADERS_INSTALL_PATH} 478) 479if(${LIBOMP_OMPT_SUPPORT}) 480 install(FILES ${LIBOMP_HEADERS_INTDIR}/omp-tools.h DESTINATION ${LIBOMP_HEADERS_INSTALL_PATH}) 481 # install under legacy name ompt.h 482 install(FILES ${LIBOMP_HEADERS_INTDIR}/omp-tools.h DESTINATION ${LIBOMP_HEADERS_INSTALL_PATH} RENAME ompt.h) 483 set(LIBOMP_OMP_TOOLS_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE) 484endif() 485if(${BUILD_FORTRAN_MODULES}) 486 set (destination ${LIBOMP_HEADERS_INSTALL_PATH}) 487 if (NOT ${LIBOMP_MODULES_INSTALL_PATH} STREQUAL "") 488 set (destination ${LIBOMP_MODULES_INSTALL_PATH}) 489 endif() 490 install(FILES 491 ${CMAKE_CURRENT_BINARY_DIR}/omp_lib.h 492 ${CMAKE_CURRENT_BINARY_DIR}/omp_lib.mod 493 ${CMAKE_CURRENT_BINARY_DIR}/omp_lib_kinds.mod 494 DESTINATION ${destination} 495 ) 496endif() 497