vita.cmake (7162B)
1 ## Copyright (C) 2016 Yifan Lu 2 ## 3 ## This software may be modified and distributed under the terms 4 ## of the MIT license. See the LICENSE file for details. 5 6 ## Advanced users may be interested in setting the following 7 ## - VITA_ELF_CREATE_FLAGS 8 ## - VITA_MAKE_FSELF_FLAGS 9 ## - VITA_ELF_EXPORT_FLAGS 10 ## - VITA_LIBS_GEN_FLAGS 11 ## - VITA_MKSFOEX_FLAGS 12 ## - VITA_PACK_VPK_FLAGS 13 14 ## add_include_guard() has been added in 3.10, but it's too recent so we don't use it 15 if(__VITA_CMAKE_INCLUDED__) 16 return() 17 endif() 18 set(__VITA_CMAKE_INCLUDED__ TRUE) 19 20 include(CMakeParseArguments) 21 22 ################################################## 23 ## MACRO: vita_create_self 24 ## 25 ## Generate a SELF from an ARM EABI ELF 26 ## vita_create_self(target source 27 ## [CONFIG file] 28 ## [UNCOMPRESSED] 29 ## [UNSAFE]) 30 ## 31 ## @param target 32 ## A CMake custom target of this given name 33 ## @param source 34 ## The ARM EABI ELF target (from add_executable for example) 35 ## @param[opt] UNCOMPRESSED 36 ## Do NOT compress the result SELF (compression is default) 37 ## @param[opt] UNSAFE 38 ## The homebrew uses private/system APIs and requires extended permissions 39 ## @param[opt] CONFIG file 40 ## Path to a YAML config file defining exports and other optional information 41 ## 42 macro(vita_create_self target source) 43 set(VITA_ELF_CREATE_FLAGS "${VITA_ELF_CREATE_FLAGS}" CACHE STRING "vita-elf-create flags") 44 set(VITA_MAKE_FSELF_FLAGS "${VITA_MAKE_FSELF_FLAGS}" CACHE STRING "vita-make-fself flags") 45 46 set(options UNCOMPRESSED UNSAFE) 47 set(oneValueArgs CONFIG) 48 cmake_parse_arguments(vita_create_self "${options}" "${oneValueArgs}" "" ${ARGN}) 49 50 if(vita_create_self_CONFIG) 51 get_filename_component(fconfig ${vita_create_self_CONFIG} ABSOLUTE) 52 set(VITA_ELF_CREATE_FLAGS "${VITA_ELF_CREATE_FLAGS} -e ${fconfig}") 53 endif() 54 if(NOT vita_create_self_UNCOMPRESSED) 55 set(VITA_MAKE_FSELF_FLAGS "${VITA_MAKE_FSELF_FLAGS} -c") 56 endif() 57 if(NOT vita_create_self_UNSAFE) 58 set(VITA_MAKE_FSELF_FLAGS "${VITA_MAKE_FSELF_FLAGS} -s") 59 endif() 60 separate_arguments(VITA_ELF_CREATE_FLAGS) 61 add_custom_command(OUTPUT ${source}.velf 62 COMMAND ${VITA_ELF_CREATE} ${VITA_ELF_CREATE_FLAGS} ${source} ${source}.velf 63 DEPENDS ${source} 64 COMMENT "Converting to Sony ELF ${source}.velf" VERBATIM 65 ) 66 separate_arguments(VITA_MAKE_FSELF_FLAGS) 67 add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target} 68 COMMAND ${VITA_MAKE_FSELF} ${VITA_MAKE_FSELF_FLAGS} ${source}.velf ${target} 69 DEPENDS ${source}.velf 70 COMMENT "Creating SELF ${target}" 71 ) 72 add_custom_target(${target} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${target}) 73 endmacro(vita_create_self) 74 ################################################## 75 76 ################################################## 77 ## MACRO: vita_create_stubs 78 ## 79 ## Generate stub libraries from a Sony ELF and config file 80 ## vita_create_stubs(target-dir source config 81 ## [KERNEL]) 82 ## 83 ## @param target-dir 84 ## A CMake custom target of this given name (will be a directory containing 85 ## the stubs) 86 ## @param source 87 ## The ARM EABI ELF target (from add_executable for example) 88 ## @param config 89 ## Path to a YAML config file defining exports 90 ## @param[opt] KERNEL 91 ## Specifies that this module makes kernel exports 92 ## 93 macro(vita_create_stubs target-dir source config) 94 set(VITA_ELF_EXPORT_FLAGS "${VITA_ELF_EXPORT_FLAGS}" CACHE STRING "vita-elf-export flags") 95 set(VITA_LIBS_GEN_FLAGS "${VITA_LIBS_GEN_FLAGS}" CACHE STRING "vita-libs-gen flags") 96 97 set(options KERNEL) 98 cmake_parse_arguments(vita_create_stubs "${options}" "" "" ${ARGN}) 99 100 if(vita_create_stubs_KERNEL) 101 set(kind kernel) 102 else() 103 set(kind user) 104 endif() 105 separate_arguments(VITA_ELF_EXPORT_FLAGS) 106 get_filename_component(fconfig ${config} ABSOLUTE) 107 add_custom_command(OUTPUT ${target-dir}.yml 108 COMMAND ${VITA_ELF_EXPORT} ${kind} ${VITA_ELF_EXPORT_FLAGS} ${source} ${fconfig} ${target-dir}.yml 109 DEPENDS ${source} ${fconfig} 110 COMMENT "Generating imports YAML for ${source}" 111 ) 112 separate_arguments(VITA_LIBS_GEN_FLAGS) 113 add_custom_target(${target-dir} ALL 114 COMMAND ${VITA_LIBS_GEN} ${VITA_LIBS_GEN_FLAGS} ${target-dir}.yml ${target-dir} 115 COMMAND make -C ${target-dir} 116 DEPENDS ${target-dir}.yml 117 COMMENT "Building stubs ${target-dir}" 118 ) 119 add_dependencies(${target-dir} ${source}) 120 endmacro(vita_create_stubs) 121 ################################################## 122 123 ################################################## 124 ## MACRO: vita_create_vpk 125 ## 126 ## Creates a homebrew VPK from a SELF 127 ## vita_create_vpk(target titleid eboot 128 ## [VERSION version] 129 ## [NAME name] 130 ## [FILE path dest]) 131 ## 132 ## @param target 133 ## A CMake custom target of this given name 134 ## @param titleid 135 ## A nine character identifier for this homebrew. The recommended format is 136 ## XXXXYYYYY where XXXX is an author unique identifier and YYYYY is a number. 137 ## @param eboot 138 ## The main SELF to package (from vita_create_self for example). 139 ## @param[opt] VERSION 140 ## A version string 141 ## @param[opt] NAME 142 ## The display name under the bubble in LiveArea 143 ## @param[opt] FILE 144 ## Add an additional file at path to dest in the vpk (there can be multiple 145 ## of this parameter). 146 ## 147 macro(vita_create_vpk target titleid eboot) 148 set(VITA_MKSFOEX_FLAGS "${VITA_MKSFOEX_FLAGS}" CACHE STRING "vita-mksfoex flags") 149 set(VITA_PACK_VPK_FLAGS "${VITA_PACK_VPK_FLAGS}" CACHE STRING "vita-pack-vpk flags") 150 151 set(oneValueArgs VERSION NAME) 152 set(multiValueArgs FILE) 153 cmake_parse_arguments(vita_create_vpk "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 154 155 list(LENGTH vita_create_vpk_FILE left) 156 while(left GREATER 0) 157 if(left EQUAL 1) 158 message(FATAL_ERROR "Invalid number of arguments") 159 endif() 160 list(GET vita_create_vpk_FILE 0 fname) 161 list(GET vita_create_vpk_FILE 1 fdest) 162 get_filename_component(fpath ${fname} ABSOLUTE) 163 list(APPEND resources "${fpath}") 164 list(REMOVE_AT vita_create_vpk_FILE 0 1) 165 set(VITA_PACK_VPK_FLAGS "${VITA_PACK_VPK_FLAGS} -a ${fpath}=${fdest}") 166 list(LENGTH vita_create_vpk_FILE left) 167 endwhile() 168 169 if(vita_create_vpk_VERSION) 170 set(VITA_MKSFOEX_FLAGS "${VITA_MKSFOEX_FLAGS} -s APP_VER=${vita_create_vpk_VERSION}") 171 endif() 172 set(VITA_MKSFOEX_FLAGS "${VITA_MKSFOEX_FLAGS} -s TITLE_ID=${titleid}") 173 if(NOT vita_create_vpk_NAME) 174 set(vita_create_vpk_NAME "${PROJECT_NAME}") 175 endif() 176 separate_arguments(VITA_MKSFOEX_FLAGS) 177 add_custom_command(OUTPUT ${target}_param.sfo 178 COMMAND ${VITA_MKSFOEX} ${VITA_MKSFOEX_FLAGS} ${vita_create_vpk_NAME} ${target}_param.sfo 179 COMMENT "Generating param.sfo for ${target}" 180 ) 181 separate_arguments(VITA_PACK_VPK_FLAGS) 182 add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target} 183 COMMAND ${VITA_PACK_VPK} ${VITA_PACK_VPK_FLAGS} -s ${target}_param.sfo -b ${eboot} ${target} 184 DEPENDS ${target}_param.sfo ${eboot} ${resources} 185 COMMENT "Building vpk ${target}" 186 ) 187 add_custom_target(${target} ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${target}) 188 endmacro(vita_create_vpk) 189 ##################################################