CMake: automatically find programs used in build

Blender 3.6 and ImageMagick 6 versions are also enforced
This commit is contained in:
Matt Penny 2024-10-17 21:04:48 -04:00
parent 08368ffa25
commit 22ea93d19f
14 changed files with 133 additions and 51 deletions

View file

@ -8,30 +8,27 @@ add_compile_definitions(CMAKE)
set(USING_LIBULTRA TRUE)
# 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")
set(PYTHON3 "python")
set(SFZ2N64 "sfz2n64")
set(SOX "sox")
set(VPK "vpk")
set(VTF2PNG "vtf2png")
find_package(Blender 3.6 EXACT REQUIRED)
find_program(FFmpeg_EXECUTABLE ffmpeg REQUIRED)
find_program(Git_EXECUTABLE git REQUIRED)
find_package(ImageMagickConvert 6 EXACT REQUIRED)
find_program(NodeJs_EXECUTABLE node REQUIRED)
find_package(Python3 REQUIRED)
find_program(SFZ2N64_EXECUTABLE sfz2n64 REQUIRED)
find_program(Sox_EXECUTABLE sox REQUIRED)
find_program(VPK_EXECUTABLE vpk REQUIRED)
find_program(VTF2PNG_EXECUTABLE vtf2png REQUIRED)
set(SKELETOOL64 "${PROJECT_SOURCE_DIR}/skelatool64/skeletool64")
# Directories
set(ASSETS_DIR "${PROJECT_SOURCE_DIR}/assets")
set(PAK_DIR "${PROJECT_SOURCE_DIR}/portal_pak_dir")
set(PAK_MODIFIED_DIR "${PROJECT_SOURCE_DIR}/portal_pak_modified")
set(SRC_DIR "${PROJECT_SOURCE_DIR}/src")
set(VPK_DIR "${PROJECT_SOURCE_DIR}/vpk")
set(PAK_DIR "${PROJECT_SOURCE_DIR}/portal_pak_dir")
set(PAK_MODIFIED_DIR "${PROJECT_SOURCE_DIR}/portal_pak_modified")
add_subdirectory(${ASSETS_DIR})
add_subdirectory(${SRC_DIR})
add_subdirectory(${VPK_DIR})

View file

@ -538,7 +538,7 @@ build/assets/%.aifc: assets/%.sox portal_pak_dir/%.wav
build/assets/%.aifc: assets/%.jsox tools/sound/jsox.js portal_pak_dir/%.wav
@mkdir -p $(@D)
node tools/sound/jsox.js $< $(<:assets/%.jsox=portal_pak_dir/%.wav) $(@:%.aifc=%.wav)
node tools/sound/jsox.js sox $< $(<:assets/%.jsox=portal_pak_dir/%.wav) $(@:%.aifc=%.wav)
$(SFZ2N64) -o $@ $(@:%.aifc=%.wav)
build/assets/%.aifc: assets/%.msox portal_pak_dir/%.mp3

View file

@ -111,7 +111,7 @@ function(_add_texture_convert_command INPUT_FILE OUTPUT_FILE)
OUTPUT
${OUTPUT_FILE}
COMMAND
${VTF2PNG} ${ARGS} ${INPUT_FILE} ${OUTPUT_FILE}
${VTF2PNG_EXECUTABLE} ${ARGS} ${INPUT_FILE} ${OUTPUT_FILE}
COMMENT
"Converting $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
VERBATIM
@ -174,7 +174,7 @@ function(_add_extract_frame_command INPUT_FILE OUTPUT_FILE SECONDS)
COMMAND
${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
COMMAND
${FFMPEG}
${FFmpeg_EXECUTABLE}
-ss 00:00:${SECONDS}
-i ${INPUT_FILE}
-frames:v 1
@ -183,7 +183,8 @@ function(_add_extract_frame_command INPUT_FILE OUTPUT_FILE SECONDS)
-loglevel error
-y ${OUTPUT_FILE}
COMMAND
${IMAGEMAGICK_CONVERT} ${OUTPUT_FILE} -crop 491x369+265+202 -resize 160x120 ${OUTPUT_FILE}
${ImageMagickConvert_EXECUTABLE}
${OUTPUT_FILE} -crop 491x369+265+202 -resize 160x120 ${OUTPUT_FILE}
COMMENT
"Extracting frame from $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
VERBATIM
@ -256,8 +257,11 @@ function(_add_texture_transform_command TEXTURE_SCRIPT OUTPUT_LIST)
COMMAND
${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
COMMAND
${PYTHON3} ${CONVERT_ASSET}
${IMAGEMAGICK_CONVERT} ${INPUT_FILE} ${TEXTURE_SCRIPT} ${OUTPUT_FILE}
${Python3_EXECUTABLE} ${CONVERT_ASSET}
${ImageMagickConvert_EXECUTABLE}
${INPUT_FILE}
${TEXTURE_SCRIPT}
${OUTPUT_FILE}
WORKING_DIRECTORY
# TODO: Change this to PAK_MODIFIED_MATERIALS_DIR and update .ims files with relative path
${PROJECT_SOURCE_DIR}

View file

@ -111,7 +111,8 @@ function(_add_model_export_command MODEL_NAME OUTPUT_VARIABLE)
COMMAND
${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
COMMAND
${BLENDER_3_6} ${INPUT_FILE} --background --python ${EXPORT_FBX} -- ${OUTPUT_FILE}
${Blender_EXECUTABLE}
${INPUT_FILE} --background --python ${EXPORT_FBX} -- ${OUTPUT_FILE}
COMMENT
"Exporting $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
VERBATIM
@ -163,7 +164,7 @@ function(_add_model_generate_command MODEL_NAME MODEL_FBX OUTPUT_LIST)
COMMAND
${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
COMMAND
${PYTHON3} ${CONVERT_ASSET}
${Python3_EXECUTABLE} ${CONVERT_ASSET}
${SKELETOOL64}
${MODEL_FBX}
${MODEL_FLAGS}
@ -260,7 +261,7 @@ add_custom_command(
OUTPUT
${DYNAMIC_MODEL_LIST_H} ${DYNAMIC_MODEL_LIST_C}
COMMAND
${NODEJS} ${GEN_DYNAMIC_MODEL_LIST}
${NodeJs_EXECUTABLE} ${GEN_DYNAMIC_MODEL_LIST}
${DYNAMIC_MODEL_LIST_H}
${DYNAMIC_MODEL_HEADERS}
COMMENT
@ -277,7 +278,7 @@ add_custom_command(
OUTPUT
${DYNAMIC_ANIMATED_MODEL_LIST_H} ${DYNAMIC_ANIMATED_MODEL_LIST_C}
COMMAND
${NODEJS} ${GEN_DYNAMIC_ANIM_MODEL_LIST}
${NodeJs_EXECUTABLE} ${GEN_DYNAMIC_ANIM_MODEL_LIST}
${DYNAMIC_ANIMATED_MODEL_LIST_H}
${DYNAMIC_ANIMATED_MODEL_HEADERS}
COMMENT

View file

@ -30,7 +30,8 @@ function(_add_extract_video_audio_command INPUT_FILE OUTPUT_FILE)
COMMAND
${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
COMMAND
${FFMPEG} -i ${INPUT_FILE} -vn -loglevel error -y ${OUTPUT_FILE}
${FFmpeg_EXECUTABLE}
-i ${INPUT_FILE} -vn -loglevel error -y ${OUTPUT_FILE}
COMMENT
"Extracting audio from $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
VERBATIM
@ -209,7 +210,7 @@ function(_add_sound_transform_command_direct SOUND_NAME ARGS OUTPUT_LIST)
COMMAND
${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
COMMAND
${SOX} ${INPUT_FILE} ${ARGS} ${OUTPUT_FILE} -V1
${Sox_EXECUTABLE} ${INPUT_FILE} ${ARGS} ${OUTPUT_FILE} -V1
COMMENT
"Transforming $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
VERBATIM
@ -236,7 +237,7 @@ function(_add_sound_transform_command_sox SOUND_SCRIPT INPUT_FILE OUTPUT_FILE)
${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
COMMAND
${Python3_EXECUTABLE} ${CONVERT_ASSET}
${SOX} ${INPUT_FILE} ${SOUND_SCRIPT} ${OUTPUT_FILE} -V1
${Sox_EXECUTABLE} ${INPUT_FILE} ${SOUND_SCRIPT} ${OUTPUT_FILE} -V1
COMMENT
"Transforming $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
VERBATIM
@ -252,7 +253,8 @@ function(_add_sound_transform_command_jsox SOUND_SCRIPT INPUT_FILE OUTPUT_FILE)
OUTPUT
${OUTPUT_FILE}
COMMAND
${NODEJS} ${JSOX} ${SOUND_SCRIPT} ${INPUT_FILE} ${OUTPUT_FILE}
${NodeJs_EXECUTABLE} ${JSOX}
${Sox_EXECUTABLE} ${SOUND_SCRIPT} ${INPUT_FILE} ${OUTPUT_FILE}
COMMENT
"Transforming $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
VERBATIM
@ -299,7 +301,8 @@ function(_add_music_transform_command MUSIC_SCRIPT OUTPUT_LIST)
OUTPUT
${CONVERTED_FILE}
COMMAND
${FFMPEG} -y -i ${INPUT_FILE} ${CONVERTED_FILE}
${FFmpeg_EXECUTABLE}
-i ${INPUT_FILE} -loglevel error -y ${CONVERTED_FILE}
COMMENT
"Converting $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
VERBATIM
@ -353,7 +356,7 @@ function(_add_sound_convert_command INPUT_FILE OUTPUT_LIST)
OUTPUT
${OUTPUT_FILE}
COMMAND
${SFZ2N64} -o ${OUTPUT_FILE} ${INPUT_FILE}
${SFZ2N64_EXECUTABLE} -o ${OUTPUT_FILE} ${INPUT_FILE}
COMMENT
"Converting $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
VERBATIM
@ -427,7 +430,7 @@ add_custom_command(
OUTPUT
${SOUND_DATA_TABLE_FILES}
COMMAND
${SFZ2N64} -o ${SOUND_TABLE_SOUNDS} ${SOUND_TABLE_INPUTS}
${SFZ2N64_EXECUTABLE} -o ${SOUND_TABLE_SOUNDS} ${SOUND_TABLE_INPUTS}
COMMENT
"Generating sound data tables"
VERBATIM
@ -449,7 +452,8 @@ add_custom_command(
OUTPUT
${SOUND_LOOKUP_TABLE_FILES}
COMMAND
${NODEJS} ${GEN_SOUND_IDS} -o ${BUILD_AUDIO_DIR} -p SOUNDS_ ${SOUND_TABLE_INPUTS}
${NodeJs_EXECUTABLE} ${GEN_SOUND_IDS}
-o ${BUILD_AUDIO_DIR} -p SOUNDS_ ${SOUND_TABLE_INPUTS}
WORKING_DIRECTORY
# TODO: Update once script is refactored
${PROJECT_SOURCE_DIR}

View file

@ -73,7 +73,8 @@ function(_add_level_export_command LEVEL_NAME OUTPUT_VARIABLE)
COMMAND
${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
COMMAND
${BLENDER_3_6} ${INPUT_FILE} --background --python ${EXPORT_FBX} -- ${OUTPUT_FILE}
${Blender_EXECUTABLE}
${INPUT_FILE} --background --python ${EXPORT_FBX} -- ${OUTPUT_FILE}
COMMENT
"Exporting $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
VERBATIM
@ -167,7 +168,8 @@ add_custom_command(
OUTPUT
${LEVEL_LIST}
COMMAND
${NODEJS} ${GEN_LEVEL_LIST} ${LEVEL_LIST} ${LEVEL_GENERATED_HEADERS}
${NodeJs_EXECUTABLE} ${GEN_LEVEL_LIST}
${LEVEL_LIST} ${LEVEL_GENERATED_HEADERS}
WORKING_DIRECTORY
${LEVEL_LIST_OUT_DIR}
COMMENT

View file

@ -2,9 +2,9 @@
set(SUBTITLE_GENERATE "${PROJECT_SOURCE_DIR}/tools/subtitle_generate.py")
###############
## Subtitles ##
###############
##################
## Translations ##
##################
set(STRINGS
"${VPK_DIR}/Portal/hl2/resource/gameui_english.txt"
@ -58,7 +58,7 @@ add_custom_command(
${STRING_GENERATED_FILES}
COMMAND
# TODO: update script to have configurable output location
${PYTHON3} ${SUBTITLE_GENERATE}
${Python3_EXECUTABLE} ${SUBTITLE_GENERATE}
WORKING_DIRECTORY
# TODO: Update once script is refactored
${PROJECT_SOURCE_DIR}

33
cmake/FindBlender.cmake Normal file
View file

@ -0,0 +1,33 @@
##################
## Find Blender ##
##################
include(FindPackageHandleStandardArgs)
find_program(Blender_EXECUTABLE blender)
if(Blender_EXECUTABLE)
execute_process(
COMMAND
${Blender_EXECUTABLE} --version
RESULT_VARIABLE
VERSION_COMMAND_RC
OUTPUT_VARIABLE
VERSION_COMMAND_OUTPUT
ERROR_VARIABLE
VERSION_COMMAND_ERROR
)
if (NOT VERSION_COMMAND_RC EQUAL 0)
message(SEND_ERROR "Error getting Blender version: ${VERSION_COMMAND_ERROR}")
elseif(VERSION_COMMAND_OUTPUT MATCHES "^Blender ([0-9\\.]+)")
set(VERSION_NUMBER "${CMAKE_MATCH_1}")
endif()
endif()
find_package_handle_standard_args(Blender
REQUIRED_VARS
Blender_EXECUTABLE
VERSION_VAR
VERSION_NUMBER
)

View file

@ -0,0 +1,37 @@
##############################
## Find ImageMagick convert ##
##############################
# The built-in find module for ImageMagick uses find_path, which will
# fail since the N64 toolchain sets CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
# to "ONLY" (desirable). Use this simplified version instead.
include(FindPackageHandleStandardArgs)
find_program(ImageMagickConvert_EXECUTABLE convert)
if(ImageMagickConvert_EXECUTABLE)
execute_process(
COMMAND
${ImageMagickConvert_EXECUTABLE} -version
RESULT_VARIABLE
VERSION_COMMAND_RC
OUTPUT_VARIABLE
VERSION_COMMAND_OUTPUT
ERROR_VARIABLE
VERSION_COMMAND_ERROR
)
if (NOT VERSION_COMMAND_RC EQUAL 0)
message(SEND_ERROR "Error getting ImageMagick version: ${VERSION_COMMAND_ERROR}")
elseif(VERSION_COMMAND_OUTPUT MATCHES "^Version: ImageMagick ([-0-9\\.]+)")
set(VERSION_NUMBER "${CMAKE_MATCH_1}")
endif()
endif()
find_package_handle_standard_args(ImageMagickConvert
REQUIRED_VARS
ImageMagickConvert_EXECUTABLE
VERSION_VAR
VERSION_NUMBER
)

View file

@ -1,17 +1,17 @@
###################
## Find libultra ##
###################
include(FindPackageHandleStandardArgs)
find_path(Libultra_INCLUDE_DIR ultra64.h
PATH_SUFFIXES
"n64"
DOC
"Libultra include directory"
)
find_library(Libultra_LIBRARY ultra_rom
PATH_SUFFIXES
"n64"
DOC
"Libultra library file"
)
find_package_handle_standard_args(Libultra

View file

@ -5,7 +5,7 @@
# First try getting the version from git
execute_process(
COMMAND
${GIT} describe --tags HEAD
${Git_EXECUTABLE} describe --tags HEAD
RESULT_VARIABLE
GIT_DESCRIBE_RC
OUTPUT_VARIABLE

View file

@ -177,7 +177,10 @@ 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}
${CMAKE_COMMAND}
-D Git_EXECUTABLE=${Git_EXECUTABLE}
-D OUTPUT_FILE=${VERSION_H}
-P ${GEN_VERSION_HEADER}
WORKING_DIRECTORY
${PROJECT_SOURCE_DIR}
VERBATIM

View file

@ -2,19 +2,19 @@ const child_process = require('child_process');
const fs = require('fs');
const path = require('path');
if (process.argv.length !== 5) {
if (process.argv.length !== 6) {
console.log('Converts sound files using sox and a JSON file containing arguments.\n');
console.log(`Usage: ${process.argv[0]} ${process.argv[1]} JSOX_FILE INPUT_FILE OUTPUT_FILE`);
console.log(`Usage: ${process.argv[0]} ${process.argv[1]} SOX_PATH JSOX_FILE INPUT_FILE OUTPUT_FILE`);
process.exit(1);
}
const [argsFile, inputFile, outputFile] = process.argv.slice(2);
const [soxPath, argsFile, inputFile, outputFile] = process.argv.slice(2);
const fileContents = fs.readFileSync(argsFile);
const fileJSON = JSON.parse(fileContents);
fileJSON.forEach((command) => {
const commandText = `sox -V1 ${inputFile} ${command.flags || ''} ${outputFile} ${command.filters || ''}`;
const commandText = `${soxPath} -V1 ${inputFile} ${command.flags || ''} ${outputFile} ${command.filters || ''}`;
const outputParentDir = path.dirname(outputFile);
if (!fs.existsSync(outputParentDir)) {

View file

@ -2,6 +2,7 @@
## VPK extraction ##
####################
# TODO: automatic discovery of game files
# TODO: multiple languages
set(VPKS_PORTAL
Portal/portal/portal_pak_dir.vpk
@ -44,7 +45,7 @@ function(_add_vpk_extract_command VPK_LIST OUTPUT_LIST)
OUTPUT
${MAIN_VPK_STAMP}
COMMAND
${VPK} -x ${PAK_DIR} ${MAIN_VPK}
${VPK_EXECUTABLE} -x ${PAK_DIR} ${MAIN_VPK}
COMMAND
${CMAKE_COMMAND} -E touch ${MAIN_VPK_STAMP}
WORKING_DIRECTORY