summaryrefslogtreecommitdiffhomepage
path: root/cmake
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2024-03-02 22:57:02 +0100
committerAki <please@ignore.pl>2024-03-03 00:59:45 +0100
commitca18c5b1b5004ffa88b6b3b85cd038d1217c09c6 (patch)
tree1ba5a8734c96f892322cd65af7cf33041ba4cb68 /cmake
parente70158ea57302e2fa2d588b67fc8dc18265192eb (diff)
downloadstarshatter-ca18c5b1b5004ffa88b6b3b85cd038d1217c09c6.zip
starshatter-ca18c5b1b5004ffa88b6b3b85cd038d1217c09c6.tar.gz
starshatter-ca18c5b1b5004ffa88b6b3b85cd038d1217c09c6.tar.bz2
zlib sources removed from this tree
This, for whatever reason, breaks std::fs exception handling. All remaining external projects will be moved to use this approach soon. This is to prepare it for more new libraries which would otherwise make the tree grow even further.
Diffstat (limited to 'cmake')
-rw-r--r--cmake/modules/ApplyPatch.cmake11
-rw-r--r--cmake/modules/MakeAvailable.cmake16
-rw-r--r--cmake/modules/apply_patch.cmake.in5
3 files changed, 32 insertions, 0 deletions
diff --git a/cmake/modules/ApplyPatch.cmake b/cmake/modules/ApplyPatch.cmake
new file mode 100644
index 0000000..894d32e
--- /dev/null
+++ b/cmake/modules/ApplyPatch.cmake
@@ -0,0 +1,11 @@
+# Creates a wrapper for patch(1) utility that discards exit status in case the patch gets reapplied. This happens
+# because CMake applies patch step frequently with ExternalProject and FetchContent. Moreover, GNU patch does not follow
+# strict POSIX description of -N option making CMake think patching failed.
+#
+# For compatibility use with cmake(1) itself:
+#
+# COMMAND ${CMAKE_COMMAND} -D PATCH_FILE=something.patch -P ${PATCH_SCRIPT}
+
+find_program(PATCH_COMMAND patch DOC "POSIX-compliant patch utility")
+set(PATCH_SCRIPT ${CMAKE_BINARY_DIR}/apply_patch.cmake CACHE FILEPATH "CMake script wrapper for patch command")
+configure_file(${CMAKE_CURRENT_LIST_DIR}/apply_patch.cmake.in ${PATCH_SCRIPT} @ONLY)
diff --git a/cmake/modules/MakeAvailable.cmake b/cmake/modules/MakeAvailable.cmake
new file mode 100644
index 0000000..16e976c
--- /dev/null
+++ b/cmake/modules/MakeAvailable.cmake
@@ -0,0 +1,16 @@
+# Populates all declared FetchContent projects. Use this once after everything is set up:
+#
+# FetchContent_Declare(zlib ...)
+# FetchContent_Declare(libpng ...)
+# make_available(zlib libpng)
+
+function(make_available)
+ foreach(DEPNAME IN LISTS ARGN)
+ string(TOLOWER "${DEPNAME}" DEPNAME)
+ FetchContent_GetProperties(${DEPNAME})
+ if(NOT ${DEPNAME}_POPULATED)
+ FetchContent_Populate(${DEPNAME})
+ add_subdirectory(${${DEPNAME}_SOURCE_DIR} ${${DEPNAME}_BINARY_DIR} EXCLUDE_FROM_ALL)
+ endif()
+ endforeach()
+endfunction()
diff --git a/cmake/modules/apply_patch.cmake.in b/cmake/modules/apply_patch.cmake.in
new file mode 100644
index 0000000..61ce075
--- /dev/null
+++ b/cmake/modules/apply_patch.cmake.in
@@ -0,0 +1,5 @@
+# See ApplyPatch.cmake
+if(NOT PATCH_FILE)
+ message(FATAL_ERROR "no PATCH_FILE passed to the script")
+endif()
+execute_process(COMMAND @PATCH_COMMAND@ -Np1 INPUT_FILE ${PATCH_FILE})