@@ -38,11 +38,19 @@ set(CMAKE_CXX_STANDARD 17)
3838set (CMAKE_CXX_STANDARD_REQUIRED ON )
3939set (CMAKE_CXX_EXTENSIONS OFF )
4040
41+ set (ISLE_MORTAR_SDL3_DEFAULT ON )
42+ set (ISLE_MORTAR_SDL3_DYNAMIC_AVAILABLE ON )
43+ if (ANDROID OR IOS OR EMSCRIPTEN OR NINTENDO_3DS OR NX OR VITA OR XBOXONE OR CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch" )
44+ set (ISLE_MORTAR_SDL3_DYNAMIC_AVAILABLE OFF )
45+ endif ()
46+ option (ISLE_MORTAR_SDL3 "Mortar SDL3 backend" ${ISLE_MORTAR_SDL3_DEFAULT} )
47+ cmake_dependent_option(ISLE_MORTAR_SDL3_DYNAMIC "Mortar dynamic SDL3 backend" ON "ISLE_MORTAR_SDL3;${ISLE_MORTAR_SDL3_DYNAMIC_AVAILABLE} " OFF )
48+
4149if (NOT MINGW)
4250 set (NOT_MINGW ON )
4351else ()
4452 set (NOT_MINGW OFF )
45- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static -static-libgcc -static-libstdc++" )
53+ set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl, -static -static-libgcc -static-libstdc++" )
4654endif ()
4755
4856find_program (SDL_SHADERCROSS_BIN NAMES "shadercross" )
@@ -76,46 +84,48 @@ add_library(Isle::iniparser INTERFACE IMPORTED)
7684
7785if (DOWNLOAD_DEPENDENCIES)
7886 # FetchContent downloads and configures dependencies
79- message (STATUS "Fetching SDL3 and iniparser. This might take a while..." )
8087 include (FetchContent)
81-
82- if (ANDROID)
83- # Built by Gradle
84- find_package (SDL3 REQUIRED CONFIG COMPONENTS Shared)
85- else ()
86- if (WINDOWS_STORE)
87- FetchContent_Declare(
88- SDL3
89- GIT_REPOSITORY "https://github.com/Helloyunho/SDL3-uwp.git"
90- GIT_TAG "main"
91- EXCLUDE_FROM_ALL
92- )
93- elseif (NINTENDO_SWITCH)
94- FetchContent_Declare(
95- SDL3
96- # Official repo missing Threads support?
97- #GIT_REPOSITORY "https://github.com/devkitPro/SDL.git"
98- #GIT_TAG "switch-sdl-3.2"
99- #GIT_REPOSITORY "https://github.com/vs49688/SDL.git"
100- GIT_REPOSITORY "https://github.com/SnepOMatic/SDL3-Switch.git"
101- GIT_TAG "switch-sdl-3.2.14"
102- EXCLUDE_FROM_ALL
103- )
104- set (CMAKE_DISABLE_PRECOMPILE_HEADERS ON CACHE BOOL "Disable PCH globally" FORCE)
88+ if (ISLE_MORTAR_SDL3)
89+ if (ANDROID)
90+ # Built by Gradle
91+ find_package (SDL3 REQUIRED CONFIG COMPONENTS Shared)
10592 else ()
106- set (ISLE_SDL3_GIT_REPO "https://github.com/libsdl-org/SDL.git" CACHE STRING "The SDL3 git repo" )
107- set (ISLE_SDL3_GIT_TAG "main" CACHE STRING "The SDL3 git tag" )
108- FetchContent_Declare(
109- SDL3
110- GIT_REPOSITORY "${ISLE_SDL3_GIT_REPO} "
111- GIT_TAG "${ISLE_SDL3_GIT_TAG} "
112- UPDATE_DISCONNECTED TRUE
113- EXCLUDE_FROM_ALL
114- )
93+ message (STATUS "Fetching SDL3. This might take a while..." )
94+ if (WINDOWS_STORE)
95+ FetchContent_Declare(
96+ SDL3
97+ GIT_REPOSITORY "https://github.com/Helloyunho/SDL3-uwp.git"
98+ GIT_TAG "main"
99+ EXCLUDE_FROM_ALL
100+ )
101+ elseif (NINTENDO_SWITCH)
102+ FetchContent_Declare(
103+ SDL3
104+ # Official repo missing Threads support?
105+ #GIT_REPOSITORY "https://github.com/devkitPro/SDL.git"
106+ #GIT_TAG "switch-sdl-3.2"
107+ #GIT_REPOSITORY "https://github.com/vs49688/SDL.git"
108+ GIT_REPOSITORY "https://github.com/SnepOMatic/SDL3-Switch.git"
109+ GIT_TAG "switch-sdl-3.2.14"
110+ EXCLUDE_FROM_ALL
111+ )
112+ set (CMAKE_DISABLE_PRECOMPILE_HEADERS ON CACHE BOOL "Disable PCH globally" FORCE)
113+ else ()
114+ set (ISLE_SDL3_GIT_REPO "https://github.com/libsdl-org/SDL.git" CACHE STRING "The SDL3 git repo" )
115+ set (ISLE_SDL3_GIT_TAG "main" CACHE STRING "The SDL3 git tag" )
116+ FetchContent_Declare(
117+ SDL3
118+ GIT_REPOSITORY "${ISLE_SDL3_GIT_REPO} "
119+ GIT_TAG "${ISLE_SDL3_GIT_TAG} "
120+ UPDATE_DISCONNECTED TRUE
121+ EXCLUDE_FROM_ALL
122+ )
123+ endif ()
124+ FetchContent_MakeAvailable(SDL3)
115125 endif ()
116- FetchContent_MakeAvailable(SDL3)
117126 endif ()
118127
128+ message (STATUS "Fetching iniparser. This might take a while..." )
119129 FetchContent_Declare(
120130 iniparser
121131 GIT_REPOSITORY "https://gitlab.com/iniparser/iniparser.git"
@@ -130,10 +140,12 @@ if (DOWNLOAD_DEPENDENCIES)
130140 target_link_libraries (Isle::iniparser INTERFACE iniparser-static )
131141 endblock()
132142else ()
133- # find_package looks for already-installed system packages.
134- # Configure with `-DCMAKE_PREFIX_PATH="/path/to/package1;/path/to/package2"`
135- # to add search paths.
136- find_package (SDL3 CONFIG REQUIRED)
143+ if (ISLE_MORTAR_SDL3)
144+ # find_package looks for already-installed system packages.
145+ # Configure with `-DCMAKE_PREFIX_PATH="/path/to/package1;/path/to/package2"`
146+ # to add search paths.
147+ find_package (SDL3 CONFIG REQUIRED)
148+ endif ()
137149
138150 find_package (iniparser REQUIRED CONFIG)
139151 if (TARGET iniparser-shared)
@@ -213,8 +225,7 @@ target_include_directories(lego1 PUBLIC "$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/L
213225target_include_directories (lego1 PUBLIC "$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR} /LEGO1/lego/sources>" )
214226target_include_directories (lego1 PUBLIC "$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR} /LEGO1/lego/legoomni/include>" )
215227target_include_directories (lego1 PUBLIC "$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR} /LEGO1/lego/legoomni/include/actions>" )
216- target_link_libraries (lego1 PRIVATE SDL3::SDL3)
217- target_link_libraries (lego1 PUBLIC SDL3::Headers)
228+ target_link_libraries (lego1 PUBLIC mortar::headers)
218229target_link_libraries (lego1 PRIVATE $<$<BOOL :${ISLE_USE_DX5} >:DirectX5::DirectX5>)
219230# Allow unconditional include of miniwin/miniwind3d.h
220231target_link_libraries (lego1 PRIVATE miniwin-headers)
@@ -563,8 +574,8 @@ if (ISLE_BUILD_APP)
563574 # Use internal DirectX 5 if required
564575 target_link_libraries (isle PRIVATE $<$<BOOL :${ISLE_USE_DX5} >:DirectX5::DirectX5>)
565576
566- # Link SDL and iniparser
567- target_link_libraries (isle PRIVATE SDL3::SDL3 Isle::iniparser)
577+ # Link mortar and iniparser
578+ target_link_libraries (isle PRIVATE Isle::iniparser)
568579
569580 # Allow unconditional include of miniwin/miniwindevice.h
570581 target_link_libraries (isle PRIVATE miniwin-headers)
@@ -671,6 +682,7 @@ if (ISLE_BUILD_CONFIG)
671682 CONFIG/qt/res/config.qrc
672683 )
673684 target_link_libraries (isle-config PRIVATE Qt6::Core Qt6::Widgets)
685+ target_link_libraries (isle-config PRIVATE mortar::headers mortar::embed)
674686 set_property (TARGET isle-config PROPERTY AUTOMOC ON )
675687 set_property (TARGET isle-config PROPERTY AUTORCC ON )
676688 set_property (TARGET isle-config PROPERTY AUTOUIC ON )
@@ -683,7 +695,7 @@ if (ISLE_BUILD_CONFIG)
683695 target_link_libraries (isle-config PRIVATE DirectX5::DirectX5)
684696 endif ()
685697 target_compile_definitions (isle-config PRIVATE DIRECT3D_VERSION=0x500)
686- target_link_libraries (isle-config PRIVATE SDL3::SDL3 Isle::iniparser)
698+ target_link_libraries (isle-config PRIVATE Isle::iniparser)
687699 if (NOT ISLE_MINIWIN)
688700 target_link_libraries (isle-config PRIVATE ddraw dxguid)
689701 endif ()
@@ -721,6 +733,89 @@ if (ISLE_MINIWIN)
721733 set_property (TARGET ${isle_targets} APPEND PROPERTY LINK_LIBRARIES "miniwin" )
722734endif ()
723735
736+ add_library (mortar_headers INTERFACE )
737+ add_library (mortar::headers ALIAS mortar_headers)
738+ target_compile_definitions (mortar_headers INTERFACE $<$<BOOL :${BUILD_SHARED_LIBS} >:MORTAR_DLL>)
739+ target_include_directories (mortar_headers INTERFACE "$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR} /mortar/include>" )
740+
741+ # Link with mortar::declare_embedded to declare mortar is embedded alongside it
742+ add_library (mortar_declare_embedded INTERFACE )
743+ add_library (mortar::declare_embedded ALIAS mortar_declare_embedded)
744+ target_sources (mortar_declare_embedded INTERFACE $<TARGET_OBJECTS:mortar>)
745+ target_compile_definitions (mortar_declare_embedded INTERFACE BUILDING_MORTAR)
746+
747+ # Link with mortar::embed to embed mortar inside of it
748+ add_library (mortar_embed INTERFACE )
749+ add_library (mortar::embed ALIAS mortar_embed)
750+ target_sources (mortar_embed INTERFACE $<TARGET_OBJECTS:mortar>)
751+ target_link_libraries (mortar_embed INTERFACE mortar::declare_embedded)
752+
753+ add_library (mortar STATIC
754+ mortar/include /mortar/mortar.h
755+ mortar/src/mortar.cpp
756+ )
757+ target_compile_definitions (mortar PRIVATE BUILDING_MORTAR)
758+ target_link_libraries (mortar PUBLIC mortar::headers)
759+ set_property (TARGET mortar PROPERTY C_VISIBILITY_PRESET "hidden" )
760+ set_property (TARGET mortar PROPERTY CXX_VISIBILITY_PRESET "hidden" )
761+ list (APPEND isle_targets mortar)
762+
763+ if (ISLE_MORTAR_SDL3)
764+ set (MORTAR_SDL3_SOURCES
765+ mortar/src/sdl3/sdl3_audio.cpp
766+ mortar/src/sdl3/sdl3_cpuinfo.cpp
767+ mortar/src/sdl3/sdl3_error.cpp
768+ mortar/src/sdl3/sdl3_events.cpp
769+ mortar/src/sdl3/sdl3_filesystem.cpp
770+ mortar/src/sdl3/sdl3_gamepad.cpp
771+ mortar/src/sdl3/sdl3_haptic.cpp
772+ mortar/src/sdl3/sdl3_init.cpp
773+ mortar/src/sdl3/sdl3_iostream.cpp
774+ mortar/src/sdl3/sdl3_joystick.cpp
775+ mortar/src/sdl3/sdl3_keyboard.cpp
776+ mortar/src/sdl3/sdl3_keycode.cpp
777+ mortar/src/sdl3/sdl3_log.cpp
778+ mortar/src/sdl3/sdl3_main.cpp
779+ mortar/src/sdl3/sdl3_messagebox.cpp
780+ mortar/src/sdl3/sdl3_mouse.cpp
781+ mortar/src/sdl3/sdl3_mutex.cpp
782+ mortar/src/sdl3/sdl3_pixels.cpp
783+ mortar/src/sdl3/sdl3_process.cpp
784+ mortar/src/sdl3/sdl3_rect.cpp
785+ mortar/src/sdl3/sdl3_render.cpp
786+ mortar/src/sdl3/sdl3_stdinc.cpp
787+ mortar/src/sdl3/sdl3_surface.cpp
788+ mortar/src/sdl3/sdl3_system.cpp
789+ mortar/src/sdl3/sdl3_thread.cpp
790+ mortar/src/sdl3/sdl3_timer.cpp
791+ mortar/src/sdl3/sdl3_version.cpp
792+ mortar/src/sdl3/sdl3_video.cpp
793+ )
794+ target_sources (mortar PRIVATE ${MORTAR_SDL3_SOURCES} )
795+ get_property (sdl3_alias TARGET SDL3::SDL3 PROPERTY ALIASED_TARGET)
796+ add_dependencies (mortar "SDL3::SDL3" )
797+ set_property (SOURCE ${MORTAR_SDL3_SOURCES} APPEND PROPERTY INCLUDE_DIRECTORIES $<TARGET_PROPERTY:SDL3::Headers,INTERFACE_INCLUDE_DIRECTORIES >)
798+ if (ISLE_MORTAR_SDL3_DYNAMIC)
799+ target_compile_definitions (mortar_headers INTERFACE SDL3_DYNAMIC_LOAD)
800+ set_property (TARGET lego1 APPEND PROPERTY BUILD_RPATH "$<TARGET_FILE_DIR:SDL3::SDL3>" )
801+ if (TARGET isle)
802+ set_property (TARGET isle APPEND PROPERTY BUILD_RPATH "$<TARGET_FILE_DIR:SDL3::SDL3>" )
803+ endif ()
804+ if (TARGET isle-config)
805+ set_property (TARGET isle-config APPEND PROPERTY BUILD_RPATH "$<TARGET_FILE_DIR:SDL3::SDL3>" )
806+ endif ()
807+ else ()
808+ target_link_libraries (mortar PRIVATE SDL3::Headers)
809+ target_link_libraries (mortar_embed INTERFACE SDL3::SDL3)
810+ endif ()
811+ endif ()
812+ target_link_libraries (lego1 PRIVATE mortar_headers mortar::embed)
813+ if (NOT BUILD_SHARED_LIBS )
814+ if (TARGET isle)
815+ target_link_libraries (isle PRIVATE mortar::embed)
816+ endif ()
817+ endif ()
818+
724819if (MSVC )
725820 if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "15" )
726821 set_property (TARGET ${isle_targets} APPEND PROPERTY COMPILE_DEFINITIONS "_CRT_SECURE_NO_WARNINGS" )
0 commit comments