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 11# Setup the flags correctly for cmake (covert to string) 12# Pretty them up (STRIP any beginning and trailing whitespace, 13# remove duplicates, remove empty entries) 14macro(libomp_setup_flags flags) 15 if(NOT "${${flags}}" STREQUAL "") # if flags are empty, don't do anything 16 set(flags_local) 17 list(REMOVE_DUPLICATES ${flags}) # remove duplicates 18 list(REMOVE_ITEM ${flags} "") # remove empty items 19 libomp_list_to_string("${${flags}}" flags_local) 20 string(STRIP "${flags_local}" flags_local) 21 set(${flags} "${flags_local}") 22 endif() 23endmacro() 24 25# C++ compiler flags 26function(libomp_get_cxxflags cxxflags) 27 set(flags_local) 28 libomp_append(flags_local -fno-exceptions LIBOMP_HAVE_FNO_EXCEPTIONS_FLAG) 29 libomp_append(flags_local -fno-rtti LIBOMP_HAVE_FNO_RTTI_FLAG) 30 libomp_append(flags_local -Wno-class-memaccess LIBOMP_HAVE_WNO_CLASS_MEMACCESS_FLAG) 31 libomp_append(flags_local -Wno-covered-switch-default LIBOMP_HAVE_WNO_COVERED_SWITCH_DEFAULT_FLAG) 32 libomp_append(flags_local -Wno-frame-address LIBOMP_HAVE_WNO_FRAME_ADDRESS_FLAG) 33 libomp_append(flags_local -Wno-strict-aliasing LIBOMP_HAVE_WNO_STRICT_ALIASING_FLAG) 34 libomp_append(flags_local -Wstringop-overflow=0 LIBOMP_HAVE_WSTRINGOP_OVERFLOW_FLAG) 35 libomp_append(flags_local -Wno-stringop-truncation LIBOMP_HAVE_WNO_STRINGOP_TRUNCATION_FLAG) 36 libomp_append(flags_local -Wno-switch LIBOMP_HAVE_WNO_SWITCH_FLAG) 37 libomp_append(flags_local -Wno-uninitialized LIBOMP_HAVE_WNO_UNINITIALIZED_FLAG) 38 libomp_append(flags_local -Wno-unused-but-set-variable LIBOMP_HAVE_WNO_UNUSED_BUT_SET_VARIABLE_FLAG) 39 libomp_append(flags_local -Wno-return-type-c-linkage LIBOMP_HAVE_WNO_RETURN_TYPE_C_LINKAGE_FLAG) 40 libomp_append(flags_local -Wno-cast-qual LIBOMP_HAVE_WNO_CAST_QUAL_FLAG) 41 libomp_append(flags_local -Wno-int-to-void-pointer-cast LIBOMP_HAVE_WNO_INT_TO_VOID_POINTER_CAST_FLAG) 42 # libomp_append(flags_local -Wconversion LIBOMP_HAVE_WCONVERSION_FLAG) 43 libomp_append(flags_local /GS LIBOMP_HAVE_GS_FLAG) 44 libomp_append(flags_local /EHsc LIBOMP_HAVE_EHSC_FLAG) 45 libomp_append(flags_local /Oy- LIBOMP_HAVE_OY__FLAG) 46 libomp_append(flags_local -mrtm LIBOMP_HAVE_MRTM_FLAG) 47 # Intel(R) C Compiler flags 48 libomp_append(flags_local /Qsafeseh LIBOMP_HAVE_QSAFESEH_FLAG) 49 libomp_append(flags_local -Qoption,cpp,--extended_float_types LIBOMP_HAVE_EXTENDED_FLOAT_TYPES_FLAG) 50 libomp_append(flags_local -Qlong_double LIBOMP_HAVE_LONG_DOUBLE_FLAG) 51 libomp_append(flags_local -Qdiag-disable:177 LIBOMP_HAVE_DIAG_DISABLE_177_FLAG) 52 if(${RELEASE_BUILD} OR ${RELWITHDEBINFO_BUILD}) 53 libomp_append(flags_local -Qinline-min-size=1 LIBOMP_HAVE_INLINE_MIN_SIZE_FLAG) 54 endif() 55 # Architectural C and C++ flags 56 if(${IA32}) 57 if(CMAKE_SIZEOF_VOID_P EQUAL 8) 58 libomp_append(flags_local -m32 LIBOMP_HAVE_M32_FLAG) 59 endif() 60 libomp_append(flags_local /arch:SSE2 LIBOMP_HAVE_ARCH_SSE2_FLAG) 61 libomp_append(flags_local -msse2 LIBOMP_HAVE_MSSE2_FLAG) 62 libomp_append(flags_local -falign-stack=maintain-16-byte LIBOMP_HAVE_FALIGN_STACK_FLAG) 63 elseif(${MIC}) 64 libomp_append(flags_local -mmic LIBOMP_HAVE_MMIC_FLAG) 65 libomp_append(flags_local -ftls-model=initial-exec LIBOMP_HAVE_FTLS_MODEL_FLAG) 66 libomp_append(flags_local "-opt-streaming-stores never" LIBOMP_HAVE_OPT_STREAMING_STORES_FLAG) 67 endif() 68 set(cxxflags_local ${flags_local} ${LIBOMP_CXXFLAGS}) 69 libomp_setup_flags(cxxflags_local) 70 set(${cxxflags} ${cxxflags_local} PARENT_SCOPE) 71endfunction() 72 73# Assembler flags 74function(libomp_get_asmflags asmflags) 75 set(asmflags_local) 76 libomp_append(asmflags_local "-x assembler-with-cpp" LIBOMP_HAVE_X_ASSEMBLER_WITH_CPP_FLAG) 77 # Architectural assembler flags 78 if(${IA32}) 79 if(CMAKE_SIZEOF_VOID_P EQUAL 8) 80 libomp_append(asmflags_local -m32 LIBOMP_HAVE_M32_FLAG) 81 endif() 82 libomp_append(asmflags_local /safeseh LIBOMP_HAVE_SAFESEH_MASM_FLAG) 83 libomp_append(asmflags_local /coff LIBOMP_HAVE_COFF_MASM_FLAG) 84 elseif(${MIC}) 85 libomp_append(asmflags_local -mmic LIBOMP_HAVE_MMIC_FLAG) 86 endif() 87 set(asmflags_local ${asmflags_local} ${LIBOMP_ASMFLAGS}) 88 libomp_setup_flags(asmflags_local) 89 set(${asmflags} ${asmflags_local} PARENT_SCOPE) 90endfunction() 91 92# Linker flags 93function(libomp_get_ldflags ldflags) 94 set(ldflags_local) 95 libomp_append(ldflags_local "${CMAKE_LINK_DEF_FILE_FLAG}${CMAKE_CURRENT_BINARY_DIR}/${LIBOMP_LIB_NAME}.def" 96 IF_DEFINED CMAKE_LINK_DEF_FILE_FLAG) 97 libomp_append(ldflags_local "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}${LIBOMP_VERSION_MAJOR}.${LIBOMP_VERSION_MINOR}" 98 IF_DEFINED CMAKE_C_OSX_CURRENT_VERSION_FLAG) 99 libomp_append(ldflags_local "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}${LIBOMP_VERSION_MAJOR}.${LIBOMP_VERSION_MINOR}" 100 IF_DEFINED CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG) 101 libomp_append(ldflags_local -Wl,--warn-shared-textrel LIBOMP_HAVE_WARN_SHARED_TEXTREL_FLAG) 102 libomp_append(ldflags_local -Wl,--as-needed LIBOMP_HAVE_AS_NEEDED_FLAG) 103 libomp_append(ldflags_local "-Wl,--version-script=${LIBOMP_SRC_DIR}/exports_so.txt" LIBOMP_HAVE_VERSION_SCRIPT_FLAG) 104 libomp_append(ldflags_local -static-libgcc LIBOMP_HAVE_STATIC_LIBGCC_FLAG) 105 libomp_append(ldflags_local -Wl,-z,noexecstack LIBOMP_HAVE_Z_NOEXECSTACK_FLAG) 106 libomp_append(ldflags_local -no-intel-extensions LIBOMP_HAVE_NO_INTEL_EXTENSIONS_FLAG) 107 libomp_append(ldflags_local -static-intel LIBOMP_HAVE_STATIC_INTEL_FLAG) 108 libomp_append(ldflags_local /SAFESEH LIBOMP_HAVE_SAFESEH_FLAG) 109 # Architectural linker flags 110 if(${IA32}) 111 if(CMAKE_SIZEOF_VOID_P EQUAL 8) 112 libomp_append(ldflags_local -m32 LIBOMP_HAVE_M32_FLAG) 113 endif() 114 libomp_append(ldflags_local -msse2 LIBOMP_HAVE_MSSE2_FLAG) 115 elseif(${MIC}) 116 libomp_append(ldflags_local -mmic LIBOMP_HAVE_MMIC_FLAG) 117 libomp_append(ldflags_local -Wl,-x LIBOMP_HAVE_X_FLAG) 118 endif() 119 set(ldflags_local ${ldflags_local} ${LIBOMP_LDFLAGS}) 120 libomp_setup_flags(ldflags_local) 121 set(${ldflags} ${ldflags_local} PARENT_SCOPE) 122endfunction() 123 124# Library flags 125function(libomp_get_libflags libflags) 126 set(libflags_local) 127 libomp_append(libflags_local "${CMAKE_THREAD_LIBS_INIT}") 128 libomp_append(libflags_local "${LIBOMP_HWLOC_LIBRARY}" LIBOMP_USE_HWLOC) 129 if(${IA32}) 130 libomp_append(libflags_local -lirc_pic LIBOMP_HAVE_IRC_PIC_LIBRARY) 131 endif() 132 if(MINGW) 133 libomp_append(libflags_local -lpsapi LIBOMP_HAVE_PSAPI) 134 endif() 135 if(LIBOMP_HAVE_SHM_OPEN_WITH_LRT) 136 libomp_append(libflags_local -lrt) 137 endif() 138 if(${CMAKE_SYSTEM_NAME} MATCHES "DragonFly|FreeBSD") 139 libomp_append(libflags_local "-Wl,--no-as-needed" LIBOMP_HAVE_AS_NEEDED_FLAG) 140 libomp_append(libflags_local "-lm") 141 libomp_append(libflags_local "-Wl,--as-needed" LIBOMP_HAVE_AS_NEEDED_FLAG) 142 elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux|NetBSD") 143 libomp_append(libflags_local -lm) 144 endif() 145 set(libflags_local ${libflags_local} ${LIBOMP_LIBFLAGS}) 146 libomp_setup_flags(libflags_local) 147 libomp_string_to_list("${libflags_local}" libflags_local_list) 148 set(${libflags} ${libflags_local_list} PARENT_SCOPE) 149endfunction() 150 151# Fortran flags 152function(libomp_get_fflags fflags) 153 set(fflags_local) 154 if(${IA32}) 155 libomp_append(fflags_local -m32 LIBOMP_HAVE_M32_FORTRAN_FLAG) 156 endif() 157 set(fflags_local ${fflags_local} ${LIBOMP_FFLAGS}) 158 libomp_setup_flags(fflags_local) 159 set(${fflags} ${fflags_local} PARENT_SCOPE) 160endfunction() 161 162# Perl generate-defs.pl flags (For Windows only) 163function(libomp_get_gdflags gdflags) 164 set(gdflags_local) 165 if(${IA32}) 166 set(libomp_gdflag_arch arch_32) 167 elseif(${INTEL64}) 168 set(libomp_gdflag_arch arch_32e) 169 else() 170 set(libomp_gdflag_arch arch_${LIBOMP_ARCH}) 171 endif() 172 libomp_append(gdflags_local "-D ${libomp_gdflag_arch}") 173 libomp_append(gdflags_local "-D msvc_compat") 174 libomp_append(gdflags_local "-D norm" NORMAL_LIBRARY) 175 libomp_append(gdflags_local "-D prof" PROFILE_LIBRARY) 176 libomp_append(gdflags_local "-D stub" STUBS_LIBRARY) 177 libomp_append(gdflags_local "-D HAVE_QUAD" LIBOMP_USE_QUAD_PRECISION) 178 libomp_append(gdflags_local "-D USE_DEBUGGER" LIBOMP_USE_DEBUGGER) 179 if(${DEBUG_BUILD} OR ${RELWITHDEBINFO_BUILD}) 180 libomp_append(gdflags_local "-D KMP_DEBUG") 181 endif() 182 set(${gdflags} ${gdflags_local} PARENT_SCOPE) 183endfunction() 184