From bc2052527c7c251a5749dd83c9abfa647b2ebcab Mon Sep 17 00:00:00 2001 From: Matt Penny Date: Wed, 25 Sep 2024 22:24:16 -0400 Subject: [PATCH] Generate game version for CMake builds and fix generated level names With CMake, the game version is stored in a generated header file so dependencies on it are kept track of automatically. The game now compiles when using CMake but does not link. Generated code dependencies are not hooked up yet and corresponding targets need to be built manually. --- CMakeLists.txt | 4 +++ assets/test_chambers/CMakeLists.txt | 2 +- cmake/gen_version_header.cmake | 43 +++++++++++++++++++++++++++++ src/CMakeLists.txt | 28 +++++++++++++++++++ src/menu/landing_menu.c | 5 ++++ 5 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 cmake/gen_version_header.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e9ba52..5d560ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,15 @@ cmake_minimum_required(VERSION 3.28) project(portal64) +# TODO: remove when makefile is no longer in use +add_compile_definitions(CMAKE) + # Tools # TODO: find automatically # TODO: test on Windows set(BLENDER_3_6 "blender") set(FFMPEG "ffmpeg") +set(GIT "git") set(IMAGEMAGICK_CONVERT "convert") set(MPG123 "mpg123") set(NODEJS "node") diff --git a/assets/test_chambers/CMakeLists.txt b/assets/test_chambers/CMakeLists.txt index 69791d3..cb2feb8 100644 --- a/assets/test_chambers/CMakeLists.txt +++ b/assets/test_chambers/CMakeLists.txt @@ -103,7 +103,7 @@ function(_add_level_generate_command LEVEL_NAME LEVEL_FBX OUTPUT_LIST) --script ${EXPORT_LEVEL} --fixed-point-scale ${SCENE_SCALE} --model-scale ${MODEL_SCALE} - --name ${LEVEL_NAME} + --name ${LEVEL_NAME}/${LEVEL_NAME} ${MATERIAL_ARGS} --output ${OUTPUT_FILE_H} ${LEVEL_FBX} diff --git a/cmake/gen_version_header.cmake b/cmake/gen_version_header.cmake new file mode 100644 index 0000000..38af0c8 --- /dev/null +++ b/cmake/gen_version_header.cmake @@ -0,0 +1,43 @@ +################################# +## Get current project version ## +################################# + +# First try getting the version from git +execute_process( + COMMAND + ${GIT} describe --tags HEAD + RESULT_VARIABLE + GIT_DESCRIBE_RC + OUTPUT_VARIABLE + GIT_DESCRIBE_OUTPUT +) + +# If not in a git repo, fall back to exported version +if (NOT GIT_DESCRIBE_RC EQUAL 0) + file(READ version.txt GIT_DESCRIBE_OUTPUT) +endif() + +# Extract the version +string(STRIP "${GIT_DESCRIBE_OUTPUT}" GIT_DESCRIBE_OUTPUT) +string(REPLACE "-" ";" GIT_DESCRIBE_COMPONENTS "${GIT_DESCRIBE_OUTPUT}") + +list(LENGTH GIT_DESCRIBE_COMPONENTS COMPONENT_COUNT) +if (COMPONENT_COUNT GREATER_EQUAL 3) + # Not on a git tag, use commit hash (trim the "g" prefix) + list(GET GIT_DESCRIBE_COMPONENTS 2 GAME_VERSION) + string(SUBSTRING "${GAME_VERSION}" 1 -1 GAME_VERSION) +else() + # On a git tag, use it + list(GET GIT_DESCRIBE_COMPONENTS 0 GAME_VERSION) +endif() + +file(CONFIGURE + OUTPUT ${OUTPUT_FILE} + CONTENT +"#ifndef __GAME_VERSION_H__ +#define __GAME_VERSION_H__ + +#define GAME_VERSION \"${GAME_VERSION}\" + +#endif" +) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b20ec5a..6f91a5e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,6 +6,10 @@ target_include_directories(portal PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" ) +############### +## Game code ## +############### + # TODO: file sets, headers target_sources(portal PRIVATE audio/audio.c @@ -154,6 +158,30 @@ target_sources(portal PRIVATE util/rom.c ) +######################### +## Version information ## +######################### + +set(GEN_VERSION_HEADER "${PROJECT_SOURCE_DIR}/cmake/gen_version_header.cmake") +set(VERSION_H "${CMAKE_BINARY_DIR}/version.h") + +add_custom_target(gen_version_header + DEPENDS + ${GEN_VERSION_HEADER} + COMMAND + ${CMAKE_COMMAND} -D GIT=${GIT} -D OUTPUT_FILE=${VERSION_H} -P ${GEN_VERSION_HEADER} + WORKING_DIRECTORY + ${PROJECT_SOURCE_DIR} + VERBATIM +) + +# Make sure version header is always up to date +add_dependencies(portal gen_version_header) + +########################### +## Library-specific code ## +########################### + # TODO: move some of this into toolchain if (LIBULTRA) target_sources(portal PRIVATE diff --git a/src/menu/landing_menu.c b/src/menu/landing_menu.c index d3c39eb..1d676de 100644 --- a/src/menu/landing_menu.c +++ b/src/menu/landing_menu.c @@ -11,6 +11,11 @@ #include "cheat_codes.h" #include "./translations.h" +// TODO: remove when makefile is no longer in use +#ifdef CMAKE +#include "../build/version.h" +#endif + #define PORTAL_LOGO_X 30 #define PORTAL_LOGO_Y 74