@@ -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,52 +84,54 @@ 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)
105- elseif (EMSCRIPTEN)
106- FetchContent_Declare(
107- SDL3
108- GIT_REPOSITORY "https://github.com/libsdl-org/SDL.git"
109- GIT_TAG "release-3.2.28"
110- UPDATE_DISCONNECTED TRUE
111- EXCLUDE_FROM_ALL
112- )
88+ if (ISLE_MORTAR_SDL3)
89+ if (ANDROID)
90+ # Built by Gradle
91+ find_package (SDL3 REQUIRED CONFIG COMPONENTS Shared)
11392 else ()
114- FetchContent_Declare(
115- SDL3
116- GIT_REPOSITORY "https://github.com/libsdl-org/SDL.git"
117- GIT_TAG "main"
118- UPDATE_DISCONNECTED TRUE
119- EXCLUDE_FROM_ALL
120- )
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+ elseif (EMSCRIPTEN)
114+ FetchContent_Declare(
115+ SDL3
116+ GIT_REPOSITORY "https://github.com/libsdl-org/SDL.git"
117+ GIT_TAG "release-3.2.28"
118+ UPDATE_DISCONNECTED TRUE
119+ EXCLUDE_FROM_ALL
120+ )
121+ else ()
122+ FetchContent_Declare(
123+ SDL3
124+ GIT_REPOSITORY "https://github.com/libsdl-org/SDL.git"
125+ GIT_TAG "main"
126+ UPDATE_DISCONNECTED TRUE
127+ EXCLUDE_FROM_ALL
128+ )
129+ endif ()
130+ FetchContent_MakeAvailable(SDL3)
121131 endif ()
122- FetchContent_MakeAvailable(SDL3)
123132 endif ()
124133
134+ message (STATUS "Fetching iniparser. This might take a while..." )
125135 FetchContent_Declare(
126136 iniparser
127137 GIT_REPOSITORY "https://gitlab.com/iniparser/iniparser.git"
@@ -136,10 +146,12 @@ if (DOWNLOAD_DEPENDENCIES)
136146 target_link_libraries (Isle::iniparser INTERFACE iniparser-static )
137147 endblock()
138148else ()
139- # find_package looks for already-installed system packages.
140- # Configure with `-DCMAKE_PREFIX_PATH="/path/to/package1;/path/to/package2"`
141- # to add search paths.
142- find_package (SDL3 CONFIG REQUIRED)
149+ if (ISLE_MORTAR_SDL3)
150+ # find_package looks for already-installed system packages.
151+ # Configure with `-DCMAKE_PREFIX_PATH="/path/to/package1;/path/to/package2"`
152+ # to add search paths.
153+ find_package (SDL3 CONFIG REQUIRED)
154+ endif ()
143155
144156 find_package (iniparser REQUIRED CONFIG)
145157 if (TARGET iniparser-shared)
@@ -219,8 +231,7 @@ target_include_directories(lego1 PUBLIC "$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/L
219231target_include_directories (lego1 PUBLIC "$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR} /LEGO1/lego/sources>" )
220232target_include_directories (lego1 PUBLIC "$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR} /LEGO1/lego/legoomni/include>" )
221233target_include_directories (lego1 PUBLIC "$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR} /LEGO1/lego/legoomni/include/actions>" )
222- target_link_libraries (lego1 PRIVATE SDL3::SDL3)
223- target_link_libraries (lego1 PUBLIC SDL3::Headers)
234+ target_link_libraries (lego1 PUBLIC mortar::headers)
224235target_link_libraries (lego1 PRIVATE $<$<BOOL :${ISLE_USE_DX5} >:DirectX5::DirectX5>)
225236# Allow unconditional include of miniwin/miniwind3d.h
226237target_link_libraries (lego1 PRIVATE miniwin-headers)
@@ -569,8 +580,8 @@ if (ISLE_BUILD_APP)
569580 # Use internal DirectX 5 if required
570581 target_link_libraries (isle PRIVATE $<$<BOOL :${ISLE_USE_DX5} >:DirectX5::DirectX5>)
571582
572- # Link SDL and iniparser
573- target_link_libraries (isle PRIVATE SDL3::SDL3 Isle::iniparser)
583+ # Link mortar and iniparser
584+ target_link_libraries (isle PRIVATE Isle::iniparser)
574585
575586 # Allow unconditional include of miniwin/miniwindevice.h
576587 target_link_libraries (isle PRIVATE miniwin-headers)
@@ -677,6 +688,7 @@ if (ISLE_BUILD_CONFIG)
677688 CONFIG/qt/res/config.qrc
678689 )
679690 target_link_libraries (isle-config PRIVATE Qt6::Core Qt6::Widgets)
691+ target_link_libraries (isle-config PRIVATE mortar::headers mortar::embed)
680692 set_property (TARGET isle-config PROPERTY AUTOMOC ON )
681693 set_property (TARGET isle-config PROPERTY AUTORCC ON )
682694 set_property (TARGET isle-config PROPERTY AUTOUIC ON )
@@ -689,7 +701,7 @@ if (ISLE_BUILD_CONFIG)
689701 target_link_libraries (isle-config PRIVATE DirectX5::DirectX5)
690702 endif ()
691703 target_compile_definitions (isle-config PRIVATE DIRECT3D_VERSION=0x500)
692- target_link_libraries (isle-config PRIVATE SDL3::SDL3 Isle::iniparser)
704+ target_link_libraries (isle-config PRIVATE Isle::iniparser)
693705 if (NOT ISLE_MINIWIN)
694706 target_link_libraries (isle-config PRIVATE ddraw dxguid)
695707 endif ()
@@ -727,6 +739,89 @@ if (ISLE_MINIWIN)
727739 set_property (TARGET ${isle_targets} APPEND PROPERTY LINK_LIBRARIES "miniwin" )
728740endif ()
729741
742+ add_library (mortar_headers INTERFACE )
743+ add_library (mortar::headers ALIAS mortar_headers)
744+ target_compile_definitions (mortar_headers INTERFACE $<$<BOOL :${BUILD_SHARED_LIBS} >:MORTAR_DLL>)
745+ target_include_directories (mortar_headers INTERFACE "$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR} /mortar/include>" )
746+
747+ # Link with mortar::declare_embedded to declare mortar is embedded alongside it
748+ add_library (mortar_declare_embedded INTERFACE )
749+ add_library (mortar::declare_embedded ALIAS mortar_declare_embedded)
750+ target_sources (mortar_declare_embedded INTERFACE $<TARGET_OBJECTS:mortar>)
751+ target_compile_definitions (mortar_declare_embedded INTERFACE BUILDING_MORTAR)
752+
753+ # Link with mortar::embed to embed mortar inside of it
754+ add_library (mortar_embed INTERFACE )
755+ add_library (mortar::embed ALIAS mortar_embed)
756+ target_sources (mortar_embed INTERFACE $<TARGET_OBJECTS:mortar>)
757+ target_link_libraries (mortar_embed INTERFACE mortar::declare_embedded)
758+
759+ add_library (mortar STATIC
760+ mortar/include /mortar/mortar.h
761+ mortar/src/mortar.cpp
762+ )
763+ target_compile_definitions (mortar PRIVATE BUILDING_MORTAR)
764+ target_link_libraries (mortar PUBLIC mortar::headers)
765+ set_property (TARGET mortar PROPERTY C_VISIBILITY_PRESET "hidden" )
766+ set_property (TARGET mortar PROPERTY CXX_VISIBILITY_PRESET "hidden" )
767+ list (APPEND isle_targets mortar)
768+
769+ if (ISLE_MORTAR_SDL3)
770+ set (MORTAR_SDL3_SOURCES
771+ mortar/src/sdl3/sdl3_audio.cpp
772+ mortar/src/sdl3/sdl3_cpuinfo.cpp
773+ mortar/src/sdl3/sdl3_error.cpp
774+ mortar/src/sdl3/sdl3_events.cpp
775+ mortar/src/sdl3/sdl3_filesystem.cpp
776+ mortar/src/sdl3/sdl3_gamepad.cpp
777+ mortar/src/sdl3/sdl3_haptic.cpp
778+ mortar/src/sdl3/sdl3_init.cpp
779+ mortar/src/sdl3/sdl3_iostream.cpp
780+ mortar/src/sdl3/sdl3_joystick.cpp
781+ mortar/src/sdl3/sdl3_keyboard.cpp
782+ mortar/src/sdl3/sdl3_keycode.cpp
783+ mortar/src/sdl3/sdl3_log.cpp
784+ mortar/src/sdl3/sdl3_main.cpp
785+ mortar/src/sdl3/sdl3_messagebox.cpp
786+ mortar/src/sdl3/sdl3_mouse.cpp
787+ mortar/src/sdl3/sdl3_mutex.cpp
788+ mortar/src/sdl3/sdl3_pixels.cpp
789+ mortar/src/sdl3/sdl3_process.cpp
790+ mortar/src/sdl3/sdl3_rect.cpp
791+ mortar/src/sdl3/sdl3_render.cpp
792+ mortar/src/sdl3/sdl3_stdinc.cpp
793+ mortar/src/sdl3/sdl3_surface.cpp
794+ mortar/src/sdl3/sdl3_system.cpp
795+ mortar/src/sdl3/sdl3_thread.cpp
796+ mortar/src/sdl3/sdl3_timer.cpp
797+ mortar/src/sdl3/sdl3_version.cpp
798+ mortar/src/sdl3/sdl3_video.cpp
799+ )
800+ target_sources (mortar PRIVATE ${MORTAR_SDL3_SOURCES} )
801+ get_property (sdl3_alias TARGET SDL3::SDL3 PROPERTY ALIASED_TARGET)
802+ add_dependencies (mortar "SDL3::SDL3" )
803+ set_property (SOURCE ${MORTAR_SDL3_SOURCES} APPEND PROPERTY INCLUDE_DIRECTORIES $<TARGET_PROPERTY:SDL3::Headers,INTERFACE_INCLUDE_DIRECTORIES >)
804+ if (ISLE_MORTAR_SDL3_DYNAMIC)
805+ target_compile_definitions (mortar_headers INTERFACE SDL3_DYNAMIC_LOAD)
806+ set_property (TARGET lego1 APPEND PROPERTY BUILD_RPATH "$<TARGET_FILE_DIR:SDL3::SDL3>" )
807+ if (TARGET isle)
808+ set_property (TARGET isle APPEND PROPERTY BUILD_RPATH "$<TARGET_FILE_DIR:SDL3::SDL3>" )
809+ endif ()
810+ if (TARGET isle-config)
811+ set_property (TARGET isle-config APPEND PROPERTY BUILD_RPATH "$<TARGET_FILE_DIR:SDL3::SDL3>" )
812+ endif ()
813+ else ()
814+ target_link_libraries (mortar PRIVATE SDL3::Headers)
815+ target_link_libraries (mortar_embed INTERFACE SDL3::SDL3)
816+ endif ()
817+ endif ()
818+ target_link_libraries (lego1 PRIVATE mortar_headers mortar::embed)
819+ if (NOT BUILD_SHARED_LIBS )
820+ if (TARGET isle)
821+ target_link_libraries (isle PRIVATE mortar::embed)
822+ endif ()
823+ endif ()
824+
730825if (MSVC )
731826 if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "15" )
732827 set_property (TARGET ${isle_targets} APPEND PROPERTY COMPILE_DEFINITIONS "_CRT_SECURE_NO_WARNINGS" )
0 commit comments