You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
vita-toolchain/cmake_toolchain/vita.cmake

190 lines
7.0 KiB
CMake

## Copyright (C) 2016 Yifan Lu
##
## This software may be modified and distributed under the terms
## of the MIT license. See the LICENSE file for details.
## Advanced users may be interested in setting the following
## - VITA_ELF_CREATE_FLAGS
## - VITA_MAKE_FSELF_FLAGS
## - VITA_ELF_EXPORT_FLAGS
## - VITA_LIBS_GEN_FLAGS
## - VITA_MKSFOEX_FLAGS
## - VITA_PACK_VPK_FLAGS
## add_include_guard() has been added in 3.10, but it's too recent so we don't use it
if(__VITA_CMAKE_INCLUDED__)
return()
endif()
set(__VITA_CMAKE_INCLUDED__ TRUE)
include(CMakeParseArguments)
##################################################
## MACRO: vita_create_self
##
## Generate a SELF from an ARM EABI ELF
## vita_create_self(target source
## [CONFIG file]
## [UNCOMPRESSED]
## [UNSAFE])
##
## @param target
## A CMake custom target of this given name
## @param source
## The ARM EABI ELF target (from add_executable for example)
## @param[opt] UNCOMPRESSED
## Do NOT compress the result SELF (compression is default)
## @param[opt] UNSAFE
## The homebrew uses private/system APIs and requires extended permissions
## @param[opt] CONFIG file
## Path to a YAML config file defining exports and other optional information
##
macro(vita_create_self target source)
set(VITA_ELF_CREATE_FLAGS "${VITA_ELF_CREATE_FLAGS}" CACHE STRING "vita-elf-create flags")
set(VITA_MAKE_FSELF_FLAGS "${VITA_MAKE_FSELF_FLAGS}" CACHE STRING "vita-make-fself flags")
set(options UNCOMPRESSED UNSAFE)
set(oneValueArgs CONFIG)
cmake_parse_arguments(vita_create_self "${options}" "${oneValueArgs}" "" ${ARGN})
if(vita_create_self_CONFIG)
get_filename_component(fconfig ${vita_create_self_CONFIG} ABSOLUTE)
set(VITA_ELF_CREATE_FLAGS "${VITA_ELF_CREATE_FLAGS} -e ${fconfig}")
endif()
if(NOT vita_create_self_UNCOMPRESSED)
set(VITA_MAKE_FSELF_FLAGS "${VITA_MAKE_FSELF_FLAGS} -c")
endif()
if(NOT vita_create_self_UNSAFE)
set(VITA_MAKE_FSELF_FLAGS "${VITA_MAKE_FSELF_FLAGS} -s")
endif()
separate_arguments(VITA_ELF_CREATE_FLAGS)
add_custom_command(OUTPUT ${source}.velf
COMMAND ${VITA_ELF_CREATE} ${VITA_ELF_CREATE_FLAGS} ${source} ${source}.velf
DEPENDS ${source}
COMMENT "Converting to Sony ELF ${source}.velf" VERBATIM
)
separate_arguments(VITA_MAKE_FSELF_FLAGS)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}
COMMAND ${VITA_MAKE_FSELF} ${VITA_MAKE_FSELF_FLAGS} ${source}.velf ${target}
DEPENDS ${source}.velf
COMMENT "Creating SELF ${target}"
)
add_custom_target(${target} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${target})
endmacro(vita_create_self)
##################################################
##################################################
## MACRO: vita_create_stubs
##
## Generate stub libraries from a Sony ELF and config file
## vita_create_stubs(target-dir source config
## [KERNEL])
##
## @param target-dir
## A CMake custom target of this given name (will be a directory containing
## the stubs)
## @param source
## The ARM EABI ELF target (from add_executable for example)
## @param config
## Path to a YAML config file defining exports
## @param[opt] KERNEL
## Specifies that this module makes kernel exports
##
macro(vita_create_stubs target-dir source config)
set(VITA_ELF_EXPORT_FLAGS "${VITA_ELF_EXPORT_FLAGS}" CACHE STRING "vita-elf-export flags")
set(VITA_LIBS_GEN_FLAGS "${VITA_LIBS_GEN_FLAGS}" CACHE STRING "vita-libs-gen flags")
set(options KERNEL)
cmake_parse_arguments(vita_create_stubs "${options}" "" "" ${ARGN})
if(vita_create_stubs_KERNEL)
set(kind kernel)
else()
set(kind user)
endif()
separate_arguments(VITA_ELF_EXPORT_FLAGS)
get_filename_component(fconfig ${config} ABSOLUTE)
add_custom_command(OUTPUT ${target-dir}.yml
COMMAND ${VITA_ELF_EXPORT} ${kind} ${VITA_ELF_EXPORT_FLAGS} ${source} ${fconfig} ${target-dir}.yml
DEPENDS ${source} ${fconfig}
COMMENT "Generating imports YAML for ${source}"
)
separate_arguments(VITA_LIBS_GEN_FLAGS)
add_custom_target(${target-dir} ALL
COMMAND ${VITA_LIBS_GEN} ${VITA_LIBS_GEN_FLAGS} ${target-dir}.yml ${target-dir}
COMMAND make -C ${target-dir}
DEPENDS ${target-dir}.yml
COMMENT "Building stubs ${target-dir}"
)
add_dependencies(${target-dir} ${source})
endmacro(vita_create_stubs)
##################################################
##################################################
## MACRO: vita_create_vpk
##
## Creates a homebrew VPK from a SELF
## vita_create_vpk(target titleid eboot
## [VERSION version]
## [NAME name]
## [FILE path dest])
##
## @param target
## A CMake custom target of this given name
## @param titleid
## A nine character identifier for this homebrew. The recommended format is
## XXXXYYYYY where XXXX is an author unique identifier and YYYYY is a number.
## @param eboot
## The main SELF to package (from vita_create_self for example).
## @param[opt] VERSION
## A version string
## @param[opt] NAME
## The display name under the bubble in LiveArea
## @param[opt] FILE
## Add an additional file at path to dest in the vpk (there can be multiple
## of this parameter).
##
macro(vita_create_vpk target titleid eboot)
set(VITA_MKSFOEX_FLAGS "${VITA_MKSFOEX_FLAGS}" CACHE STRING "vita-mksfoex flags")
set(VITA_PACK_VPK_FLAGS "${VITA_PACK_VPK_FLAGS}" CACHE STRING "vita-pack-vpk flags")
set(oneValueArgs VERSION NAME)
set(multiValueArgs FILE)
cmake_parse_arguments(vita_create_vpk "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
list(LENGTH vita_create_vpk_FILE left)
while(left GREATER 0)
if(left EQUAL 1)
message(FATAL_ERROR "Invalid number of arguments")
endif()
list(GET vita_create_vpk_FILE 0 fname)
list(GET vita_create_vpk_FILE 1 fdest)
get_filename_component(fpath ${fname} ABSOLUTE)
list(APPEND resources "${fpath}")
list(REMOVE_AT vita_create_vpk_FILE 0 1)
set(VITA_PACK_VPK_FLAGS "${VITA_PACK_VPK_FLAGS} -a ${fpath}=${fdest}")
list(LENGTH vita_create_vpk_FILE left)
endwhile()
if(vita_create_vpk_VERSION)
set(VITA_MKSFOEX_FLAGS "${VITA_MKSFOEX_FLAGS} -s APP_VER=${vita_create_vpk_VERSION}")
endif()
set(VITA_MKSFOEX_FLAGS "${VITA_MKSFOEX_FLAGS} -s TITLE_ID=${titleid}")
if(NOT vita_create_vpk_NAME)
set(vita_create_vpk_NAME "${PROJECT_NAME}")
endif()
separate_arguments(VITA_MKSFOEX_FLAGS)
add_custom_command(OUTPUT ${target}_param.sfo
COMMAND ${VITA_MKSFOEX} ${VITA_MKSFOEX_FLAGS} ${vita_create_vpk_NAME} ${target}_param.sfo
COMMENT "Generating param.sfo for ${target}"
)
separate_arguments(VITA_PACK_VPK_FLAGS)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}
COMMAND ${VITA_PACK_VPK} ${VITA_PACK_VPK_FLAGS} -s ${target}_param.sfo -b ${eboot} ${target}
DEPENDS ${target}_param.sfo ${eboot} ${resources}
COMMENT "Building vpk ${target}"
)
add_custom_target(${target} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${target})
endmacro(vita_create_vpk)
##################################################