diff --git a/CMakeLists.txt b/CMakeLists.txt index b5d765cd..a294ff96 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,36 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") string(TOUPPER "${CMAKE_BUILD_TYPE}" PSEMEK_BUILD_TYPE) +set(_PSEMEK_ALL_PLATFORMS linux windows mac android web) + +if(WIN32) + set(_PSEMEK_PLATFORM windows) +elseif(APPLE) + set(_PSEMEK_PLATFORM mac) +elseif(ANDROID) + set(_PSEMEK_PLATFORM android) +elseif(UNIX) + if (CMAKE_SYSTEM_NAME STREQUAL Emscripten) + set(_PSEMEK_PLATFORM web) + else() + set(_PSEMEK_PLATFORM linux) + endif() +else() + message(WARNING "Failed to detect platform") + set(_PSEMEK_PLATFORM unknown) +endif() + +set(PSEMEK_PLATFORM "${_PSEMEK_PLATFORM}" CACHE INTERNAL "Build platform (auto-detected)") + +foreach(_PLATFORM IN LISTS _PSEMEK_ALL_PLATFORMS) + string(TOUPPER "${_PLATFORM}" _PLATFORM_UPPER) + set(_PLATFORM_ON OFF) + if("${_PLATFORM}" STREQUAL "${_PSEMEK_PLATFORM}") + set(_PLATFORM_ON ON) + endif() + set(PSEMEK_PLATFORM_${_PLATFORM_UPPER} "${_PLATFORM_ON}" CACHE INTERNAL "Build platform is ${_PLATFORM}") +endforeach() + set(PSEMEK_DEFINITIONS) if(PSEMEK_BUILD_TYPE STREQUAL "DEBUG") list(APPEND PSEMEK_DEFINITIONS "-DPSEMEK_DEBUG=1") diff --git a/package/CMakeLists.txt b/package/CMakeLists.txt index fa3492e7..2970af0f 100644 --- a/package/CMakeLists.txt +++ b/package/CMakeLists.txt @@ -3,26 +3,11 @@ set(PSEMEK_PACKAGE_OUTPUT_PATH "" CACHE STRING "Packaging output path") set(PSEMEK_PACKAGE_VERSION_SUFFIX "" CACHE STRING "Packaging version suffix") if(PSEMEK_PACKAGE_MODE) - if(WIN32) - set(PSEMEK_PACKAGE_SUFFIX_RAW windows) - elseif(APPLE) - set(PSEMEK_PACKAGE_SUFFIX_RAW mac) - elseif(ANDROID) - set(PSEMEK_PACKAGE_SUFFIX_RAW android) - elseif(UNIX) - if (CMAKE_SYSTEM_NAME STREQUAL Emscripten) - set(PSEMEK_PACKAGE_SUFFIX_RAW web) - else() - set(PSEMEK_PACKAGE_SUFFIX_RAW linux) - endif() - else() - message(FATAL "Uknown system for packaging") - endif() - set(PSEMEK_PACKAGE_SUFFIX ${PSEMEK_PACKAGE_SUFFIX_RAW} CACHE INTERNAL "Packaging suffix" FORCE) + set(PSEMEK_PACKAGE_SUFFIX ${PSEMEK_PLATFORM} CACHE INTERNAL "Packaging suffix" FORCE) set(PSEMEK_PACKAGE_LINK_FLAGS_RAW) - if(CMAKE_SYSTEM_NAME STREQUAL Emscripten) + if(PSEMEK_PLATFORM_WEB) list(APPEND PSEMEK_PACKAGE_LINK_FLAGS_RAW "-sMIN_WEBGL_VERSION=2" "-sNO_DISABLE_EXCEPTION_CATCHING" "-sFULL_ES3") list(APPEND PSEMEK_PACKAGE_LINK_FLAGS_RAW "-sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='$autoResumeAudioContext','$dynCall'") if(CMAKE_BUILD_TYPE STREQUAL Debug) @@ -41,7 +26,7 @@ function(psemek_package_output_path target outvar) message(FATAL "psemek_package_output_path must only be called during packaging") endif() - if(ANDROID) + if(PSEMEK_PLATFORM_ANDROID) set(_PACKAGE_EXTENSION apk) else() set(_PACKAGE_EXTENSION zip) @@ -60,7 +45,7 @@ function(psemek_add_executable_impl target is_application) target_link_libraries(${target} PUBLIC psemek) if(${is_application}) - if(ANDROID) + if(PSEMEK_PLATFORM_ANDROID) target_link_libraries(${target} PUBLIC "-Wl,--whole-archive $ -Wl,--no-whole-archive" ${PSEMEK_BACKEND_LIBRARY}) @@ -68,7 +53,7 @@ function(psemek_add_executable_impl target is_application) target_link_libraries(${target} PUBLIC ${PSEMEK_BACKEND_LIBRARY}) endif() - if(CMAKE_SYSTEM_NAME STREQUAL Emscripten) + if(PSEMEK_PLATFORM_WEB) target_link_options(${target} PRIVATE "--shell-file=${CMAKE_CURRENT_FUNCTION_LIST_DIR}/web/template.html" ) @@ -83,13 +68,13 @@ function(psemek_add_executable_impl target is_application) target_compile_definitions(${target} PUBLIC "-DPSEMEK_PACKAGE_MODE") - if(UNIX AND (NOT APPLE)) + if(PSEMEK_PLATFORM_LINUX) set_target_properties(${target} PROPERTIES BUILD_RPATH "." ) endif() - if(UNIX AND (NOT APPLE) AND (NOT ANDROID) AND (NOT (CMAKE_SYSTEM_NAME STREQUAL Emscripten))) + if(PSEMEK_PLATFORM_LINUX) add_custom_command(TARGET ${target} POST_BUILD COMMAND chrpath -r . $ ) @@ -97,13 +82,13 @@ function(psemek_add_executable_impl target is_application) psemek_package_output_path(${target} _OUTPUT_PATH) - if(NOT ANDROID) + if(NOT PSEMEK_PLATFORM_ANDROID) get_filename_component(_OUTPUT_DIRECTORY "${_OUTPUT_PATH}" DIRECTORY) set(_TARGET_FILE $) set(_TARGET_RUNTIME) - if(CMAKE_SYSTEM_NAME STREQUAL Emscripten) + if(PSEMEK_PLATFORM_WEB) set(_TARGET_PARENT $) set(_TARGET_STEM $) set(_TARGET_NOEXT "${_TARGET_PARENT}/${_TARGET_STEM}") @@ -126,6 +111,7 @@ function(psemek_add_executable_impl target is_application) add_custom_command(TARGET ${target} POST_BUILD COMMAND echo Packaging target ${target} into ${_OUTPUT_PATH} COMMAND mkdir -pv "${_OUTPUT_DIRECTORY}" + COMMAND rm -f "${_OUTPUT_PATH}" COMMAND zip -v "${_OUTPUT_PATH}" -j ${_COPY_FILES} COMMAND echo Packaged target ${target} into ${_OUTPUT_PATH} ) @@ -204,7 +190,7 @@ function(psemek_add_library target) endfunction() function(psemek_add_winrc target path) - if(WIN32 AND (TARGET ${target})) + if(PSEMEK_PLATFORM_WINDOWS AND (TARGET ${target})) get_target_property(OUT_DIR ${target} BINARY_DIR) set(_IN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${path}") @@ -224,12 +210,12 @@ endfunction() function(psemek_package_files target) if(PSEMEK_PACKAGE_MODE) if(PSEMEK_PACKAGE_TARGET) - if(ANDROID) + if(PSEMEK_PLATFORM_ANDROID) add_custom_command(TARGET ${target} POST_BUILD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} COMMAND ${PSEMEK_COPY_FILES} ${ARGN} ) - elseif(CMAKE_SYSTEM_NAME STREQUAL Emscripten) + elseif(PSEMEK_PLATFORM_WEB) foreach(_FILE IN LISTS ARGN) target_link_options(${target} PRIVATE "--preload-file=${CMAKE_CURRENT_LIST_DIR}/${_FILE}@/${_FILE}"