From 39b36e332725498bcfa0a712b2a880b4abe8a174 Mon Sep 17 00:00:00 2001 From: Aki Date: Wed, 9 Feb 2022 01:16:33 +0100 Subject: Implemented initial downloadable binary resources for building datafiles --- cmake/modules/AddDatafile.cmake | 67 ++++++++++++++++++----------- cmake/modules/AddDownloadableResource.cmake | 49 +++++++++++++++++++++ cmake/modules/download_resource.cmake.in | 5 +++ 3 files changed, 95 insertions(+), 26 deletions(-) create mode 100644 cmake/modules/AddDownloadableResource.cmake create mode 100644 cmake/modules/download_resource.cmake.in (limited to 'cmake') 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 $) + set(DATAFILE_VAR PATH) + set(DATAFILE_PATHS $ENV{PATH}) + list(PREPEND DATAFILE_PATHS $) else() - set(FUNC_DATAFILE_VAR WINEPATH) - set(FUNC_DATAFILE_PATHS $ENV{WINEPATH}) - list(PREPEND FUNC_DATAFILE_PATHS $) - list(PREPEND FUNC_DATAFILE_PATHS $) + set(DATAFILE_VAR WINEPATH) + set(DATAFILE_PATHS $ENV{WINEPATH}) + list(PREPEND DATAFILE_PATHS $) + list(PREPEND DATAFILE_PATHS $) 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} - $ $ -mak - COMMENT "Creating datafile ${FUNC_DATAFILE_TARGET}" - WORKING_DIRECTORY ${FUNC_DATAFILE_DIRECTORY} + $ $ -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} + $ $ -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 + ) -- cgit v1.1