libsuperderpy/cmake/libsuperderpy.cmake
2024-03-04 22:53:10 +01:00

783 lines
33 KiB
CMake

if (NOT LIBSUPERDERPY_CONFIG_INCLUDED)
# Set a default build type for single-configuration
# CMake generators if no build type is set.
if (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE RelWithDebInfo)
endif (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
if (EXISTS "${CMAKE_SOURCE_DIR}/libsuperderpy")
set(LIBSUPERDERPY_DIR "${CMAKE_SOURCE_DIR}/libsuperderpy")
set(LIBSUPERDERPY_BINARY_DIR "${CMAKE_BINARY_DIR}/libsuperderpy")
if(NOT DEFINED LIBSUPERDERPY_NO_GAME_GIT_REV)
execute_process(
COMMAND git rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE LIBSUPERDERPY_GAME_GIT_REV
OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif(NOT DEFINED LIBSUPERDERPY_NO_GAME_GIT_REV)
include_directories("libsuperderpy/src")
else (EXISTS "${CMAKE_SOURCE_DIR}/libsuperderpy")
set(LIBSUPERDERPY_DIR ${CMAKE_SOURCE_DIR})
set(LIBSUPERDERPY_BINARY_DIR ${CMAKE_BINARY_DIR})
endif (EXISTS "${CMAKE_SOURCE_DIR}/libsuperderpy")
execute_process(
COMMAND git rev-parse --short HEAD
WORKING_DIRECTORY ${LIBSUPERDERPY_DIR}
OUTPUT_VARIABLE LIBSUPERDERPY_GIT_REV
OUTPUT_STRIP_TRAILING_WHITESPACE
)
add_definitions(-DLIBSUPERDERPY_GIT_REV="${LIBSUPERDERPY_GIT_REV}")
set(SHARE_DIR "share" CACHE STRING "A directory under CMAKE_INSTALL_PREFIX where data files are installed to")
set(BIN_DIR "bin" CACHE STRING "A directory under CMAKE_INSTALL_PREFIX where binary files are installed to")
set(LIB_DIR "lib${LIB_SUFFIX}" CACHE STRING "A directory under CMAKE_INSTALL_PREFIX where library files are installed to")
add_definitions(-D_POSIX_C_SOURCE=200809L)
if (MAEMO5)
add_definitions(-D_GNU_SOURCE)
endif (MAEMO5)
add_definitions(-DLIBSUPERDERPY_ORIENTATION_${LIBSUPERDERPY_ORIENTATION}=true)
set(EMSCRIPTEN_TOTAL_MEMORY "128" CACHE STRING "Amount of memory allocated by Emscripten in asm.js builds (MB, must be multiple of 16)" )
set(VITA_HEAP_SIZE "64" CACHE STRING "Amount of memory allocated by newlib for heap on PS Vita (MB)" )
option(LIBSUPERDERPY_IMGUI "Compile with Dear ImGui support." OFF)
if (LIBSUPERDERPY_IMGUI)
enable_language(CXX)
add_definitions(-DLIBSUPERDERPY_IMGUI)
endif (LIBSUPERDERPY_IMGUI)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD 98)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# TODO: add -fvisibility=hidden, but only to libsuperderpy target
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -ffast-math")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -ffast-math")
if (NOT MAEMO5 AND NOT VITA)
# stack protector causes segfaults on Maemo and hangs on Vita
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector")
endif(NOT MAEMO5 AND NOT VITA)
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-type-c-linkage")
endif()
if(CMAKE_C_STANDARD_COMPUTED_DEFAULT EQUAL 90 OR NOT CMAKE_C_STANDARD_COMPUTED_DEFAULT)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
endif(CMAKE_C_STANDARD_COMPUTED_DEFAULT EQUAL 90 OR NOT CMAKE_C_STANDARD_COMPUTED_DEFAULT)
if(WIN32)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -mwindows -municode")
add_definitions(-DWIN32_LEAN_AND_MEAN)
option(LIBSUPERDERPY_DLFCN "Use built-in dlfcn with UTF-8 support" ON)
endif(WIN32)
if(ANDROID)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti")
endif(ANDROID)
set(SANITIZERS "address,undefined" CACHE STRING "List of code sanitizers enabled for Debug builds")
set_property(CACHE SANITIZERS PROPERTY STRINGS "" address undefined leak thread address,undefined leak,undefined thread,undefined memory memory,undefined)
# leak sanitizer is a subset of address sanitizer
# address/leak, memory and thread sanitizers are mutually exclusive (there can be only one at once)
# there's also fuzzer, but it doesn't seem particularly interesting for us
if (SANITIZERS)
set(SANITIZERS_ARGS "-fsanitize=${SANITIZERS}")
if ("${SANITIZERS}" MATCHES "(address)|(leak)")
set(SANITIZERS_ARGS "${SANITIZERS_ARGS} -DLEAK_SANITIZER=1")
endif()
if ("${SANITIZERS}" MATCHES "address")
set(SANITIZERS_ARGS "${SANITIZERS_ARGS} -fsanitize-address-use-after-scope")
endif()
if (NOT "${SANITIZERS}" MATCHES "memory")
if ("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -shared-libsan")
endif()
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -shared-libsan")
endif()
endif()
endif(SANITIZERS)
if (EMSCRIPTEN)
if(SANITIZERS_ARGS)
message(STATUS "Sanitizers unavailable under Emscripten, disabling...")
set(SANITIZERS_ARGS "")
endif()
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g3 -s ASSERTIONS=2 -s SAFE_HEAP=1")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g3 -s ASSERTIONS=2 -s SAFE_HEAP=1")
else()
if(MAEMO5 AND SANITIZERS_ARGS)
message(STATUS "Sanitizers unavailable on Maemo, disabling...")
set(SANITIZERS_ARGS "")
endif()
if(VITA AND SANITIZERS_ARGS)
message(STATUS "Sanitizers unavailable on Vita, disabling...")
set(SANITIZERS_ARGS "")
endif()
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb3")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ggdb3")
endif()
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O1 -fno-optimize-sibling-calls -fno-omit-frame-pointer -fno-common ${SANITIZERS_ARGS}")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O1 -fno-optimize-sibling-calls -fno-omit-frame-pointer -fno-common ${SANITIZERS_ARGS}")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D_FORTIFY_SOURCE=2")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D_FORTIFY_SOURCE=2")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_FORTIFY_SOURCE=2")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -D_FORTIFY_SOURCE=2")
if (NOT "${SANITIZERS}" MATCHES "memory")
if(APPLE)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-undefined,error")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-undefined,error")
else(APPLE)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined")
endif(APPLE)
endif()
option(USE_CLANG_TIDY "Analyze the code with clang-tidy" OFF)
if(USE_CLANG_TIDY AND NOT MINGW)
find_program(CLANG_TIDY_EXE NAMES "clang-tidy" DOC "Path to clang-tidy executable")
mark_as_advanced(CLANG_TIDY_EXE)
if(NOT CLANG_TIDY_EXE)
message(STATUS "clang-tidy not found, analysis disabled")
else()
if (EXISTS "${CMAKE_SOURCE_DIR}/.clang-tidy")
file(READ "${CMAKE_SOURCE_DIR}/.clang-tidy" CLANG_TIDY_CONFIG)
else (EXISTS "${CMAKE_SOURCE_DIR}/.clang-tidy")
file(READ "${CMAKE_SOURCE_DIR}/libsuperderpy/.clang-tidy" CLANG_TIDY_CONFIG)
endif (EXISTS "${CMAKE_SOURCE_DIR}/.clang-tidy")
string(STRIP "${CLANG_TIDY_CONFIG}" CLANG_TIDY_CONFIG)
set(CMAKE_C_CLANG_TIDY "${CLANG_TIDY_EXE}" "-config=${CLANG_TIDY_CONFIG}")
endif()
endif()
if (EMSCRIPTEN)
option(LIBSUPERDERPY_LTO "Use link-time optimization" ON)
else()
option(LIBSUPERDERPY_LTO "Use link-time optimization" OFF)
endif()
if(POLICY CMP0069 AND LIBSUPERDERPY_LTO)
if(NOT USE_CLANG_TIDY AND NOT MINGW) # clang-tidy + GCC + LTO = errors; also, MinGW crashes
cmake_policy(SET CMP0069 NEW)
include(CheckIPOSupported)
check_ipo_supported(RESULT IPO_SUPPORTED)
message(STATUS "Link time optimization: ${IPO_SUPPORTED}")
if(IPO_SUPPORTED)
if(NOT EMSCRIPTEN)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -flto")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
else()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --llvm-lto 3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --llvm-lto 3")
endif()
endif()
endif()
endif()
option(BUILD_SHARED_LIBS "Build as dynamic libraries" ON)
option(LIBSUPERDERPY_STATIC "Compile and link libsuperderpy as a static library" OFF)
option(LIBSUPERDERPY_STATIC_COMMON "Compile and link common routines as a static library" OFF)
option(LIBSUPERDERPY_STATIC_GAMESTATES "Compile and link gamestates as static libraries" OFF)
option(LIBSUPERDERPY_EMBEDDED_ALLEGRO "Compile an embedded copy of Allegro" OFF)
if (NOT BUILD_SHARED_LIBS)
set(LIBSUPERDERPY_STATIC ON)
set(LIBSUPERDERPY_STATIC_COMMON ON)
set(LIBSUPERDERPY_STATIC_GAMESTATES ON)
endif()
if(LIBSUPERDERPY_STATIC_GAMESTATES)
add_definitions("-DLIBSUPERDERPY_STATIC_GAMESTATES")
endif(LIBSUPERDERPY_STATIC_GAMESTATES)
option(LIBSUPERDERPY_STATIC_DEPS "Link dependencies (e.g. Allegro) statically." OFF)
if(LIBSUPERDERPY_STATIC_DEPS)
SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a)
endif(LIBSUPERDERPY_STATIC_DEPS)
set(LIBSUPERDERPY_EXTRA_LIBS "${LIBSUPERDERPY_EXTRA_LIBS_INIT}" CACHE STRING "Additional platform libraries to link to")
if(MAEMO5)
add_definitions(-DMAEMO5=1)
add_definitions(-D_Noreturn=)
set(LIBSUPERDERPY_PLATFORM_OVERRIDE "maemo5")
endif(MAEMO5)
if(POCKETCHIP)
add_definitions(-DPOCKETCHIP=1)
set(LIBSUPERDERPY_PLATFORM_OVERRIDE "pocketchip")
endif(POCKETCHIP)
if(RASPBERRYPI)
add_definitions(-DRASPBERRYPI=1)
set(LIBSUPERDERPY_PLATFORM_OVERRIDE "raspberrypi")
endif(RASPBERRYPI)
if(VITA)
add_definitions(-DLIBSUPERDERPY_VITA_HEAP_SIZE=${VITA_HEAP_SIZE})
set(LIBSUPERDERPY_PLATFORM_OVERRIDE "vita")
endif(VITA)
if(STEAMLINK)
set(LIBSUPERDERPY_PLATFORM_OVERRIDE "steamlink")
endif(STEAMLINK)
if(MAEMO5 OR POCKETCHIP)
add_definitions(-DLIBSUPERDERPY_EMULATE_TOUCH=1)
endif(MAEMO5 OR POCKETCHIP)
if(EMSCRIPTEN OR SWITCH OR VITA)
add_definitions(-DLIBSUPERDERPY_NO_RESTART=1)
endif(EMSCRIPTEN OR SWITCH OR VITA)
set(GAMESTATE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${LIB_DIR}")
if(APPLE)
if(CMAKE_INSTALL_PREFIX MATCHES "/usr/local") # HACK
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}")
endif(CMAKE_INSTALL_PREFIX MATCHES "/usr/local")
set(GAMESTATE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${BIN_DIR}/${LIBSUPERDERPY_GAMENAME}.app/Contents/MacOS/")
set(MACOSX_BUNDLE_ICON_FILE ${LIBSUPERDERPY_GAMENAME})
set(MACOSX_BUNDLE_BUNDLE_NAME ${LIBSUPERDERPY_GAMENAME_PRETTY})
endif(APPLE)
if(MINGW)
# Guess MINGDIR from the value of CMAKE_C_COMPILER if it's not set.
if(NOT MINGDIR)
if("$ENV{MINGDIR}" STREQUAL "")
string(REGEX REPLACE "/bin/[^/]*$" "" MINGDIR "${CMAKE_C_COMPILER}")
message(STATUS "Guessed MinGW directory: ${MINGDIR}")
else("$ENV{MINGDIR}" STREQUAL "")
file(TO_CMAKE_PATH "$ENV{MINGDIR}" MINGDIR)
message(STATUS "Using MINGDIR: ${MINGDIR}")
endif("$ENV{MINGDIR}" STREQUAL "")
endif(NOT MINGDIR)
# Search in MINGDIR for headers and libraries.
set(CMAKE_PREFIX_PATH "${MINGDIR}")
endif(MINGW)
set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${LIB_DIR}/${LIBSUPERDERPY_GAMENAME}:\$ORIGIN/gamestates:\$ORIGIN:\$ORIGIN/../${LIB_DIR}:\$ORIGIN/${LIB_DIR}:\$ORIGIN/${BIN_DIR}")
if(EMSCRIPTEN)
set(LIBSUPERDERPY_PLATFORM_OVERRIDE "emscripten")
set(CMAKE_EXECUTABLE_SUFFIX ".bc")
set(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
# GNU extensions are needed for things like EM_ASM
set(CMAKE_C_EXTENSIONS ON)
set(CMAKE_CXX_EXTENSIONS ON)
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s SIDE_MODULE=2 -s EXPORTED_FUNCTIONS=[\"_Gamestate_ProgressCount\"]")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --ignore-dynamic-linking")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --ignore-dynamic-linking")
set(EMSCRIPTEN_FLAGS -s TOTAL_MEMORY=${EMSCRIPTEN_TOTAL_MEMORY}MB --emit-symbol-map --use-preload-plugins --use-preload-cache -s FULL_ES2=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_FILE=\"${LIBSUPERDERPY_GAMENAME}.emterpret.js\" -s EMTERPRETIFY_ASYNC=1 -s EMTERPRETIFY_WHITELIST=[\"_main\",\"_libsuperderpy_emscripten_mainloop\",\"_libsuperderpy_mainloop\",\"_MainloopTick\",\"_GamestateLoadingThread\"] -s INCLUDE_FULL_LIBRARY=1 -s ERROR_ON_MISSING_LIBRARIES=1)
set(LIBSUPERDERPY_EMSCRIPTEN_MODE "wasm" CACHE STRING "Emscripten compilation mode (JavaScript or WebAssembly)")
set_property(CACHE LIBSUPERDERPY_EMSCRIPTEN_MODE PROPERTY STRINGS "asm.js;wasm")
if("${LIBSUPERDERPY_EMSCRIPTEN_MODE}" STREQUAL "wasm")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -s WASM=1")
set(EMSCRIPTEN_FLAGS ${EMSCRIPTEN_FLAGS} -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 --no-heap-copy -s BINARYEN_TRAP_MODE=\"clamp\")
option(EMSCRIPTEN_DCE "Enable dead code elimination in WebAssembly build" ON)
if (EMSCRIPTEN_DCE)
set(EMSCRIPTEN_FLAGS ${EMSCRIPTEN_FLAGS} -s MAIN_MODULE=2 -s EXPORTED_FUNCTIONS=@${CMAKE_BINARY_DIR}/emscripten-imports.json)
else (EMSCRIPTEN_DCE)
set(EMSCRIPTEN_FLAGS ${EMSCRIPTEN_FLAGS} -s MAIN_MODULE=1 -s EXPORT_ALL=1)
endif(EMSCRIPTEN_DCE)
set(CMAKE_SHARED_MODULE_SUFFIX ".wasm.so")
add_definitions(-DLIBSUPERDERPY_WASM=1)
else()
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -s WASM=0")
set(EMSCRIPTEN_FLAGS ${EMSCRIPTEN_FLAGS} -s WASM=0 -s PRECISE_F32=1 -s MAIN_MODULE=1 -s EXPORT_ALL=1)
set(CMAKE_SHARED_MODULE_SUFFIX ".js")
endif()
option(LIBSUPERDERPY_USE_WEBGL2 "Use WebGL 2 context" OFF)
if(LIBSUPERDERPY_USE_WEBGL2)
set(EMSCRIPTEN_FLAGS ${EMSCRIPTEN_FLAGS} -s USE_WEBGL2=1)
endif(LIBSUPERDERPY_USE_WEBGL2)
if(CMAKE_INSTALL_PREFIX MATCHES "/usr/local") # HACK
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/output")
endif(CMAKE_INSTALL_PREFIX MATCHES "/usr/local")
set(GAMESTATE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}")
endif()
if(ANDROID OR EMSCRIPTEN OR VITA)
add_definitions(-DLIBSUPERDERPY_SINGLE_THREAD)
endif()
if (LIBSUPERDERPY_EMBEDDED_ALLEGRO)
set(Allegro5_LIBRARIES "allegro")
set(Allegro5Font_LIBRARIES "allegro_font")
set(Allegro5TTF_LIBRARIES "allegro_ttf")
set(Allegro5Primitives_LIBRARIES "allegro_primitives")
set(Allegro5Audio_LIBRARIES "allegro_audio")
set(Allegro5ACodec_LIBRARIES "allegro_acodec")
set(Allegro5Image_LIBRARIES "allegro_image")
set(Allegro5Color_LIBRARIES "allegro_color")
set(Allegro5Video_LIBRARIES "allegro_video")
set(Allegro5Main_LIBRARIES "allegro_main")
set(Allegro5_INCLUDE_DIR "")
include_directories("${LIBSUPERDERPY_DIR}/src/3rdparty/allegro5/include")
include_directories("${LIBSUPERDERPY_DIR}/src/3rdparty/allegro5/addons/font")
include_directories("${LIBSUPERDERPY_DIR}/src/3rdparty/allegro5/addons/ttf")
include_directories("${LIBSUPERDERPY_DIR}/src/3rdparty/allegro5/addons/primitives")
include_directories("${LIBSUPERDERPY_DIR}/src/3rdparty/allegro5/addons/audio")
include_directories("${LIBSUPERDERPY_DIR}/src/3rdparty/allegro5/addons/acodec")
include_directories("${LIBSUPERDERPY_DIR}/src/3rdparty/allegro5/addons/image")
include_directories("${LIBSUPERDERPY_DIR}/src/3rdparty/allegro5/addons/color")
include_directories("${LIBSUPERDERPY_DIR}/src/3rdparty/allegro5/addons/video")
include_directories("${LIBSUPERDERPY_BINARY_DIR}/src/3rdparty/allegro5/include")
else (LIBSUPERDERPY_EMBEDDED_ALLEGRO)
find_package(Allegro5 REQUIRED)
if(NOT EMSCRIPTEN)
find_package(Allegro5Font REQUIRED)
find_package(Allegro5TTF REQUIRED)
find_package(Allegro5Primitives REQUIRED)
find_package(Allegro5Audio REQUIRED)
find_package(Allegro5ACodec REQUIRED)
find_package(Allegro5Image REQUIRED)
find_package(Allegro5Color REQUIRED)
find_package(Allegro5Video REQUIRED)
if(APPLE)
find_package(Allegro5Main)
endif(APPLE)
endif(NOT EMSCRIPTEN)
endif()
include_directories(${Allegro5_INCLUDE_DIR} ${Allegro5Font_INCLUDE_DIR} ${Allegro5TTF_INCLUDE_DIR} ${Allegro5Primitives_INCLUDE_DIR} ${Allegro5Audio_INCLUDE_DIR} ${Allegro5Acodec_INCLUDE_DIR} ${Allegro5Video_INCLUDE_DIR} ${Allegro5Image_INCLUDE_DIR} ${Allegro5Color_INCLUDE_DIR})
MACRO(register_gamestate name sources)
if (LIBSUPERDERPY_STATIC_GAMESTATES)
add_library("lib${LIBSUPERDERPY_GAMENAME}-${name}" STATIC ${sources})
else(LIBSUPERDERPY_STATIC_GAMESTATES)
add_library("lib${LIBSUPERDERPY_GAMENAME}-${name}" MODULE ${sources})
endif(LIBSUPERDERPY_STATIC_GAMESTATES)
target_compile_definitions("lib${LIBSUPERDERPY_GAMENAME}-${name}" PRIVATE LIBSUPERDERPY_GAMESTATE=${name})
set_target_properties("lib${LIBSUPERDERPY_GAMENAME}-${name}" PROPERTIES PREFIX "")
if (NOT EMSCRIPTEN)
if (TARGET lib${LIBSUPERDERPY_GAMENAME})
target_link_libraries("lib${LIBSUPERDERPY_GAMENAME}-${name}" lib${LIBSUPERDERPY_GAMENAME} ${LIBSUPERDERPY_EXTRA_LIBS})
else (TARGET lib${LIBSUPERDERPY_GAMENAME})
if (NOT LIBSUPERDERPY_STATIC)
target_link_libraries("lib${LIBSUPERDERPY_GAMENAME}-${name}" libsuperderpy ${LIBSUPERDERPY_EXTRA_LIBS})
endif (NOT LIBSUPERDERPY_STATIC)
endif(TARGET lib${LIBSUPERDERPY_GAMENAME})
endif (NOT EMSCRIPTEN)
install(TARGETS "lib${LIBSUPERDERPY_GAMENAME}-${name}" DESTINATION ${GAMESTATE_INSTALL_DIR})
if (ANDROID)
add_dependencies(${LIBSUPERDERPY_GAMENAME}_apk "lib${LIBSUPERDERPY_GAMENAME}-${name}")
endif()
if (EMSCRIPTEN)
string(TOUPPER "CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}" CFLAGS)
string(REPLACE " " ";" CFLAGS_L ${CMAKE_C_FLAGS})
set(CFLAGS_LIST ${CFLAGS_L} ${${CFLAGS}})
install(FILES "${CMAKE_BINARY_DIR}/src/gamestates/lib${LIBSUPERDERPY_GAMENAME}-${name}${CMAKE_SHARED_MODULE_SUFFIX}" DESTINATION ${CMAKE_INSTALL_PREFIX}/${LIBSUPERDERPY_GAMENAME}/gamestates)
endif()
ENDMACRO()
MACRO(libsuperderpy_copy EXECUTABLE)
if (NOT APPLE AND NOT ANDROID AND NOT LIBSUPERDERPY_STATIC)
add_custom_command(TARGET "${EXECUTABLE}" PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "../libsuperderpy/src/libsuperderpy${CMAKE_SHARED_LIBRARY_SUFFIX}" $<TARGET_FILE_DIR:${EXECUTABLE}>)
endif (NOT APPLE AND NOT ANDROID AND NOT LIBSUPERDERPY_STATIC)
ENDMACRO()
include(InstallRequiredSystemLibraries)
if(LIBSUPERDERPY_GAMENAME)
configure_file("${LIBSUPERDERPY_DIR}/src/defines.h.in" "${CMAKE_BINARY_DIR}/gen/defines.h")
configure_file("${LIBSUPERDERPY_DIR}/src/emscripten.html.in" "${CMAKE_BINARY_DIR}/gen/emscripten.html")
include_directories("${CMAKE_BINARY_DIR}/gen")
endif(LIBSUPERDERPY_GAMENAME)
if (NOT DEFINED LIBSUPERDERPY_VERSION)
set(LIBSUPERDERPY_VERSION "0.1")
endif(NOT DEFINED LIBSUPERDERPY_VERSION)
if (NOT DEFINED LIBSUPERDERPY_RELEASE)
set(LIBSUPERDERPY_RELEASE "1")
endif(NOT DEFINED LIBSUPERDERPY_RELEASE)
if (NOT DEFINED LIBSUPERDERPY_APPID)
set(LIBSUPERDERPY_APPID "net.dosowisko.${LIBSUPERDERPY_GAMENAME}")
endif(NOT DEFINED LIBSUPERDERPY_APPID)
if (ANDROID)
set(ASSET_PIPELINE_DATADIR "${CMAKE_BINARY_DIR}/android/app/src/main/assets/data")
set(ASSET_PIPELINE_DEPEND "")
else (EMSCRIPTEN)
set(ASSET_PIPELINE_DATADIR "${CMAKE_INSTALL_PREFIX}/${SHARE_DIR}/${LIBSUPERDERPY_GAMENAME}/data")
set(ASSET_PIPELINE_DEPEND ${LIBSUPERDERPY_GAMENAME}_install)
endif()
set(FLACTOLOSSY_DEFAULT OFF)
set(FLACTOLOSSY_FORMAT_DEFAULT "Opus")
set(IMGTOWEBP_DEFAULT OFF)
if (ANDROID OR EMSCRIPTEN)
set(FLACTOLOSSY_DEFAULT ON)
set(IMGTOWEBP_DEFAULT ON)
endif()
if (MAEMO5)
set(FLACTOLOSSY_DEFAULT ON)
set(FLACTOLOSSY_FORMAT_DEFAULT "Vorbis")
endif()
if (ANDROID OR EMSCRIPTEN)
# restrict to Android or Emscripten for now, because only those platforms have ASSET_PIPELINE_DATADIR at this moment
option(FLACTOLOSSY "Compress FLAC audio assets to lossy format" ${FLACTOLOSSY_DEFAULT})
set(FLACTOLOSSY_BITRATE "192" CACHE STRING "Bitrate of resulting Vorbis/Opus files (kbps)")
set(FLACTOLOSSY_SAMPLERATE "48000" CACHE STRING "Sample rate of resulting Vorbis files (does not apply to Opus) (Hz)")
set(FLACTOLOSSY_FORMAT ${FLACTOLOSSY_FORMAT_DEFAULT} CACHE STRING "Lossy codec to use when encoding audio files")
set_property(CACHE FLACTOLOSSY_FORMAT PROPERTY STRINGS "Opus;Vorbis")
if (FLACTOLOSSY)
if (${FLACTOLOSSY_FORMAT} STREQUAL "Vorbis")
add_definitions(-DLIBSUPERDERPY_FLACTOLOSSY_EXT="ogg")
else()
add_definitions(-DLIBSUPERDERPY_FLACTOLOSSY_EXT="opus")
endif()
add_custom_target(${LIBSUPERDERPY_GAMENAME}_flac_to_lossy
DEPENDS ${ASSET_PIPELINE_DEPEND}
COMMAND ${CMAKE_COMMAND} -DDATADIR=${ASSET_PIPELINE_DATADIR} -DCACHE="${CMAKE_SOURCE_DIR}/.assetcache" -DBITRATE=${FLACTOLOSSY_BITRATE} -DSAMPLERATE=${FLACTOLOSSY_SAMPLERATE} -P ${LIBSUPERDERPY_DIR}/cmake/FlacTo${FLACTOLOSSY_FORMAT}.cmake
USES_TERMINAL)
else(FLACTOLOSSY)
add_custom_target(${LIBSUPERDERPY_GAMENAME}_flac_to_lossy
DEPENDS ${ASSET_PIPELINE_DEPEND})
endif(FLACTOLOSSY)
option(IMGTOWEBP "Compress image assets to WebP format" ${IMGTOWEBP_DEFAULT})
option(IMGTOWEBP_LOSSLESS "Use lossless WebP compression" OFF)
if(IMGTOWEBP_LOSSLESS)
set(IMGTOWEBP_QUALITY "100" CACHE STRING "Quality of resulting WebP files")
else(IMGTOWEBP_LOSSLESS)
set(IMGTOWEBP_QUALITY "75" CACHE STRING "Quality of resulting WebP files")
endif(IMGTOWEBP_LOSSLESS)
set(IMGTOWEBP_SCALE "100" CACHE STRING "Scaling factor (percentage) used when converting image assets to WebP")
set(IMGTOWEBP_PARAMS "" CACHE STRING "Additional ImageMagick parameters")
if(IMGTOWEBP)
add_custom_target(${LIBSUPERDERPY_GAMENAME}_img_to_webp
DEPENDS ${ASSET_PIPELINE_DEPEND}
COMMAND ${CMAKE_COMMAND} -DQUALITY="${IMGTOWEBP_QUALITY}" -DRESIZE="${IMGTOWEBP_SCALE}%" -DPARAMS="${IMGTOWEBP_PARAMS}" -DCACHE="${CMAKE_SOURCE_DIR}/.assetcache" -DLOSSLESS="${IMGTOWEBP_LOSSLESS}" -DDATADIR=${ASSET_PIPELINE_DATADIR} -P ${LIBSUPERDERPY_DIR}/cmake/ImgToWebp.cmake
USES_TERMINAL)
add_definitions(-DLIBSUPERDERPY_IMGTOWEBP)
add_definitions("-DLIBSUPERDERPY_IMAGE_SCALE=(${IMGTOWEBP_SCALE} / 100.0)")
else(IMGTOWEBP)
add_custom_target(${LIBSUPERDERPY_GAMENAME}_img_to_webp
DEPENDS ${ASSET_PIPELINE_DEPEND})
add_definitions(-DLIBSUPERDERPY_IMAGE_SCALE=1.0F)
endif(IMGTOWEBP)
else (ANDROID OR EMSCRIPTEN)
add_definitions(-DLIBSUPERDERPY_IMAGE_SCALE=1.0F)
endif (ANDROID OR EMSCRIPTEN)
MACRO(add_libsuperderpy_target EXECUTABLE_SRC_LIST)
if (LIBSUPERDERPY_STATIC_GAMESTATES)
set(SRC_LIST ${EXECUTABLE_SRC_LIST} "${LIBSUPERDERPY_DIR}/src/gamestates-force-inclusion.c")
else()
set(SRC_LIST ${EXECUTABLE_SRC_LIST})
endif()
if(ANDROID)
set(EXECUTABLE superderpy-game)
add_library(${EXECUTABLE} SHARED ${SRC_LIST})
set(APK_PATH ${CMAKE_BINARY_DIR}/android/bin/${LIBSUPERDERPY_GAMENAME}-debug.apk)
add_custom_target(${LIBSUPERDERPY_GAMENAME}_apk ALL
DEPENDS ${EXECUTABLE} ${LIBSUPERDERPY_GAMENAME}_flac_to_lossy ${LIBSUPERDERPY_GAMENAME}_img_to_webp
BYPRODUCTS ${APK_PATH}
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/android"
COMMAND ./gradlew assembleDebug
USES_TERMINAL
)
add_custom_target(${LIBSUPERDERPY_GAMENAME}_install_apk
DEPENDS ${LIBSUPERDERPY_GAMENAME}_apk
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/android"
COMMAND adb -d install -r ${APK_PATH}
USES_TERMINAL
)
add_custom_target(${LIBSUPERDERPY_GAMENAME}_run_apk
DEPENDS ${LIBSUPERDERPY_GAMENAME}_install_apk
COMMAND adb -d shell
'am start -a android.intent.action.MAIN -n ${LIBSUPERDERPY_APPID}/net.dosowisko.libsuperderpy.Activity'
USES_TERMINAL
)
else(ANDROID)
add_executable(${EXECUTABLE} WIN32 MACOSX_BUNDLE ${SRC_LIST})
endif(ANDROID)
if(EMSCRIPTEN)
add_custom_target(${LIBSUPERDERPY_GAMENAME}_install
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
COMMAND "${CMAKE_COMMAND}" --build . --target install
)
string(TOUPPER "CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}" CFLAGS)
string(REPLACE " " ";" CFLAGS_L ${CMAKE_C_FLAGS} " " ${${CFLAGS}})
set(CFLAGS_LIST ${CFLAGS_L})
if("${LIBSUPERDERPY_EMSCRIPTEN_MODE}" STREQUAL "wasm")
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/emscripten-imports.json COMMAND bash -c "(for file in ${CMAKE_INSTALL_PREFIX}/*.wasm.so; do wasm-dis $file; done) | grep \"(import \\\"env\\\" \" | awk '{print $3}' | awk -F '$' '{ print $2?$2:$0}' | sort -u | awk 'BEGIN {printf \"[\\\"_main\\\"\" } END {print \"]\"} {printf \",%s\", $1}' > ${CMAKE_BINARY_DIR}/emscripten-imports.json" DEPENDS ${LIBSUPERDERPY_GAMENAME}_install WORKING_DIRECTORY ${CMAKE_BINARY_DIR} USES_TERMINAL VERBATIM)
else()
# not implemented yet for asm.js
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/emscripten-imports.json COMMAND bash -c "echo '[\"_main\"]' > ${CMAKE_BINARY_DIR}/emscripten-imports.json" DEPENDS ${LIBSUPERDERPY_GAMENAME}_install WORKING_DIRECTORY ${CMAKE_BINARY_DIR} USES_TERMINAL VERBATIM)
endif()
add_custom_target(${LIBSUPERDERPY_GAMENAME}_js
DEPENDS ${LIBSUPERDERPY_GAMENAME}_install ${LIBSUPERDERPY_GAMENAME}_flac_to_lossy ${LIBSUPERDERPY_GAMENAME}_img_to_webp ${CMAKE_BINARY_DIR}/emscripten-imports.json
WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}/${LIBSUPERDERPY_GAMENAME}"
COMMAND "${CMAKE_C_COMPILER}" ${CFLAGS_LIST} ../${BIN_DIR}/${LIBSUPERDERPY_GAMENAME}${CMAKE_EXECUTABLE_SUFFIX} ../lib/libsuperderpy${CMAKE_SHARED_LIBRARY_SUFFIX} ../lib/lib${LIBSUPERDERPY_GAMENAME}${CMAKE_SHARED_LIBRARY_SUFFIX} ${Allegro5_LIBS} ${EMSCRIPTEN_FLAGS} -o ${LIBSUPERDERPY_GAMENAME}.html --shell-file ${CMAKE_BINARY_DIR}/gen/emscripten.html --pre-js ${LIBSUPERDERPY_DIR}/src/emscripten-pre-js.js --preload-file ../${SHARE_DIR}/${LIBSUPERDERPY_GAMENAME}/data@/data --preload-file gamestates@/
USES_TERMINAL
VERBATIM
)
endif(EMSCRIPTEN)
ENDMACRO()
if(ANDROID)
set(ANDROID_TARGET "android-33" CACHE STRING "What Android target to compile for.")
STRING(REGEX REPLACE "^android-" "" ANDROID_TARGET_VERSION ${ANDROID_TARGET})
set(LIBSUPERDERPY_PLATFORM_OVERRIDE "android")
file(REMOVE_RECURSE "${CMAKE_BINARY_DIR}/android")
file(COPY "${LIBSUPERDERPY_DIR}/android" DESTINATION "${CMAKE_BINARY_DIR}")
MACRO(configure_android_file PATH)
configure_file("${CMAKE_BINARY_DIR}/android/${PATH}.in" "${CMAKE_BINARY_DIR}/android/${PATH}" ${ARGN})
file(REMOVE "${CMAKE_BINARY_DIR}/android/${PATH}.in")
ENDMACRO()
if (LIBSUPERDERPY_ORIENTATION STREQUAL "PORTRAIT")
set(LIBSUPERDERPY_ANDROID_ORIENTATION "sensorPortrait")
elseif(LIBSUPERDERPY_ORIENTATION STREQUAL "LANDSCAPE")
set(LIBSUPERDERPY_ANDROID_ORIENTATION "sensorLandscape")
else()
set(LIBSUPERDERPY_ANDROID_ORIENTATION "unspecified")
endif()
if (NOT DEFINED LIBSUPERDERPY_ANDROID_DEBUGGABLE)
set(LIBSUPERDERPY_ANDROID_DEBUGGABLE "true")
endif(NOT DEFINED LIBSUPERDERPY_ANDROID_DEBUGGABLE)
configure_android_file("app/src/main/AndroidManifest.xml")
configure_android_file("local.properties")
configure_android_file("app/build.gradle")
configure_android_file("app/src/main/res/values/strings.xml")
if (Allegro5_LIBRARIES MATCHES "^.*-debug.*$")
set(ALLEGRO_DEBUG_SUFFIX "-debug")
endif()
configure_android_file("app/src/main/java/net/dosowisko/libsuperderpy/Activity.java")
file(INSTALL ${Allegro5_LIBS} DESTINATION ${LIBRARY_OUTPUT_PATH})
configure_file("${ANDROID_ALLEGRO_ROOT}/lib/allegro-release.aar" ${CMAKE_BINARY_DIR}/android/app/libs/allegro.aar COPYONLY)
file(INSTALL "${CMAKE_SOURCE_DIR}/data" DESTINATION "${CMAKE_BINARY_DIR}/android/app/src/main/assets/"
PATTERN "stuff" EXCLUDE
PATTERN ".git" EXCLUDE
PATTERN ".gitignore" EXCLUDE
PATTERN ".directory" EXCLUDE
PATTERN "CMakeLists.txt" EXCLUDE
PATTERN "android" EXCLUDE
PATTERN "maemo5" EXCLUDE
PATTERN "pocketchip" EXCLUDE
PATTERN "raspberrypi" EXCLUDE
PATTERN "steamlink" EXCLUDE
PATTERN "emscripten" EXCLUDE
PATTERN "vita" EXCLUDE
)
if(EXISTS "${CMAKE_SOURCE_DIR}/data/android")
file(INSTALL "${CMAKE_SOURCE_DIR}/data/android/" DESTINATION "${CMAKE_BINARY_DIR}/android/app/src/main/assets/data/"
PATTERN ".git" EXCLUDE
PATTERN ".gitignore" EXCLUDE
PATTERN ".directory" EXCLUDE
)
endif()
file(INSTALL "${CMAKE_SOURCE_DIR}/data/icons/48/${LIBSUPERDERPY_GAMENAME}.png" DESTINATION "${CMAKE_BINARY_DIR}/android/app/src/main/res/mipmap-mdpi/")
file(INSTALL "${CMAKE_SOURCE_DIR}/data/icons/72/${LIBSUPERDERPY_GAMENAME}.png" DESTINATION "${CMAKE_BINARY_DIR}/android/app/src/main/res/mipmap-hdpi/")
file(INSTALL "${CMAKE_SOURCE_DIR}/data/icons/96/${LIBSUPERDERPY_GAMENAME}.png" DESTINATION "${CMAKE_BINARY_DIR}/android/app/src/main/res/mipmap-xhdpi/")
file(INSTALL "${CMAKE_SOURCE_DIR}/data/icons/144/${LIBSUPERDERPY_GAMENAME}.png" DESTINATION "${CMAKE_BINARY_DIR}/android/app/src/main/res/mipmap-xxhdpi/")
file(INSTALL "${CMAKE_SOURCE_DIR}/data/icons/192/${LIBSUPERDERPY_GAMENAME}.png" DESTINATION "${CMAKE_BINARY_DIR}/android/app/src/main/res/mipmap-xxxhdpi/")
endif(ANDROID)
if(VITA)
include("$ENV{VITASDK}/share/vita.cmake" REQUIRED)
if(NOT LIBSUPERDERPY_VITA_TITLEID)
message(FATAL_ERROR "No TitleID for Vita provided (LIBSUPERDERPY_VITA_TITLEID)")
endif()
file(REMOVE_RECURSE "${CMAKE_BINARY_DIR}/vita")
file(INSTALL "${CMAKE_SOURCE_DIR}/data" DESTINATION "${CMAKE_BINARY_DIR}/vita/"
PATTERN "stuff" EXCLUDE
PATTERN ".git" EXCLUDE
PATTERN ".gitignore" EXCLUDE
PATTERN ".directory" EXCLUDE
PATTERN "CMakeLists.txt" EXCLUDE
PATTERN "android" EXCLUDE
PATTERN "maemo5" EXCLUDE
PATTERN "pocketchip" EXCLUDE
PATTERN "raspberrypi" EXCLUDE
PATTERN "steamlink" EXCLUDE
PATTERN "emscripten" EXCLUDE
PATTERN "vita" EXCLUDE
)
if(EXISTS "${CMAKE_SOURCE_DIR}/data/vita")
file(INSTALL "${CMAKE_SOURCE_DIR}/data/vita/" DESTINATION "${CMAKE_BINARY_DIR}/vita/data/"
PATTERN ".git" EXCLUDE
PATTERN ".gitignore" EXCLUDE
PATTERN ".directory" EXCLUDE
PATTERN "sce_sys" EXCLUDE
)
endif()
if(EXISTS "${CMAKE_SOURCE_DIR}/data/vita/sce_sys")
file(INSTALL "${CMAKE_SOURCE_DIR}/data/vita/sce_sys" DESTINATION "${CMAKE_BINARY_DIR}/vita/")
else()
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/vita/sce_sys")
endif()
vita_create_self(eboot.bin ${CMAKE_BINARY_DIR}/src/${LIBSUPERDERPY_GAMENAME} UNSAFE)
vita_create_vpk(${LIBSUPERDERPY_GAMENAME}.vpk "${LIBSUPERDERPY_VITA_TITLEID}" eboot.bin
NAME "${LIBSUPERDERPY_GAMENAME_PRETTY}"
FILE "${CMAKE_BINARY_DIR}/vita/sce_sys" sce_sys
FILE "${CMAKE_BINARY_DIR}/vita/data" data
)
if(NOT EXISTS "${CMAKE_SOURCE_DIR}/data/vita/sce_sys/icon0.png")
add_custom_target(${LIBSUPERDERPY_GAMENAME}_vita_icon BYPRODUCTS ${CMAKE_BINARY_DIR}/vita/sce_sys/icon0.png
COMMAND convert ${CMAKE_SOURCE_DIR}/data/icons/128/${LIBSUPERDERPY_GAMENAME}.png -background white -flatten ${CMAKE_BINARY_DIR}/vita/icon.png
COMMAND pngquant 256 -f -o ${CMAKE_BINARY_DIR}/vita/icon2.png ${CMAKE_BINARY_DIR}/vita/icon.png
COMMAND convert ${CMAKE_BINARY_DIR}/vita/icon2.png png8:${CMAKE_BINARY_DIR}/vita/sce_sys/icon0.png
)
add_dependencies(${LIBSUPERDERPY_GAMENAME}.vpk ${LIBSUPERDERPY_GAMENAME}_vita_icon)
endif()
if(DEFINED ENV{VITA_IP})
add_custom_target(${LIBSUPERDERPY_GAMENAME}_deploy_vpk
DEPENDS ${LIBSUPERDERPY_GAMENAME}.vpk
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
COMMAND curl --ftp-method nocwd -T ${LIBSUPERDERPY_GAMENAME}.vpk ftp://$ENV{VITA_IP}:1337/ux0:/data/
COMMAND echo destroy | nc $ENV{VITA_IP} 1338
COMMAND echo screen on | nc $ENV{VITA_IP} 1338
COMMAND echo vpk ux0:/data/${LIBSUPERDERPY_GAMENAME}.vpk | nc $ENV{VITA_IP} 1338
COMMAND echo screen on | nc $ENV{VITA_IP} 1338
COMMAND echo launch ${LIBSUPERDERPY_VITA_TITLEID} | nc $ENV{VITA_IP} 1338
USES_TERMINAL
)
add_custom_target(${LIBSUPERDERPY_GAMENAME}_deploy_eboot
DEPENDS eboot.bin
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
COMMAND echo destroy | nc $ENV{VITA_IP} 1338
COMMAND sleep 1
COMMAND echo screen on | nc $ENV{VITA_IP} 1338
COMMAND curl --ftp-method nocwd -T eboot.bin ftp://$ENV{VITA_IP}:1337/ux0:/app/${LIBSUPERDERPY_VITA_TITLEID}/
COMMAND echo launch ${LIBSUPERDERPY_VITA_TITLEID} | nc $ENV{VITA_IP} 1338
USES_TERMINAL
)
if(EXISTS "${CMAKE_SOURCE_DIR}/data/vita/shaders")
add_custom_target(${LIBSUPERDERPY_GAMENAME}_deploy_shaders
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
COMMAND echo destroy | nc $ENV{VITA_IP} 1338
COMMAND sleep 1
COMMAND echo screen on | nc $ENV{VITA_IP} 1338
COMMAND lftp -e 'mirror -R "${CMAKE_SOURCE_DIR}/data/vita/shaders/" ux0:/app/${LIBSUPERDERPY_VITA_TITLEID}/data/vita/shaders/ && exit' $ENV{VITA_IP} -p 1337
COMMAND echo launch ${LIBSUPERDERPY_VITA_TITLEID} | nc $ENV{VITA_IP} 1338
USES_TERMINAL
)
endif()
else()
message(STATUS "No VITA_IP found; set this env var for ability to deploy straight to Vita (using loaderCompanion)")
endif()
endif(VITA)
# setup default RPATH/install_name handling
# default is to build with RPATH for the install dir, so it doesn't need to relink
if (UNIX)
if (APPLE)
set(CMAKE_INSTALL_NAME_DIR ${CMAKE_INSTALL_PREFIX}/${LIB_DIR})
else (APPLE)
# use the RPATH figured out by cmake when compiling
set(CMAKE_SKIP_BUILD_RPATH TRUE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif (APPLE)
endif (UNIX)
# uninstall target
configure_file("${LIBSUPERDERPY_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)
add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
if (LIBSUPERDERPY_PLATFORM_OVERRIDE)
add_definitions(-DLIBSUPERDERPY_PLATFORM_OVERRIDE=\"${LIBSUPERDERPY_PLATFORM_OVERRIDE}\")
endif()
set(LIBSUPERDERPY_CONFIG_INCLUDED 1)
endif (NOT LIBSUPERDERPY_CONFIG_INCLUDED)