diff --git a/CMakeLists.txt b/CMakeLists.txt index 271fa67a..fbab072f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,11 +2,11 @@ cmake_minimum_required(VERSION 3.25...4.0 FATAL_ERROR) project(isle LANGUAGES CXX C VERSION 0.1) -if(WINDOWS_STORE) +if (WINDOWS_STORE) add_compile_definitions(WINDOWS_STORE) endif() -if(EMSCRIPTEN) +if (EMSCRIPTEN) add_compile_options(-pthread) add_link_options(-sALLOW_MEMORY_GROWTH=1 -sMAXIMUM_MEMORY=2gb -sUSE_PTHREADS=1 -sPROXY_TO_PTHREAD=1 -sOFFSCREENCANVAS_SUPPORT=1 -sPTHREAD_POOL_SIZE_STRICT=0 -sFORCE_FILESYSTEM=1 -sWASMFS=1 -sEXIT_RUNTIME=1) set(SDL_PTHREADS ON CACHE BOOL "Enable SDL pthreads" FORCE) @@ -25,7 +25,7 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) -if(NOT MINGW) +if (NOT MINGW) set(NOT_MINGW ON) else() set(NOT_MINGW OFF) @@ -51,32 +51,33 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" CACHE PATH "Directory w set(ISLE_EMSCRIPTEN_HOST "" CACHE STRING "Host URL for Emscripten streaming (e.g., https://test.com)") cmake_dependent_option(BUILD_SHARED_LIBS "Build lego1 as a shared library" ON "NOT EMSCRIPTEN" OFF) -message(STATUS "Isle app: ${ISLE_BUILD_APP}") -message(STATUS "Internal DirectX5 SDK: ${ISLE_USE_DX5}") -message(STATUS "Internal miniwin: ${ISLE_MINIWIN}") -message(STATUS "Isle debugging: ${ISLE_DEBUG}") -message(STATUS "Compile shaders: ${ISLE_COMPILE_SHADERS}") +message(STATUS "Isle app: ${ISLE_BUILD_APP}") +message(STATUS "Config app: ${ISLE_BUILD_CONFIG}") +message(STATUS "Internal DirectX5 SDK: ${ISLE_USE_DX5}") +message(STATUS "Internal miniwin: ${ISLE_MINIWIN}") +message(STATUS "Isle debugging: ${ISLE_DEBUG}") +message(STATUS "Compile shaders: ${ISLE_COMPILE_SHADERS}") add_library(Isle::iniparser INTERFACE IMPORTED) -if(DOWNLOAD_DEPENDENCIES) +if (DOWNLOAD_DEPENDENCIES) # FetchContent downloads and configures dependencies message(STATUS "Fetching SDL3 and iniparser. This might take a while...") include(FetchContent) - if(WINDOWS_STORE) - FetchContent_Declare( - SDL3 - GIT_REPOSITORY "https://github.com/Helloyunho/SDL3-uwp.git" - GIT_TAG "main" - EXCLUDE_FROM_ALL - ) - else() - FetchContent_Declare( + if (WINDOWS_STORE) + FetchContent_Declare( SDL3 - GIT_REPOSITORY "https://github.com/libsdl-org/SDL.git" + GIT_REPOSITORY "https://github.com/Helloyunho/SDL3-uwp.git" GIT_TAG "main" EXCLUDE_FROM_ALL - ) + ) + else() + FetchContent_Declare( + SDL3 + GIT_REPOSITORY "https://github.com/libsdl-org/SDL.git" + GIT_TAG "main" + EXCLUDE_FROM_ALL + ) endif() FetchContent_MakeAvailable(SDL3) @@ -103,19 +104,18 @@ else() endif() set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -if(ENABLE_CLANG_TIDY) +if (ENABLE_CLANG_TIDY) find_program(CLANG_TIDY_BIN NAMES "clang-tidy" ENV "LLVM_ROOT" REQUIRED) set(CMAKE_C_CLANG_TIDY "${CLANG_TIDY_BIN}") set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_BIN}") endif() -if(ISLE_ASAN) +if (ISLE_ASAN) add_compile_options(-fsanitize=address -fno-omit-frame-pointer) add_link_options(-fsanitize=address) endif() -if(ISLE_UBSAN) +if (ISLE_UBSAN) add_compile_options(-fsanitize=undefined -fno-sanitize-recover=undefined) add_link_options(-fsanitize=undefined) endif() @@ -125,27 +125,24 @@ add_subdirectory(miniwin EXCLUDE_FROM_ALL) set(isle_targets) function(add_cxx_warning WARNING) - if(ISLE_WERROR) + if (ISLE_WERROR) set(compiler_option "-Werror=${WARNING}") else() set(compiler_option "-W${WARNING}") endif() - string(MAKE_C_IDENTIFIER "COMPILER_SUPPORTS${compiler_option}" varname) cmake_push_check_state(RESET) set(CMAKE_REQUIRED_FLAGS "${compiler_option} ") - - if(MSVC) + if (MSVC) string(APPEND CMAKE_REQUIRED_FLAGS "/WX") else() string(APPEND CMAKE_REQUIRED_FLAGS "-Werror") endif() - check_cxx_source_compiles("int main() { return 0; }" ${varname}) cmake_pop_check_state() - if(${varname}) + if (${varname}) add_compile_options(${compiler_option}) endif() endfunction() @@ -175,7 +172,6 @@ target_include_directories(lego1 PUBLIC "$:DirectX5::DirectX5>) - if(WIN32) set_property(TARGET lego1 PROPERTY PREFIX "") endif() @@ -224,8 +220,7 @@ target_sources(lego1 PRIVATE LEGO1/mxdirectx/legodxinfo.cpp ) target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1") - -if(WIN32) +if (WIN32) target_link_libraries(lego1 PRIVATE ddraw) endif() @@ -362,11 +357,9 @@ target_sources(lego1 PRIVATE LEGO1/omni/src/video/mxvideopresenter.cpp ) target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1/omni/include" "${CMAKE_SOURCE_DIR}/LEGO1") - -if(WIN32) +if (WIN32) target_link_libraries(lego1 INTERFACE winmm) endif() - target_link_libraries(lego1 PRIVATE libsmacker miniaudio) target_include_directories(lego1 PUBLIC $>) @@ -483,21 +476,19 @@ target_sources(lego1 PRIVATE LEGO1/modeldb/modeldb.cpp ) target_link_libraries(lego1 PRIVATE Vec::Vec) - -if(NOT ISLE_MINIWIN) +if (NOT ISLE_MINIWIN) target_link_libraries(lego1 PRIVATE d3drm dxguid) target_compile_definitions(lego1 PRIVATE DIRECTINPUT_VERSION=0x0500) endif() -if(ISLE_BUILD_APP) +if (ISLE_BUILD_APP) add_executable(isle WIN32 ISLE/res/isle.rc ISLE/isleapp.cpp ISLE/islefiles.cpp ) list(APPEND isle_targets isle) - - if(WIN32) + if (WIN32) add_custom_command(TARGET isle POST_BUILD COMMAND "${CMAKE_COMMAND}" -E copy $ "$" COMMAND_EXPAND_LISTS @@ -516,13 +507,11 @@ if(ISLE_BUILD_APP) target_link_libraries(isle PRIVATE miniwin-headers) # Link DSOUND and WINMM - if(WIN32) + if (WIN32) target_link_libraries(isle PRIVATE winmm) endif() - # Link LEGO1 target_link_libraries(isle PRIVATE lego1) - if(ISLE_DEBUG) target_sources(isle PRIVATE ISLE/isledebug.cpp @@ -530,7 +519,6 @@ if(ISLE_BUILD_APP) target_compile_definitions(isle PRIVATE ISLE_DEBUG) target_link_libraries(isle PRIVATE imgui) find_path(valgrind_INCLUDE_PATH NAMES valgrind/callgrind.h) - if(valgrind_INCLUDE_PATH) # Run isle under valgrind to create a profile. Use e.g. kcachegrind to view the profile. # > valgrind --tool=callgrind --dump-instr=yes --simulate-cache=yes --collect-jumps=yes \ @@ -539,7 +527,6 @@ if(ISLE_BUILD_APP) target_include_directories(isle PRIVATE ${valgrind_INCLUDE_PATH}) endif() endif() - if(EMSCRIPTEN) target_sources(isle PRIVATE ISLE/emscripten/events.cpp @@ -555,7 +542,7 @@ if(ISLE_BUILD_APP) ISLE/3ds/config.cpp ) endif() - if(WINDOWS_STORE) + if (WINDOWS_STORE) set(ISLE_CURSORS ISLE/res/arrow.bmp ISLE/res/busy.bmp @@ -564,7 +551,6 @@ if(ISLE_BUILD_APP) set_source_files_properties(${ISLE_CURSORS} PROPERTIES VS_DEPLOYMENT_CONTENT 1 ) - target_sources(isle PRIVATE ${ISLE_CURSORS}) endif() endif() @@ -601,64 +587,54 @@ if (ISLE_BUILD_CONFIG) endif() endif() -if(ISLE_MINIWIN) +if (ISLE_MINIWIN) set_property(TARGET ${isle_targets} APPEND PROPERTY LINK_LIBRARIES "miniwin") endif() -if(MSVC) - if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "15") +if (MSVC) + if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "15") set_property(TARGET ${isle_targets} APPEND PROPERTY COMPILE_DEFINITIONS "_CRT_SECURE_NO_WARNINGS") - - if(TARGET isle) + if (TARGET isle) target_compile_definitions(isle PRIVATE "_CRT_SECURE_NO_WARNINGS") endif() - - if(TARGET isle-config) + if (TARGET isle-config) target_compile_definitions(isle-config PRIVATE "_CRT_SECURE_NO_WARNINGS") endif() - - if(TARGET iniparser-static) + if (TARGET iniparser-static) target_compile_definitions(iniparser-static PRIVATE "_CRT_SECURE_NO_WARNINGS") endif() - - if(TARGET libsmacker) + if (TARGET libsmacker) target_compile_definitions(libsmacker PRIVATE "_CRT_SECURE_NO_WARNINGS") endif() endif() - # Visual Studio 2017 version 15.7 needs "/Zc:__cplusplus" for __cplusplus - if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "19.14.26428") + if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "19.14.26428") set_property(TARGET ${isle_targets} APPEND PROPERTY COMPILE_OPTIONS "-Zc:__cplusplus") - - if(TARGET isle) + if (TARGET isle) target_compile_options(isle PRIVATE "-Zc:__cplusplus") endif() - - if(TARGET isle-config) + if (TARGET isle-config) target_compile_options(isle-config PRIVATE "-Zc:__cplusplus") endif() endif() endif() -if(MSVC) +if (MSVC) target_link_options(isle PRIVATE "/SAFESEH:NO") target_link_options(lego1 PRIVATE "/SAFESEH:NO") endif() find_program(CLANGFORMAT_BIN NAMES clang-format) - -if(EXISTS "${CLANGFORMAT_BIN}") +if (EXISTS "${CLANGFORMAT_BIN}") execute_process(COMMAND "${CLANGFORMAT_BIN}" --version OUTPUT_VARIABLE "CLANGFORMAT_VERSION_OUTPUT" RESULT_VARIABLE "CLANGFORMAT_RESULT" ) - - if(CLANGFORMAT_RESULT EQUAL 0 AND CLANGFORMAT_VERSION_OUTPUT MATCHES "version ([0-9\\.]+)") + if (CLANGFORMAT_RESULT EQUAL 0 AND CLANGFORMAT_VERSION_OUTPUT MATCHES "version ([0-9\\.]+)") set(CLANGFORMAT_VERSION "${CMAKE_MATCH_1}") set(CLANGFORMAT_VERSION_REQUIRED "17.0") message(DEBUG "Found clang-format version ${CLANGFORMAT_VERSION} (needs ${CLANGFORMAT_VERSION_REQUIRED}") - - if(CLANGFORMAT_VERSION VERSION_GREATER_EQUAL "${CLANGFORMAT_VERSION_REQUIRED}") + if (CLANGFORMAT_VERSION VERSION_GREATER_EQUAL "${CLANGFORMAT_VERSION_REQUIRED}") file(GLOB_RECURSE isle_sources "${PROJECT_SOURCE_DIR}/ISLE/*.cpp" "${PROJECT_SOURCE_DIR}/ISLE/*.h" @@ -673,10 +649,8 @@ if(EXISTS "${CLANGFORMAT_BIN}") endif() set(install_extra_targets) - if(DOWNLOAD_DEPENDENCIES) get_property(sdl3_type TARGET SDL3::SDL3 PROPERTY TYPE) - if(sdl3_type STREQUAL "SHARED_LIBRARY") list(APPEND install_extra_targets "SDL3-shared") endif() @@ -695,12 +669,15 @@ set(ISLE_PACKAGE_NAME "${CMAKE_SYSTEM_NAME}-${ISLE_CPUS_STRING}" CACHE STRING "P if(BUILD_SHARED_LIBS) list(APPEND install_extra_targets lego1) endif() - install(TARGETS isle ${install_extra_targets} RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ) - +if (ISLE_BUILD_CONFIG) + install(TARGETS isle-config + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ) +endif() if(EMSCRIPTEN) install(FILES "$/isle.js" "$/isle.wasm" DESTINATION "${CMAKE_INSTALL_BINDIR}" @@ -730,4 +707,4 @@ else() set(CPACK_GENERATOR TGZ) endif() -include(CPack) +include(CPack) \ No newline at end of file