summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt155
1 files changed, 105 insertions, 50 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3cc6fbf87..663b507b2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -176,7 +176,7 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# Set LUS vars
################################################################################
-# Enable the Gfx debugger in LUS to use libgfxd from ZAPDTR
+# Enable the Gfx debugger in LUS, which fetches its own libgfxd
set(GFX_DEBUG_DISASSEMBLER ON)
# Tell LUS we're using F3DEX_GBI_2 (in a way that doesn't break libgfxd)
@@ -192,75 +192,133 @@ set(INCLUDE_MPQ_SUPPORT ON)
add_compile_definitions(CONTROLLERBUTTONS_T=uint32_t)
################################################################################
-# Sub-projects
+# Torch (ROM asset extraction)
################################################################################
-add_subdirectory(libultraship ${CMAKE_BINARY_DIR}/libultraship)
-target_compile_options(libultraship PRIVATE "${WARNING_OVERRIDE}")
-target_compile_definitions(libultraship PUBLIC INCLUDE_MPQ_SUPPORT)
-add_subdirectory(ZAPDTR/ZAPD ${CMAKE_BINARY_DIR}/ZAPD)
-add_subdirectory(OTRExporter)
-add_subdirectory(soh)
-
-set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE_TERMINAL YES)
-set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.desktop")
-set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon.png")
-
-if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
-install(FILES "${CMAKE_BINARY_DIR}/soh/soh.o2r" DESTINATION . COMPONENT ship)
-install(TARGETS ZAPD DESTINATION ./assets/extractor COMPONENT extractor)
-install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets COMPONENT extractor)
-install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/xml COMPONENT extractor)
+find_package(ZLIB REQUIRED)
+
+include(FetchContent)
+
+# Workaround: torch declares spdlog without OVERRIDE_FIND_PACKAGE and the first declaration
+# wins, which leaves libultraship's find_package(spdlog REQUIRED) with no config to find.
+# Declaring it here first keeps that working. See HarbourMasters/Torch#233.
+find_package(spdlog QUIET)
+if(NOT spdlog_FOUND)
+ FetchContent_Declare(
+ spdlog
+ GIT_REPOSITORY https://github.com/gabime/spdlog.git
+ GIT_TAG v1.16.0
+ OVERRIDE_FIND_PACKAGE
+ )
+ FetchContent_MakeAvailable(spdlog)
endif()
-if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
-install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/ COMPONENT ship)
-install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/xml COMPONENT ship)
-endif()
+set(USE_STANDALONE OFF CACHE BOOL "" FORCE) # static lib, no CLI
+set(PORT_VERSION_ENDIANNESS ON CACHE BOOL "" FORCE) # 7-byte portVersion
+set(ROM_CRC_BSWAP OFF CACHE BOOL "" FORCE)
+set(BUILD_UI OFF CACHE BOOL "" FORCE) # would fetch a 2nd libultraship
+set(BUILD_STORMLIB OFF CACHE BOOL "" FORCE) # target name clashes with LUS's `storm`
+set(BUILD_NAUDIO OFF CACHE BOOL "" FORCE)
+
+set(BUILD_OOT ON CACHE BOOL "" FORCE)
+foreach(_torch_game SM64 MK64 SF64 PM64 FZERO BK64 MARIO_ARTIST)
+ set(BUILD_${_torch_game} OFF CACHE BOOL "" FORCE)
+endforeach()
+
+add_subdirectory(torch)
+
+# Build-time ROM extraction. soh links torch as a static library, which compiles out torch's
+# own CLI, so this supplies an entry point around the same code the game runs.
+add_executable(soh-torch EXCLUDE_FROM_ALL
+ ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/tools/torch-cli/main.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/soh/soh/Extractor/TorchExtract.cpp
+)
+target_include_directories(soh-torch PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/soh/soh/Extractor)
+target_link_libraries(soh-torch PRIVATE torch)
-find_package(Python3 COMPONENTS Interpreter)
+add_executable(soh-o2r-packer EXCLUDE_FROM_ALL
+ ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/tools/soh-o2r-packer/main.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/tools/soh-o2r-packer/PngTexture.cpp
+)
+target_link_libraries(soh-o2r-packer PRIVATE torch)
-# Target to generate OTRs
+# Target to generate OTRs. SOH_ROM_PATH takes roms and/or directories of roms; torch names each
+# archive (oot.o2r or oot-mq.o2r) from its hash, so a vanilla and a master quest rom produce both
+# in one run. soh.o2r comes from GenerateSohOtr, chained below.
+set(SOH_ROM_PATH "${CMAKE_SOURCE_DIR}/roms" CACHE STRING "Roms, or directories of roms, to extract")
add_custom_target(
ExtractAssets
- COMMAND ${CMAKE_COMMAND} -E rm -f oot.o2r oot-mq.o2r soh.o2r
-
- # copy LUS default shaders into assets/custom
- COMMAND ${CMAKE_COMMAND} -E rm -r -f ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/fast/shaders/ ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/
-
- COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$<TARGET_FILE:ZAPD>" --non-interactive --xml-root assets/xml --custom-otr-file soh.o2r "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}"
- COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$<TARGET_FILE_DIR:ZAPD>" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/soh
+ COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_BINARY_DIR}/soh/oot.o2r ${CMAKE_BINARY_DIR}/soh/oot-mq.o2r
+ COMMAND $<TARGET_FILE:soh-torch>
+ --src ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/yml
+ --dest ${CMAKE_BINARY_DIR}/soh
+ --version ${CMAKE_PROJECT_VERSION}
+ ${SOH_ROM_PATH}
+ # torch caches extraction state next to the archive; drop it so the game's directory stays clean
+ COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_BINARY_DIR}/soh/torch.hash.yml
COMMENT "Running asset extraction..."
- DEPENDS ZAPD
- BYPRODUCTS oot.o2r ${CMAKE_SOURCE_DIR}/oot.o2r oot-mq.o2r ${CMAKE_SOURCE_DIR}/oot-mq.o2r ${CMAKE_SOURCE_DIR}/soh.o2r
+ DEPENDS soh-torch
+ BYPRODUCTS ${CMAKE_BINARY_DIR}/soh/oot.o2r ${CMAKE_BINARY_DIR}/soh/oot-mq.o2r
)
-# Target to generate headers
+# Target to generate headers. Torch has no OoT header exporter yet -- every REGISTER in
+# src/factories/oot/ is REGISTER(Binary, ...) -- and it emits no `#define d<sym>` line, which
+# soh source references ~24k times. Kept so the failure explains itself.
add_custom_target(
ExtractAssetHeaders
- COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$<TARGET_FILE:ZAPD>" --non-interactive --xml-root assets/xml --gen-headers
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/soh
- COMMENT "Generating asset headers..."
- DEPENDS ZAPD
+ COMMAND ${CMAKE_COMMAND} -E echo "ExtractAssetHeaders is currently unavailable: torch does not emit OoT asset headers yet."
+ COMMAND ${CMAKE_COMMAND} -E echo "The checked-in headers under soh/assets are unaffected. See docs/BUILDING.md."
+ COMMAND ${CMAKE_COMMAND} -E false
)
# Target to generate only soh.o2r
add_custom_target(
GenerateSohOtr
- COMMAND ${CMAKE_COMMAND} -E rm -f soh.o2r
-
# copy LUS default shaders into assets/custom
COMMAND ${CMAKE_COMMAND} -E rm -r -f ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/fast/shaders/ ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/
- COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$<TARGET_FILE:ZAPD>" --norom --custom-otr-file soh.o2r "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}"
- COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$<TARGET_FILE_DIR:ZAPD>" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -DONLYSOHOTR=On -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/soh
+ COMMAND $<TARGET_FILE:soh-o2r-packer>
+ ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom
+ ${CMAKE_BINARY_DIR}/soh/soh.o2r
+ ${CMAKE_PROJECT_VERSION}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/soh/soh.o2r ${CMAKE_CURRENT_SOURCE_DIR}/soh.o2r
COMMENT "Generating soh.o2r..."
- DEPENDS ZAPD
+ DEPENDS soh-o2r-packer
+ BYPRODUCTS ${CMAKE_SOURCE_DIR}/soh.o2r ${CMAKE_BINARY_DIR}/soh/soh.o2r
)
+# ExtractAssets produced soh.o2r as well as the rom archives, so keep doing that.
+add_dependencies(ExtractAssets GenerateSohOtr)
+
+# The asset tools only need torch, so a tools-only configure can skip libultraship and soh
+# entirely -- that is all CI needs to produce soh.o2r.
+option(SOH_TOOLS_ONLY "Configure only the asset tools, skipping libultraship and soh" OFF)
+if(SOH_TOOLS_ONLY)
+ file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/soh)
+ return()
+endif()
+
+################################################################################
+# Sub-projects
+################################################################################
+add_subdirectory(libultraship ${CMAKE_BINARY_DIR}/libultraship)
+target_compile_options(libultraship PRIVATE "${WARNING_OVERRIDE}")
+target_compile_definitions(libultraship PUBLIC INCLUDE_MPQ_SUPPORT)
+add_subdirectory(soh)
+
+set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE_TERMINAL YES)
+set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.desktop")
+set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon.png")
+
+if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
+install(FILES "${CMAKE_BINARY_DIR}/soh/soh.o2r" DESTINATION . COMPONENT ship)
+install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/yml/" DESTINATION ./assets COMPONENT ship)
+endif()
+
+if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
+install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/yml/" DESTINATION ./assets COMPONENT ship)
+endif()
+
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
find_package(ImageMagick COMPONENTS convert)
if (ImageMagick_FOUND)
@@ -290,12 +348,9 @@ add_custom_target(CreateOSXIcons
)
add_dependencies(soh CreateOSXIcons)
-install(TARGETS ZAPD DESTINATION ${CMAKE_BINARY_DIR}/assets)
-
set(PROGRAM_PERMISSIONS_EXECUTE OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ)
-install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/)
-install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/xml)
+install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/yml/" DESTINATION ./assets)
# Rename the installed soh binary to drop the macos suffix
INSTALL(CODE "FILE(RENAME \${CMAKE_INSTALL_PREFIX}/../MacOS/soh-macos \${CMAKE_INSTALL_PREFIX}/../MacOS/soh)")