summaryrefslogtreecommitdiffhomepage
path: root/cmake
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2022-02-09 01:16:33 +0100
committerAki <please@ignore.pl>2022-02-09 01:17:01 +0100
commit39b36e332725498bcfa0a712b2a880b4abe8a174 (patch)
treec45fd00b88951aea934bd7ab80822d723387cf5e /cmake
parent879a5610a552c26cd5a8bbbf689444d89b71b0d8 (diff)
downloadstarshatter-39b36e332725498bcfa0a712b2a880b4abe8a174.zip
starshatter-39b36e332725498bcfa0a712b2a880b4abe8a174.tar.gz
starshatter-39b36e332725498bcfa0a712b2a880b4abe8a174.tar.bz2
Implemented initial downloadable binary resources for building datafiles
Diffstat (limited to 'cmake')
-rw-r--r--cmake/modules/AddDatafile.cmake67
-rw-r--r--cmake/modules/AddDownloadableResource.cmake49
-rw-r--r--cmake/modules/download_resource.cmake.in5
3 files changed, 95 insertions, 26 deletions
diff --git a/cmake/modules/AddDatafile.cmake b/cmake/modules/AddDatafile.cmake
index 6e98479..3bf2388 100644
--- a/cmake/modules/AddDatafile.cmake
+++ b/cmake/modules/AddDatafile.cmake
@@ -1,53 +1,68 @@
+# TODO: Update to match new AddDownloadableResource.
# Adds a target that creates a datafile archive containing all files under selected directory tree. For example:
#
# add_datafile(
# shatter
-# DIRECTORY shatter
+# SOURCE shatter
# OUTPUT shatter.dat
# )
#
# Will create 'shatter.dat' in the respective binary directory containing all files in 'shatter' subdirectory of current
-# source directory. DIRECTORY option's argument defaults to the target name. OUTPUT option's argument defaults to the
+# source directory. SOURCE option's argument defaults to the target name. OUTPUT option's argument defaults to the
# target name with ".dat" suffix.
#
# To create the archive Datafile.exe is used, so for non-Windows platforms an emulator that can run it is needed.
function(add_datafile)
- set(FUNC_DATAFILE_TARGET ${ARGV0})
+ set(DATAFILE_TARGET ${ARGV0})
cmake_parse_arguments(
PARSE_ARGV 1
- FUNC_DATAFILE
- ""
- "DIRECTORY;OUTPUT"
+ DATAFILE
""
+ "SOURCE;OUTPUT"
+ "RESOURCES"
)
- if(NOT DEFINED FUNC_DATAFILE_DIRECTORY)
- set(FUNC_DATAFILE_DIRECTORY ${FUNC_DATAFILE_TARGET})
+ if(NOT DEFINED DATAFILE_SOURCE)
+ set(DATAFILE_SOURCE ${DATAFILE_TARGET})
endif()
- if(NOT DEFINED FUNC_DATAFILE_OUTPUT)
- set(FUNC_DATAFILE_OUTPUT "${FUNC_DATAFILE_TARGET}.dat")
+ if(NOT DEFINED DATAFILE_OUTPUT)
+ set(DATAFILE_OUTPUT "${DATAFILE_TARGET}.dat")
endif()
- cmake_path(ABSOLUTE_PATH FUNC_DATAFILE_DIRECTORY NORMALIZE BASE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
- cmake_path(ABSOLUTE_PATH FUNC_DATAFILE_OUTPUT NORMALIZE BASE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+ cmake_path(ABSOLUTE_PATH DATAFILE_SOURCE NORMALIZE BASE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+ cmake_path(ABSOLUTE_PATH DATAFILE_OUTPUT NORMALIZE BASE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
if(CMAKE_HOST_SYSTEM_NAME MATCHES Windows)
- set(FUNC_DATAFILE_VAR PATH)
- set(FUNC_DATAFILE_PATHS $ENV{PATH})
- list(PREPEND FUNC_DATAFILE_PATHS $<TARGET_FILE_DIR:Zlib::zlib>)
+ set(DATAFILE_VAR PATH)
+ set(DATAFILE_PATHS $ENV{PATH})
+ list(PREPEND DATAFILE_PATHS $<TARGET_FILE_DIR:Zlib::zlib>)
else()
- set(FUNC_DATAFILE_VAR WINEPATH)
- set(FUNC_DATAFILE_PATHS $ENV{WINEPATH})
- list(PREPEND FUNC_DATAFILE_PATHS $<TARGET_FILE_DIR:Zlib::zlib>)
- list(PREPEND FUNC_DATAFILE_PATHS $<SHELL_PATH:${CMAKE_FIND_ROOT_PATH}/bin>)
+ set(DATAFILE_VAR WINEPATH)
+ set(DATAFILE_PATHS $ENV{WINEPATH})
+ list(PREPEND DATAFILE_PATHS $<TARGET_FILE_DIR:Zlib::zlib>)
+ list(PREPEND DATAFILE_PATHS $<SHELL_PATH:${CMAKE_FIND_ROOT_PATH}/bin>)
endif()
add_custom_command(
- OUTPUT ${FUNC_DATAFILE_OUTPUT}
- DEPENDS ${FUNC_DATAFILE_DIRECTORY}
+ OUTPUT ${DATAFILE_OUTPUT}
+ DEPENDS ${DATAFILE_SOURCE}
+ COMMAND ${CMAKE_COMMAND} -E rm -f ${DATAFILE_OUTPUT}
COMMAND
- ${CMAKE_COMMAND} -E env "${FUNC_DATAFILE_VAR}='${FUNC_DATAFILE_PATHS}'"
+ ${CMAKE_COMMAND} -E chdir ${DATAFILE_SOURCE}
+ ${CMAKE_COMMAND} -E env "${DATAFILE_VAR}='${DATAFILE_PATHS}'"
${CMAKE_CORSSCOMPILING_EMULATOR}
- $<TARGET_FILE:Datafile> $<SHELL_PATH:${FUNC_DATAFILE_OUTPUT}> -mak
- COMMENT "Creating datafile ${FUNC_DATAFILE_TARGET}"
- WORKING_DIRECTORY ${FUNC_DATAFILE_DIRECTORY}
+ $<TARGET_FILE:Datafile> $<SHELL_PATH:${DATAFILE_OUTPUT}> -mak
+ COMMENT "Creating datafile ${DATAFILE_TARGET}"
)
- add_custom_target(${FUNC_DATAFILE_TARGET} ALL DEPENDS ${FUNC_DATAFILE_OUTPUT})
+ foreach(RESOURCE IN ITEMS ${DATAFILE_RESOURCES})
+ cmake_path(ABSOLUTE_PATH RESOURCE NORMALIZE BASE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+ message(STATUS ${RESOURCE})
+ add_custom_command(
+ OUTPUT ${DATAFILE_OUTPUT} APPEND
+ DEPENDS ${RESOURCE}
+ COMMAND
+ ${CMAKE_COMMAND} -E chdir ${RESOURCE}
+ ${CMAKE_COMMAND} -E env "${DATAFILE_VAR}='${DATAFILE_PATHS}'"
+ ${CMAKE_CORSSCOMPILING_EMULATOR}
+ $<TARGET_FILE:Datafile> $<SHELL_PATH:${DATAFILE_OUTPUT}> -mak
+ )
+ endforeach()
+ add_custom_target(${DATAFILE_TARGET} ALL DEPENDS ${DATAFILE_OUTPUT})
endfunction()
diff --git a/cmake/modules/AddDownloadableResource.cmake b/cmake/modules/AddDownloadableResource.cmake
new file mode 100644
index 0000000..bbef5b7
--- /dev/null
+++ b/cmake/modules/AddDownloadableResource.cmake
@@ -0,0 +1,49 @@
+# TODO: Document this and how it interacts with AddDatafile.
+
+set(ADD_DOWNLOADABLE_RESOURCE_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/download_resource.cmake.in)
+function(add_downloadable_resource)
+ set(RESOURCE_TARGET ${ARGV0})
+ cmake_parse_arguments(
+ PARSE_ARGV 1
+ RESOURCE
+ ""
+ "ARCHIVE;DIRECTORY;BASE_URL;SHA1"
+ ""
+ )
+ if(NOT DEFINED RESOURCE_ARCHIVE)
+ set(RESOURCE_ARCHIVE ${RESOURCE_TARGET}.tar.xz)
+ endif()
+ if(NOT DEFINED RESOURCE_BASE_URL)
+ set(RESOURCE_BASE_URL https://ftp.ignore.pl/starshatter/resources/latest)
+ endif()
+ if(NOT DEFINED RESOURCE_DIRECTORY)
+ set(RESOURCE_DIRECTORY ${RESOURCE_TARGET}.d)
+ endif()
+ cmake_path(ABSOLUTE_PATH RESOURCE_ARCHIVE NORMALIZE BASE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+ cmake_path(ABSOLUTE_PATH RESOURCE_DIRECTORY NORMALIZE BASE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+ cmake_path(GET RESOURCE_ARCHIVE FILENAME RESOURCE_ARCHIVE_BASENAME)
+ string(REGEX REPLACE "/$" "" RESOURCE_BASE_URL "${RESOURCE_BASE_URL}")
+ set(DOWNLOAD_SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/download_${RESOURCE_TARGET}.cmake)
+ configure_file(${ADD_DOWNLOADABLE_RESOURCE_SCRIPT} ${DOWNLOAD_SCRIPT} @ONLY)
+ add_custom_target(
+ download_${RESOURCE_TARGET}
+ COMMENT "Downloading ${RESOURCE_TARGET}"
+ COMMAND ${CMAKE_COMMAND} -P ${DOWNLOAD_SCRIPT}
+ )
+ add_custom_target(
+ clean_downloaded_${RESOURCE_TARGET}
+ COMMENT "Removing downloaded ${RESOURCE_TARGET}"
+ COMMAND ${CMAKE_COMMAND} -E rm -f ${RESOURCE_ARCHIVE}
+ COMMAND ${CMAKE_COMMAND} -E remove_directory ${RESOURCE_DIRECTORY}
+ )
+ add_custom_command(
+ OUTPUT ${RESOURCE_DIRECTORY}
+ DEPENDS download_${RESOURCE_TARGET}
+ COMMENT "Unpacking ${RESOURCE_TARGET}"
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${RESOURCE_DIRECTORY}
+ COMMAND
+ ${CMAKE_COMMAND} -E chdir ${RESOURCE_DIRECTORY}
+ ${CMAKE_COMMAND} -E tar xf ${RESOURCE_ARCHIVE}
+ )
+ add_custom_target(${RESOURCE_TARGET} DEPENDS ${RESOURCE_DIRECTORY})
+endfunction()
diff --git a/cmake/modules/download_resource.cmake.in b/cmake/modules/download_resource.cmake.in
new file mode 100644
index 0000000..26a1347
--- /dev/null
+++ b/cmake/modules/download_resource.cmake.in
@@ -0,0 +1,5 @@
+file(
+ DOWNLOAD @RESOURCE_BASE_URL@/@RESOURCE_ARCHIVE_BASENAME@ @RESOURCE_ARCHIVE@
+ EXPECTED_HASH SHA1=@RESOURCE_SHA1@
+ SHOW_PROGRESS
+ )