mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 23:16:06 +00:00

This commit improves numerous functionalities of the OpenMP CMake build system to be more conducive with LLVM's build system and build philosophies. The CMake build system, as it was before this commit, was not up to LLVM's standards and did not implement the configuration stage like most CMake based build systems offer (check for compiler flags, libraries, etc.) In order to improve it dramatically in a short period of time, a large refactoring had to be done. The main changes done with this commit are as follows: * Compiler flag checks - The flags are no longer grabbed from compiler specific directories. They are checked for availability in config-ix.cmake and added accordingly inside LibompHandleFlags.cmake. * Feature checks were added in config-ix.cmake. For example, the standard CMake module FindThreads is probed for the threading model to use inside the OpenMP library. * OS detection - There is no longer a LIBOMP_OS variable, OS-specifc build logic is wrapped around the WIN32 and APPLE macros with !(WIN32 OR APPLE) meaning a Unix flavor of some sort. * Got rid of vestigial functions/macros/variables * Added new libomp_append() function which is used everywhere to conditionally or undconditionally append to a list * All targets have the libomp prefix so as not to interfere with any other project * LibompCheckLinkerFlag.cmake module was added which checks for linker flags specifically for building shared libraries. * LibompCheckFortranFlag.cmake module was added which checks for fortran flag availability. * Removed most of the cruft from the translation between the perl+Makefile based build system and this one. The remaining components that they share are perl scripts which I'm in the process of removing. There is still more left to do. The perl scripts still need to be removed, and a config.h.in file (or similarly named) needs to be added with #cmakedefine lines in it. But this is a much better first step than the previous system. Differential Revision: http://reviews.llvm.org/D10656 llvm-svn: 242298
214 lines
9.4 KiB
CMake
214 lines
9.4 KiB
CMake
#
|
|
#//===----------------------------------------------------------------------===//
|
|
#//
|
|
#// The LLVM Compiler Infrastructure
|
|
#//
|
|
#// This file is dual licensed under the MIT and the University of Illinois Open
|
|
#// Source Licenses. See LICENSE.txt for details.
|
|
#//
|
|
#//===----------------------------------------------------------------------===//
|
|
#
|
|
|
|
# Setup the flags correctly for cmake (covert to string)
|
|
# Pretty them up (STRIP any beginning and trailing whitespace,
|
|
# remove duplicates, remove empty entries)
|
|
macro(libomp_setup_flags flags)
|
|
if(NOT "${${flags}}" STREQUAL "") # if flags are empty, don't do anything
|
|
set(flags_local)
|
|
list(REMOVE_DUPLICATES ${flags}) # remove duplicates
|
|
list(REMOVE_ITEM ${flags} "") # remove empty items
|
|
libomp_list_to_string("${${flags}}" flags_local)
|
|
string(STRIP "${flags_local}" flags_local)
|
|
set(${flags} "${flags_local}")
|
|
endif()
|
|
endmacro()
|
|
|
|
# Gets flags common to both the C and C++ compiler
|
|
function(libomp_get_c_and_cxxflags_common flags)
|
|
set(flags_local)
|
|
libomp_append(flags_local -std=c++11 LIBOMP_HAVE_STD_CPP11_FLAG)
|
|
libomp_append(flags_local -fno-exceptions LIBOMP_HAVE_FNO_EXCEPTIONS_FLAG)
|
|
libomp_append(flags_local -Wsign-compare LIBOMP_HAVE_WSIGN_COMPARE_FLAG)
|
|
libomp_append(flags_local -Wno-unused-value LIBOMP_HAVE_WNO_UNUSED_VALUE_FLAG)
|
|
libomp_append(flags_local -Wno-switch LIBOMP_HAVE_WNO_SWITCH_FLAG)
|
|
libomp_append(flags_local -Wno-deprecated-register LIBOMP_HAVE_WNO_DEPRECATED_REGISTER_FLAG)
|
|
libomp_append(flags_local /GS LIBOMP_HAVE_GS_FLAG)
|
|
libomp_append(flags_local /EHsc LIBOMP_HAVE_EHSC_FLAG)
|
|
libomp_append(flags_local /Oy- LIBOMP_HAVE_OY__FLAG)
|
|
# Intel(R) C Compiler flags
|
|
libomp_append(flags_local /Qsafeseh LIBOMP_HAVE_QSAFESEH_FLAG)
|
|
libomp_append(flags_local -Qoption,cpp,--extended_float_types LIBOMP_HAVE_EXTENDED_FLOAT_TYPES_FLAG)
|
|
libomp_append(flags_local -Qlong_double LIBOMP_HAVE_LONG_DOUBLE_FLAG)
|
|
libomp_append(flags_local -Qdiag-disable:177 LIBOMP_HAVE_DIAG_DISABLE_177_FLAG)
|
|
if(${RELEASE_BUILD} OR ${RELWITHDEBINFO_BUILD})
|
|
libomp_append(flags_local -Qinline-min-size=1 LIBOMP_HAVE_INLINE_MIN_SIZE_FLAG)
|
|
endif()
|
|
# Architectural C and C++ flags
|
|
if(${IA32})
|
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
libomp_append(flags_local -m32 LIBOMP_HAVE_M32_FLAG)
|
|
endif()
|
|
libomp_append(flags_local /arch:SSE2 LIBOMP_HAVE_ARCH_SSE2_FLAG)
|
|
libomp_append(flags_local -msse2 LIBOMP_HAVE_MSSE2_FLAG)
|
|
libomp_append(flags_local -falign-stack=maintain-16-byte LIBOMP_HAVE_FALIGN_STACK_FLAG)
|
|
elseif(${MIC})
|
|
libomp_append(flags_local -mmic LIBOMP_HAVE_MMIC_FLAG)
|
|
libomp_append(flags_local -ftls-model=initial-exec LIBOMP_HAVE_FTLS_MODEL_FLAG)
|
|
libomp_append(flags_local "-opt-streaming-stores never" LIBOMP_HAVE_OPT_STREAMING_STORES_FLAG)
|
|
endif()
|
|
set(${flags} ${flags_local} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# C compiler flags
|
|
function(libomp_get_cflags cflags)
|
|
set(cflags_local)
|
|
libomp_get_c_and_cxxflags_common(cflags_local)
|
|
# flags only for the C Compiler
|
|
libomp_append(cflags_local /TP LIBOMP_HAVE_TP_FLAG)
|
|
libomp_append(cflags_local "-x c++" LIBOMP_HAVE_X_CPP_FLAG)
|
|
set(cflags_local ${cflags_local} ${LIBOMP_CFLAGS})
|
|
libomp_setup_flags(cflags_local)
|
|
set(${cflags} ${cflags_local} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# C++ compiler flags
|
|
function(libomp_get_cxxflags cxxflags)
|
|
set(cxxflags_local)
|
|
libomp_get_c_and_cxxflags_common(cxxflags_local)
|
|
set(cxxflags_local ${cxxflags_local} ${LIBOMP_CXXFLAGS})
|
|
libomp_setup_flags(cxxflags_local)
|
|
set(${cxxflags} ${cxxflags_local} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Assembler flags
|
|
function(libomp_get_asmflags asmflags)
|
|
set(asmflags_local)
|
|
libomp_append(asmflags_local "-x assembler-with-cpp" LIBOMP_HAVE_X_ASSEMBLER_WITH_CPP_FLAG)
|
|
# Architectural assembler flags
|
|
if(${IA32})
|
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
libomp_append(asmflags_local -m32 LIBOMP_HAVE_M32_FLAG)
|
|
endif()
|
|
libomp_append(asmflags_local /safeseh LIBOMP_HAVE_SAFESEH_MASM_FLAG)
|
|
libomp_append(asmflags_local /coff LIBOMP_HAVE_COFF_MASM_FLAG)
|
|
elseif(${MIC})
|
|
libomp_append(asmflags_local -mmic LIBOMP_HAVE_MMIC_FLAG)
|
|
endif()
|
|
set(asmflags_local ${asmflags_local} ${LIBOMP_ASMFLAGS})
|
|
libomp_setup_flags(asmflags_local)
|
|
set(${asmflags} ${asmflags_local} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Linker flags
|
|
function(libomp_get_ldflags ldflags)
|
|
set(ldflags_local)
|
|
libomp_append(ldflags_local "${CMAKE_LINK_DEF_FILE_FLAG}${CMAKE_CURRENT_BINARY_DIR}/${LIBOMP_LIB_NAME}.def"
|
|
IF_DEFINED CMAKE_LINK_DEF_FILE_FLAG)
|
|
libomp_append(ldflags_local "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}${LIBOMP_VERSION}.0"
|
|
IF_DEFINED CMAKE_C_OSX_CURRENT_VERSION_FLAG)
|
|
libomp_append(ldflags_local "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}${LIBOMP_VERSION}.0"
|
|
IF_DEFINED CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG)
|
|
libomp_append(ldflags_local -Wl,--warn-shared-textrel LIBOMP_HAVE_WARN_SHARED_TEXTREL_FLAG)
|
|
libomp_append(ldflags_local -Wl,--as-needed LIBOMP_HAVE_AS_NEEDED_FLAG)
|
|
libomp_append(ldflags_local "-Wl,--version-script=${LIBOMP_SRC_DIR}/exports_so.txt" LIBOMP_HAVE_VERSION_SCRIPT_FLAG)
|
|
libomp_append(ldflags_local -static-libgcc LIBOMP_HAVE_STATIC_LIBGCC_FLAG)
|
|
libomp_append(ldflags_local -Wl,-z,noexecstack LIBOMP_HAVE_Z_NOEXECSTACK_FLAG)
|
|
libomp_append(ldflags_local -Wl,-fini=__kmp_internal_end_fini LIBOMP_HAVE_FINI_FLAG)
|
|
libomp_append(ldflags_local -no-intel-extensions LIBOMP_HAVE_NO_INTEL_EXTENSIONS_FLAG)
|
|
libomp_append(ldflags_local -static-intel LIBOMP_HAVE_STATIC_INTEL_FLAG)
|
|
libomp_append(ldflags_local /SAFESEH LIBOMP_HAVE_SAFESEH_FLAG)
|
|
# Architectural linker flags
|
|
if(${IA32})
|
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
libomp_append(ldflags_local -m32 LIBOMP_HAVE_M32_FLAG)
|
|
endif()
|
|
libomp_append(ldflags_local -msse2 LIBOMP_HAVE_MSSE2_FLAG)
|
|
elseif(${MIC})
|
|
libomp_append(ldflags_local -mmic LIBOMP_HAVE_MMIC_FLAG)
|
|
libomp_append(ldflags_local -Wl,-x LIBOMP_HAVE_X_FLAG)
|
|
endif()
|
|
set(ldflags_local ${ldflags_local} ${LIBOMP_LDFLAGS})
|
|
libomp_setup_flags(ldflags_local)
|
|
set(${ldflags} ${ldflags_local} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Library flags
|
|
function(libomp_get_libflags libflags)
|
|
set(libflags_local)
|
|
libomp_append(libflags_local "${CMAKE_THREAD_LIBS_INIT}")
|
|
if(${IA32})
|
|
libomp_append(libflags_local -lirc_pic LIBOMP_HAVE_IRC_PIC_LIBRARY)
|
|
endif()
|
|
set(libflags_local ${libflags_local} ${LIBOMP_LIBFLAGS})
|
|
libomp_setup_flags(libflags_local)
|
|
set(${libflags} ${libflags_local} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Fortran flags
|
|
function(libomp_get_fflags fflags)
|
|
set(fflags_local)
|
|
if(${IA32})
|
|
libomp_append(fflags_local -m32 LIBOMP_HAVE_M32_FORTRAN_FLAG)
|
|
endif()
|
|
set(fflags_local ${fflags_local} ${LIBOMP_FFLAGS})
|
|
libomp_setup_flags(fflags_local)
|
|
set(${fflags} ${fflags_local} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Perl expand-vars.pl flags
|
|
function(libomp_get_evflags evflags)
|
|
set(evflags_local)
|
|
libomp_append(evflags_local "-D KMP_TYPE=\"${LIBOMP_LEGAL_TYPE}\"")
|
|
libomp_append(evflags_local "-D KMP_ARCH=\"${LIBOMP_LEGAL_ARCH}\"")
|
|
libomp_append(evflags_local "-D KMP_VERSION_MAJOR=${LIBOMP_VERSION}")
|
|
libomp_append(evflags_local "-D KMP_VERSION_MINOR=0")
|
|
libomp_append(evflags_local "-D KMP_VERSION_BUILD=${LIBOMP_BUILD_NUMBER}")
|
|
libomp_append(evflags_local "-D KMP_BUILD_DATE=\"${LIBOMP_DATE}\"")
|
|
if(${DEBUG_BUILD} OR ${RELWITHDEBINFO_BUILD})
|
|
libomp_append(evflags_local "-D KMP_DIAG=1")
|
|
libomp_append(evflags_local "-D KMP_DEBUG_INFO=1")
|
|
else()
|
|
libomp_append(evflags_local "-D KMP_DIAG=0")
|
|
libomp_append(evflags_local "-D KMP_DEBUG_INFO=0")
|
|
endif()
|
|
if(${LIBOMP_OMP_VERSION} EQUAL 40 OR ${LIBOMP_OMP_VERSION} GREATER 40)
|
|
libomp_append(evflags_local "-D OMP_VERSION=201307")
|
|
elseif(${LIBOMP_OMP_VERSION} EQUAL 30 OR ${LIBOMP_OMP_VERSION} GREATER 30)
|
|
libomp_append(evflags_local "-D OMP_VERSION=201107")
|
|
else()
|
|
libomp_append(evflags_local "-D OMP_VERSION=200505")
|
|
endif()
|
|
set(${evflags} ${evflags_local} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Perl generate-defs.pl flags (For Windows only)
|
|
function(libomp_get_gdflags gdflags)
|
|
set(gdflags_local)
|
|
if(${IA32})
|
|
set(libomp_gdflag_arch arch_32)
|
|
elseif(${INTEL64})
|
|
set(libomp_gdflag_arch arch_32e)
|
|
else()
|
|
set(libomp_gdflag_arch arch_${LIBOMP_ARCH})
|
|
endif()
|
|
libomp_append(gdflags_local "-D ${libomp_gdflag_arch}")
|
|
libomp_append(gdflags_local "-D msvc_compat")
|
|
libomp_append(gdflags_local "-D norm" NORMAL_LIBRARY)
|
|
libomp_append(gdflags_local "-D prof" PROFILE_LIBRARY)
|
|
libomp_append(gdflags_local "-D stub" STUBS_LIBRARY)
|
|
libomp_append(gdflags_local "-D HAVE_QUAD" LIBOMP_USE_QUAD_PRECISION)
|
|
if(${LIBOMP_OMP_VERSION} GREATER 41 OR ${LIBOMP_OMP_VERSION} EQUAL 41)
|
|
libomp_append(gdflags_local "-D OMP_41")
|
|
endif()
|
|
if(${LIBOMP_OMP_VERSION} GREATER 40 OR ${LIBOMP_OMP_VERSION} EQUAL 40)
|
|
libomp_append(gdflags_local "-D OMP_40")
|
|
endif()
|
|
if(${LIBOMP_OMP_VERSION} GREATER 30 OR ${LIBOMP_OMP_VERSION} EQUAL 30)
|
|
libomp_append(gdflags_local "-D OMP_30")
|
|
endif()
|
|
if(${DEBUG_BUILD} OR ${RELWITHDEBINFO_BUILD})
|
|
libomp_append(gdflags_local "-D KMP_DEBUG")
|
|
endif()
|
|
set(${gdflags} ${gdflags_local} PARENT_SCOPE)
|
|
endfunction()
|