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