vita-toolchain

git clone https://git.neptards.moe/neptards/vita-toolchain.git
Log | Files | Refs | README | LICENSE

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 ##################################################