File: util.cmake

package info (click to toggle)
freespace2 24.0.2%2Brepack-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid, trixie
  • size: 43,188 kB
  • sloc: cpp: 583,107; ansic: 21,729; python: 1,174; sh: 464; makefile: 248; xml: 181
file content (286 lines) | stat: -rw-r--r-- 9,331 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286

include(CheckCCompilerFlag)

FUNCTION(MAKE_CACHE_INTERNAL VARIABLE)
	SET(${VARIABLE} ${${VARIABLE}} CACHE INTERNAL "Internal cache variable")
ENDFUNCTION(MAKE_CACHE_INTERNAL)

FUNCTION(ADD_IMPORTED_LIB NAME INCLUDES LIBS)
	ADD_LIBRARY(${NAME} INTERFACE)

	target_link_libraries(${NAME} INTERFACE "${LIBS}")

	target_include_directories(${NAME} SYSTEM INTERFACE "${INCLUDES}")
ENDFUNCTION(ADD_IMPORTED_LIB)

MACRO(PKG_CONFIG_LIB_RESOLVE NAME OUTVAR)
	SET(${OUTVAR} "")
	foreach(lib ${${NAME}_LIBRARIES})
		find_library(${lib}_LIBRARY
					NAMES ${lib}
					HINTS ${${NAME}_LIBDIR} ${${NAME}_LIBRARY_DIRS}
		)

		if (NOT ${${lib}_LIBRARY} MATCHES ".*NOTFOUND.*")
			SET(${OUTVAR} ${${OUTVAR}} ${${lib}_LIBRARY})
		endif (NOT ${${lib}_LIBRARY} MATCHES ".*NOTFOUND.*")
	endforeach(lib)
ENDMACRO(PKG_CONFIG_LIB_RESOLVE)

# Copy from http://cmake.3232098.n2.nabble.com/RFC-cmake-analog-to-AC-SEARCH-LIBS-td7585423.html
INCLUDE (CheckFunctionExists)
INCLUDE (CheckLibraryExists)

MACRO (CMAKE_SEARCH_LIBS v_func v_lib func)
    CHECK_FUNCTION_EXISTS (${func} ${v_func})
    IF (NOT ${v_func})
        FOREACH (lib ${ARGN})
            CHECK_LIBRARY_EXISTS (${lib} ${func} "" "HAVE_${func}_IN_${lib}")
            IF (${HAVE_${func}_IN_${lib}})
                SET (${v_func} TRUE)
                SET (${v_lib} "${lib}" CACHE INTERNAL "Library providing ${func}")
                BREAK()
            ENDIF (${HAVE_${func}_IN_${lib}})
        ENDFOREACH (lib)
    ENDIF (NOT ${v_func})
ENDMACRO (CMAKE_SEARCH_LIBS)
# End copy

FUNCTION(EP_CHECK_FILE_EXISTS FILE OUTVAR TARGET NAME COMMAND WORKING_DIR)
	string (REPLACE ";" " " COMMAND_STR "${COMMAND}")
	IF(WIN32)
		# Do something special for windows...
		SET(COMMAND "cmd /C \"${COMMAND_STR}\"")
	ELSE(WIN32)
		SET(COMMAND "${COMMAND_STR}")
	ENDIF(WIN32)

	FILE(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/${NAME}" "
IF(EXISTS \"${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/${FILE}\")
	MESSAGE(\"'${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/${FILE}' already exists, nothing to be done.\")
ELSE(EXISTS \"${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/${FILE}\")
	execute_process(COMMAND ${COMMAND} WORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/${WORKING_DIR}\")
ENDIF(EXISTS \"${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/${FILE}\")
")

	SET(${OUTVAR} "${CMAKE_COMMAND}" -P ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/${NAME} PARENT_SCOPE)
ENDFUNCTION(EP_CHECK_FILE_EXISTS)

MACRO(COPY_FILE_TO_TARGET _target _file)
	if (IS_DIRECTORY "${_file}")
		get_filename_component(_dirName "${_file}" NAME)
		if (PLATFORM_MAC AND ("${_file}" MATCHES ".framework$"))
			# This is stupid, but it preserves symlinks, unlike copy_directory_if_different.
			# Otherwise we end up creating duplicate files in the copied framework.
			ADD_CUSTOM_COMMAND(
					TARGET ${_target} POST_BUILD
					COMMAND rsync -rlq "${_file}" "$<TARGET_FILE_DIR:${_target}>/${LIBRAY_DESTINATION}"
					COMMENT "copying '${_file}'..."
					VERBATIM
			)
		else()
			ADD_CUSTOM_COMMAND(
					TARGET ${_target} POST_BUILD
					COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different "${_file}" "$<TARGET_FILE_DIR:${_target}>/${LIBRAY_DESTINATION}/${_dirName}"
					COMMENT "copying '${_file}'..."
					VERBATIM
			)
		endif()
	else()
		ADD_CUSTOM_COMMAND(
				TARGET ${_target} POST_BUILD
				COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_file}" "$<TARGET_FILE_DIR:${_target}>/${LIBRAY_DESTINATION}/"
				COMMENT "copying '${_file}'..."
				VERBATIM
		)
	endif()
endmacro(COPY_FILE_TO_TARGET)

MACRO(COPY_FILES_TO_TARGET _target)
	ADD_CUSTOM_COMMAND(
		TARGET ${_target} POST_BUILD
		COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:${_target}>/${LIBRAY_DESTINATION}/"
		COMMENT "Creating '$<TARGET_FILE_DIR:${_target}>/${LIBRAY_DESTINATION}/'..."
		VERBATIM
	)

	FOREACH(file IN LISTS TARGET_COPY_FILES)
		COPY_FILE_TO_TARGET("${_target}" "${file}")
	ENDFOREACH(file)
ENDMACRO(COPY_FILES_TO_TARGET)

macro(_clear_old_libraries_state)
	set(is_debug FALSE)
	set(is_optimized FALSE)
endmacro(_clear_old_libraries_state)

function(CONVERT_OLD_LIBRARIES)
	_clear_old_libraries_state()
	set(out_list)
	foreach(lib ${ARGV})
		if ("${lib}" STREQUAL "debug")
			_clear_old_libraries_state()
			set(is_debug TRUE)
		elseif("${lib}" STREQUAL "optimized")
			_clear_old_libraries_state()
			set(is_optimized TRUE)
		elseif("${lib}" STREQUAL "general")
			_clear_old_libraries_state()
		else("${lib}" STREQUAL "debug")
			# Expecting normal library
			if(is_debug)
				list(APPEND out_list "$<$<CONFIG:Debug>:${lib}>" "$<$<CONFIG:FastDebug>:${lib}>")
			elseif(is_optimized)
				list(APPEND out_list "$<$<CONFIG:Release>:${lib}>")
			else(is_debug)
				list(APPEND out_list "${lib}")
			endif(is_debug)
		endif("${lib}" STREQUAL "debug")
	endforeach(lib)

	set(CONVERTED_LIBRARIES ${out_list} PARENT_SCOPE)
endfunction(CONVERT_OLD_LIBRARIES)

macro(set_policy policy value)
	if (POLICY ${policy})
		cmake_policy(SET ${policy} ${value})
	endif ()
endmacro(set_policy)

macro(set_if_not_defined VAR VALUE)
    if (NOT DEFINED ${VAR})
        set(${VAR} ${VALUE})
    endif()
endmacro(set_if_not_defined)

function(set_precompiled_header _target _headerPath)
	if (COMMAND target_precompile_headers)
		target_compile_definitions(${_target} PRIVATE CMAKE_PCH)
		target_precompile_headers(${_target} PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${_headerPath}>")
	else()
		if (ENABLE_COTIRE)
			message("${_headerPath}")
			set_target_properties(${_target} PROPERTIES COTIRE_CXX_PREFIX_HEADER_INIT "${_headerPath}")

			# Disable unity build as it doesn't work well for us
			set_target_properties(${_target} PROPERTIES COTIRE_ADD_UNITY_BUILD FALSE)

			cotire(${_target})
		else()
			if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
				target_compile_options(${_target} PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:-include${_headerPath}>")
			elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
				target_compile_options(${_target} PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:/FI ${_headerPath}>")
			elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
				target_compile_options(${_target} PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:-include${_headerPath}>")
			elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
				target_compile_options(${_target} PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:-include${_headerPath}>")
			ELSE()
				MESSAGE("Unknown compiler for global includes. This will probably break the build.")
			ENDIF()
		endif()
	endif()
endfunction()

macro(add_target_copy_files)
	foreach(file ${ARGN})
		if (IS_DIRECTORY "${file}")
			INSTALL(DIRECTORY ${file}
					DESTINATION ${LIBRAY_DESTINATION}
					)
		else()
			INSTALL(FILES ${file}
					DESTINATION ${LIBRAY_DESTINATION}
					)
		endif()

		SET(TARGET_COPY_FILES ${TARGET_COPY_FILES} ${file} CACHE INTERNAL "" FORCE)
	endforeach()
endmacro(add_target_copy_files)

function(detect_simd_instructions _out_var)
	if(CMAKE_CROSSCOMPILING)
		set(${_out_var} "" PARENT_SCOPE)
	else()
		message(STATUS "Detecting SIMD features of current CPU...")
		TRY_RUN(RUN_RESULT COMPILE_RESULT "${CMAKE_BINARY_DIR}/temp" "${CMAKE_SOURCE_DIR}/cmake/cpufeatures.cpp"
			RUN_OUTPUT_VARIABLE FEATURE_OUTPUT)
		
		IF(COMPILE_RESULT)
			MESSAGE(STATUS "Detected compatibility for the ${FEATURE_OUTPUT} feature set.")
			SET(${_out_var} ${FEATURE_OUTPUT} PARENT_SCOPE)
		ELSE(COMPILE_RESULT)
			MESSAGE("Compilation of CPU feature detector failed, please set the instruction set manually.")
			set(${_out_var} "" PARENT_SCOPE)
		ENDIF(COMPILE_RESULT)
	endif()
endfunction()

function (check_linker_flag _flag _out_var)
	SET(CMAKE_REQUIRED_LINK_OPTIONS "${_flag}")
	CHECK_C_COMPILER_FLAG("" ${_out_var})
endfunction(check_linker_flag)

# Suppresses warnings for the specified target
function(suppress_warnings _target)
    if (MSVC)
        target_compile_options(${_target} PRIVATE "/W0")
	else()
        # Assume everything else uses GCC style options
		target_compile_options(${_target} PRIVATE "-w")
    endif()
endfunction(suppress_warnings)

# Suppresses warnings for the specified files
function(suppress_file_warnings)
	if (MSVC)
		set_source_files_properties(
				${ARGN}
			PROPERTIES
				COMPILE_FLAGS "/W0")
	else()
		# Assume everything else uses GCC style options
		set_source_files_properties(
				${ARGN}
			PROPERTIES
				COMPILE_FLAGS "-w")
	endif()
endfunction(suppress_file_warnings)


function(list_target_dependencies _target _out_var)
	set(out_list)
	set(work_libs ${_target})
	list(LENGTH work_libs libs_length)

	while(libs_length GREATER 0)
		list(GET work_libs 0 current)
		list(REMOVE_AT work_libs 0)
		list(APPEND out_list ${current})

		get_target_property(current_libs ${current} INTERFACE_LINK_LIBRARIES)

		if(current_libs)
			foreach(lib ${current_libs})
				if (TARGET ${lib})
					list(APPEND work_libs ${lib})
				endif (TARGET ${lib})
			endforeach(lib)
		endif(current_libs)

		list(LENGTH work_libs libs_length)
	endwhile(libs_length GREATER 0)

	list(REMOVE_DUPLICATES out_list)
	set(${_out_var} ${out_list} PARENT_SCOPE)
endfunction(list_target_dependencies)

macro(add_file_folder FOLDER_NAME)
	string(MAKE_C_IDENTIFIER "${FOLDER_NAME}" VARIABLE_NAME)
	set(files_${VARIABLE_NAME} ${files_${VARIABLE_NAME}} ${ARGN})

	string(REPLACE "/" "\\" FIXED_FOLDER_FILE "${FOLDER_NAME}")

	source_group("${FIXED_FOLDER_FILE}" FILES ${ARGN})
	set(source_files ${source_files} ${ARGN})
endmacro(add_file_folder)