summaryrefslogtreecommitdiffstats
path: root/cmake/scripts/common/ProjectMacros.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/scripts/common/ProjectMacros.cmake')
-rw-r--r--cmake/scripts/common/ProjectMacros.cmake89
1 files changed, 89 insertions, 0 deletions
diff --git a/cmake/scripts/common/ProjectMacros.cmake b/cmake/scripts/common/ProjectMacros.cmake
new file mode 100644
index 0000000..3a1910c
--- /dev/null
+++ b/cmake/scripts/common/ProjectMacros.cmake
@@ -0,0 +1,89 @@
+# This script holds macros which are project specific
+
+# Pack a skin xbt file
+# Arguments:
+# input input directory to pack
+# output output xbt file
+# On return:
+# xbt is added to ${XBT_FILES}
+function(pack_xbt input output)
+ file(GLOB_RECURSE MEDIA_FILES ${input}/*)
+ get_filename_component(dir ${output} DIRECTORY)
+ add_custom_command(OUTPUT ${output}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${dir}
+ COMMAND TexturePacker::TexturePacker::Executable
+ ARGS -input ${input}
+ -output ${output}
+ -dupecheck
+ DEPENDS ${MEDIA_FILES})
+ list(APPEND XBT_FILES ${output})
+ set(XBT_FILES ${XBT_FILES} PARENT_SCOPE)
+endfunction()
+
+# Add a skin to installation list, mirroring it in build tree, packing textures
+# Arguments:
+# skin skin directory
+# On return:
+# xbt is added to ${XBT_FILES}, data added to ${install_data}, mirror in build tree
+function(copy_skin_to_buildtree skin)
+ file(GLOB_RECURSE FILES ${skin}/*)
+ file(GLOB_RECURSE MEDIA_FILES ${skin}/media/*)
+ list(REMOVE_ITEM FILES ${MEDIA_FILES})
+ foreach(file ${FILES})
+ copy_file_to_buildtree(${file})
+ endforeach()
+ file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${dest}/media)
+ string(REPLACE "${CMAKE_SOURCE_DIR}/" "" dest ${skin})
+ pack_xbt(${skin}/media ${CMAKE_BINARY_DIR}/${dest}/media/Textures.xbt)
+
+ file(GLOB THEMES RELATIVE ${skin}/themes ${skin}/themes/*)
+ foreach(theme ${THEMES})
+ pack_xbt(${skin}/themes/${theme} ${CMAKE_BINARY_DIR}/${dest}/media/${theme}.xbt)
+ endforeach()
+
+ set(XBT_FILES ${XBT_FILES} PARENT_SCOPE)
+ set(install_data ${install_data} PARENT_SCOPE)
+endfunction()
+
+# Get GTest tests as CMake tests.
+# Copied from FindGTest.cmake
+# Thanks to Daniel Blezek <blezek@gmail.com> for the GTEST_ADD_TESTS code
+function(GTEST_ADD_TESTS executable extra_args)
+ if(NOT ARGN)
+ message(FATAL_ERROR "Missing ARGN: Read the documentation for GTEST_ADD_TESTS")
+ endif()
+ foreach(source ${ARGN})
+ # This assumes that every source file passed in exists. Consider using
+ # SUPPORT_SOURCES for source files which do not contain tests and might
+ # have to be generated.
+ file(READ "${source}" contents)
+ string(REGEX MATCHALL "TEST_?[F]?\\(([A-Za-z_0-9 ,]+)\\)" found_tests ${contents})
+ foreach(hit ${found_tests})
+ string(REGEX REPLACE ".*\\( *([A-Za-z_0-9]+), *([A-Za-z_0-9]+) *\\).*" "\\1.\\2" test_name ${hit})
+ add_test(${test_name} ${executable} --gtest_filter=${test_name} ${extra_args})
+ endforeach()
+ # Groups parametrized tests under a single ctest entry
+ string(REGEX MATCHALL "INSTANTIATE_TEST_CASE_P\\(([^,]+), *([^,]+)" found_tests2 ${contents})
+ foreach(hit ${found_tests2})
+ string(SUBSTRING ${hit} 24 -1 test_name)
+ string(REPLACE "," ";" test_name "${test_name}")
+ list(GET test_name 0 filter_name)
+ list(GET test_name 1 test_prefix)
+ string(STRIP ${test_prefix} test_prefix)
+ add_test(${test_prefix}.${filter_name} ${executable} --gtest_filter=${filter_name}* ${extra_args})
+ endforeach()
+ endforeach()
+endfunction()
+
+function(whole_archive output)
+ if(CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
+ set(${output} -Wl,--whole-archive ${ARGN} -Wl,--no-whole-archive PARENT_SCOPE)
+ elseif(CMAKE_CXX_COMPILER_ID STREQUAL AppleClang)
+ foreach(library ${ARGN})
+ list(APPEND ${output} -Wl,-force_load ${library})
+ set(${output} ${${output}} PARENT_SCOPE)
+ endforeach()
+ else()
+ set(${output} ${ARGN} PARENT_SCOPE)
+ endif()
+endfunction()