Morpheus/cmake/morpheus_build_utils.cmake
2021-07-25 12:34:02 -07:00

299 lines
12 KiB
CMake

function(libgba_fat_patch)
if(WIN32)
find_program(PYTHON3 python)
else()
find_program(PYTHON3 python3)
find_program(SUDO sudo)
endif()
if(NOT PYTHON3)
message(FATAL_ERROR "python3 - not found")
endif()
add_custom_target(libgba_fat_patch_target ALL
COMMAND ${PYTHON3} ${CMAKE_CURRENT_SOURCE_DIR}/buildtools/gba_fat_patch/gba_fat_patch.py
VERBATIM)
endfunction()
function(add_gba_executable target)
get_filename_component(target_name ${target} NAME_WE)
add_custom_target(${target_name}.gba ALL
COMMAND ${OBJCOPY} -v -O binary ${target} ${target_name}.gba
COMMAND ${GBAFIX} ${target_name}.gba
DEPENDS ${target}
VERBATIM
)
set_target_properties(${target} PROPERTIES LINK_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${target_name}.gba)
endfunction()
function(add_nds_executable target game_icon title subtitle1 subtitle2)
get_filename_component(target_name ${target} NAME_WE)
add_custom_target(${target_name}.nds ALL
COMMAND ${NDSTOOL} -c ${target_name}.nds -9 ${target} -b ${CMAKE_CURRENT_SOURCE_DIR}/${game_icon}
"${title};${subtitle1};${subtitle2}"
DEPENDS ${target}
VERBATIM
)
#set_target_properties(${target} PROPERTIES LINK_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${target_name}.nds)
endfunction()
function(add_nds_executable_with_nitrofs_dir target game_icon title subtitle1 subtitle2 nitrofs_dir)
get_filename_component(target_name ${target} NAME_WE)
add_custom_target(${target_name}.nds ALL SOURCES
COMMAND ${NDSTOOL} -c ${target_name}.nds -9 ${target} -b ${CMAKE_CURRENT_SOURCE_DIR}/${game_icon}
"${title};${subtitle1};${subtitle2}" -d ${nitrofs_dir}
DEPENDS ${target}
VERBATIM
)
#set_target_properties(${target} PROPERTIES LINK_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${target_name}.nds)
endfunction()
function(execute_grit_sprites png_files png_image_sizes is_4bpp)
set(png_files ${${png_files}})
set(png_image_sizes ${${png_image_sizes}})
#message(STATUS "execute grit called with png_files: ${png_files}\n with png_image_sizes: ${png_image_sizes}\n and is_4bpp:${is_4bpp}")
list(LENGTH png_files png_files_length)
list(LENGTH png_image_sizes png_image_sizes_length)
if(NOT png_files_length EQUAL png_image_sizes_length)
message(FATAL_ERROR "The length of the png_files list (${png_files_length}) does "
"NOT equal the length of the PNG4_IMAGE_SIZES list (${png_image_sizes_length})."
" Are you missing a size or image path argument for a 4bpp PNG?")
endif()
if(is_4bpp)
set(bpp_flag "4")
else()
set(bpp_flag "8")
endif()
math(EXPR png_files_length "${png_files_length} - 1")
foreach(iteration RANGE ${png_files_length})
list(GET png_files ${iteration} png_file)
list(GET png_image_sizes ${iteration} png_image_size)
string(TOUPPER ${png_image_size} png_image_size)
string(REPLACE "X" ";" png_image_size ${png_image_size})
list(LENGTH png_image_size png_image_size_len)
if(NOT png_image_size_len EQUAL 2)
message(FATAL_ERROR "Invalid image size: ${png_image_size}")
endif()
list(GET png_image_size 0 png_image_width)
list(GET png_image_size 1 png_image_length)
math(EXPR png_image_width_tiles "${png_image_width} / 8")
math(EXPR png_image_length_tiles "${png_image_length} / 8")
#message(STATUS "${png_image_width_tiles}x${png_image_length_tiles}")
get_filename_component(png_file_name_path ${png_file} NAME_WLE)
add_custom_command(OUTPUT ${png_file_name_path}.o
COMMAND ${GRIT} ${png_file} -gB${bpp_flag} -Mw ${png_image_width_tiles}
-Mh ${png_image_length_tiles}
COMMAND ${CMAKE_AS} ${png_file_name_path}.s -o${png_file_name_path}.o
VERBATIM)
endforeach()
endfunction()
function(execute_grit_tilemaps png_files is_4bpp palette_bank_num is_affine)
foreach(png_file IN ${${png_files}})
execute_grit_tilemap(png_file ${is_4bpp} ${palette_bank_num} ${is_affine})
endforeach()
endfunction()
function(execute_grit_1bpp_font png_file)
get_filename_component(png_file_name_path ${png_file} NAME_WLE)
add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/assets/${png_file_name_path}.c
${CMAKE_CURRENT_SOURCE_DIR}/assets/${png_file_name_path}.h
COMMAND ${GRIT} ${png_file} -gB1 -ftc -pn2 -o ${CMAKE_CURRENT_SOURCE_DIR}/assets/${png_file_name_path}
VERBATIM)
endfunction()
function(execute_grit_4bpp_font png_file)
get_filename_component(png_file_name_path ${png_file} NAME_WLE)
add_custom_command(OUTPUT ${png_file_name_path}.o ${png_file_name_path}.h
COMMAND ${GRIT} ${png_file} -gB4
COMMAND ${CMAKE_AS} ${png_file_name_path}.s -o${png_file_name_path}.o
VERBATIM)
endfunction()
function(execute_grit_tilemap png_file is_4bpp palette_bank_num is_affine)
if(is_4bpp)
set(bpp_flag "4")
set(tile_map_flag "tpf")
else()
set(bpp_flag "8")
set(tile_map_flag "tf")
endif()
if(is_affine)
set(tile_map_flag "t")
endif()
get_filename_component(png_file_name_path ${png_file} NAME_WLE)
add_custom_command(OUTPUT ${png_file_name_path}.o
COMMAND ${GRIT} ${png_file} -gB${bpp_flag} -mR${tile_map_flag} -mp${palette_bank_num}
COMMAND ${CMAKE_AS} ${png_file_name_path}.s -o${png_file_name_path}.o
VERBATIM)
endfunction()
function(convert_tilemap_bin_image_file bin_file build_dir width height palette_bank_num image_file is_8bpp is_affine)
if(WIN32)
find_program(PYTHON3 python)
else()
find_program(PYTHON3 python3)
endif()
if(NOT PYTHON3)
message(FATAL_ERROR "python3 - not found")
endif()
get_filename_component(bin_file_path_name ${bin_file} NAME)
string(REPLACE ".bin" "" bin_file_path_name ${bin_file_path_name})
#message(STATUS ${CMAKE_CURRENT_SOURCE_DIR}/buildtools/bintileconvert/bintileconvert.py)
#message(STATUS ${bin_file_path_name})
#message(STATUS "Palette bank = " ${palette_bank_num})
if(is_8bpp)
set(image_bpp 8)
else()
set(image_bpp 4)
endif()
if(is_affine)
set(image_affine "true")
else()
set(image_affine "false")
endif()
add_custom_command(OUTPUT ${build_dir}/${bin_file_path_name}.c ${build_dir}/${bin_file_path_name}.h
COMMAND ${PYTHON3} ${CMAKE_CURRENT_SOURCE_DIR}/buildtools/bintileconvert/bintileconvert.py
${CMAKE_CURRENT_SOURCE_DIR}/${bin_file} ${build_dir} ${width} ${height}
${palette_bank_num} ${CMAKE_CURRENT_SOURCE_DIR}/${image_file} ${image_bpp} ${image_affine}
VERBATIM)
endfunction()
function(generate_font ttf_font_file font_character_list_file font_bpp background_color_r background_color_g
background_color_b font_size make_1d use_utf8)
if(WIN32)
find_program(PYTHON3 python)
else()
find_program(PYTHON3 python3)
endif()
if(NOT PYTHON3)
message(FATAL_ERROR "python3 - not found")
endif()
get_filename_component(base_char_list_name ${font_character_list_file} NAME_WE)
get_filename_component(base_font_name ${ttf_font_file} NAME_WE)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${base_font_name}-${base_char_list_name}.c
COMMAND ${PYTHON3} ${CMAKE_CURRENT_SOURCE_DIR}/buildtools/generate_fonts/generate_fonts.py ${ttf_font_file}
${font_character_list_file} ${font_bpp}
${CMAKE_CURRENT_BINARY_DIR}/${base_font_name}-${base_char_list_name} ${make_1d} ${use_utf8}
${background_color_r} ${background_color_g} ${background_color_b} ${font_size}
VERBATIM)
endfunction()
function(generate_maxmod_soundbank is_gba soundbank_name sound_files)
if(NOT MMUTIL)
find_program(MMUTIL mmutil ${DEVKITPRO}/tools)
if(MMUTIL)
message(STATUS "mmutil: ${MMUTIL} - found")
else()
message(FATAL_ERROR "mmutil - not found")
endif()
endif()
if(NOT BIN2S)
# message(STATUS "Looking for bin2s...")
find_program(BIN2S bin2s ${DEVKITARM}/bin)
if(BIN2S)
message(STATUS "bin2s: ${BIN2S} - found")
else()
message(FATAL_ERROR "bin2s - not found")
endif()
endif()
# TODO(Bobby): Fix this... mess
if(is_gba)
#message(STATUS "using maxmod for gba")
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.bin.o
COMMAND ${MMUTIL} -o${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.bin
-h${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.h ${${sound_files}}
COMMAND ${BIN2S} ${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.bin >
${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.bin.s
COMMAND ${CMAKE_AS} ${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.bin.s -o
${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.bin.o
VERBATIM)
else()
#message(STATUS "using maxmod for nds")
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.bin.o
COMMAND ${MMUTIL} -d -o${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.bin
-h${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.h ${${sound_files}}
COMMAND ${BIN2S} ${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.bin >
${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.bin.s
COMMAND ${CMAKE_AS} ${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.bin.s -o
${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}.bin.o
VERBATIM)
endif()
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${soundbank_name}_bin.h
"extern const uint8_t ${soundbank_name}_bin_end[];\n"
"extern const uint8_t ${soundbank_name}_bin[];\n"
"extern const uint32_t ${soundbank_name}_bin_size;")
endfunction()
function(generate_streaming_background tilemap_bin_to_split asset_dir width height palette_bank_num png_file is_4bpp
output_files)
if(WIN32)
find_program(PYTHON3 python)
else()
find_program(PYTHON3 python3)
endif()
if(NOT PYTHON3)
message(FATAL_ERROR "python3 - not found")
endif()
if(is_4bpp)
set(bpp_flag "4")
else()
set(bpp_flag "8")
endif()
get_filename_component(png_file_name_path ${png_file} NAME_WLE)
if(output_files)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${png_file_name_path}.c
COMMAND ${PYTHON3} ${CMAKE_CURRENT_SOURCE_DIR}/buildtools/bintilesplit/bintilesplit.py
${tilemap_bin_to_split} ${asset_dir} ${width} ${height} ${palette_bank_num}
COMMAND ${GRIT} ${png_file} -gB${bpp_flag} -o${CMAKE_CURRENT_BINARY_DIR}/${png_file_name_path}.c
VERBATIM)
else()
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${png_file_name_path}.c
COMMAND ${PYTHON3} ${CMAKE_CURRENT_SOURCE_DIR}/buildtools/bintilesplit/bintilesplit.py
${tilemap_bin_to_split} ${asset_dir} ${width} ${height} ${palette_bank_num} ${png_file}
${bpp_flag} ${CMAKE_CURRENT_BINARY_DIR}
VERBATIM)
endif()
endfunction()