forked from JKSunny/Quake3e
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
2557 lines (2394 loc) · 92.7 KB
/
CMakeLists.txt
File metadata and controls
2557 lines (2394 loc) · 92.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
CMAKE_MINIMUM_REQUIRED(VERSION 3.24)
PROJECT(idtech3 VERSION 1.0.0 LANGUAGES C CXX)
# Android: optional persistent cache for Lua tarball + FetchContent (FreeType). CI sets -DANDROID_DEPS_CACHE=...
if(ANDROID)
set(ANDROID_DEPS_CACHE "" CACHE PATH
"If set, reuse this directory for Android third-party downloads (Lua ExternalProject, FetchContent). Speeds CI and clean rebuilds.")
if(ANDROID_DEPS_CACHE AND NOT ANDROID_DEPS_CACHE STREQUAL "")
file(MAKE_DIRECTORY "${ANDROID_DEPS_CACHE}")
set(FETCHCONTENT_BASE_DIR "${ANDROID_DEPS_CACHE}/fetchcontent" CACHE PATH "FetchContent base directory (Android deps cache)" FORCE)
message(STATUS "ANDROID_DEPS_CACHE: ${ANDROID_DEPS_CACHE}")
endif()
endif()
if(NOT ANDROID)
find_package(Threads REQUIRED)
endif()
if("c_std_23" IN_LIST CMAKE_C_COMPILE_FEATURES)
set(CMAKE_C_STANDARD 23)
else()
set(CMAKE_C_STANDARD 17)
if(MSVC)
message(WARNING "MSVC C23 mode is not available with this toolchain. Falling back to C17.")
else()
message(WARNING "C23 mode is not available with this toolchain. Falling back to C17.")
endif()
endif()
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
option(C_STANDARD_STRICT "Enable the stricter warning set for engine builds" ON)
option(CI_BUILD "Enable CI-specific behaviors such as warnings-as-errors" OFF)
option(USE_FLUX "Enable FLUX.2 image generation support" ON)
option(ENABLE_FORTIFY_SOURCE "Enable _FORTIFY_SOURCE=2 buffer overflow protection (GCC/Clang)" ON)
option(ENABLE_ASAN "Enable AddressSanitizer for memory error detection (Debug builds)" OFF)
option(ENABLE_LTO "Enable IPO/LTO for Release and RelWithDebInfo (GCC/Clang; longer links, smaller/faster binaries)" OFF)
option(BUILD_EXAMPLE_DEMO_GAME "Build examples/demo_game (idtech3_demo.pk3 + helper)" OFF)
if(C_STANDARD_STRICT)
if(MSVC)
add_compile_options(/W4)
else()
# Flags valid for both C and C++
set(C_CXX_STRICT_WARNINGS
-Wall
-Wextra
-Wpedantic
-Wshadow
-Wformat=2
-Wundef
-Wcast-qual
-Wpointer-arith
-Wvla
)
add_compile_options(${C_CXX_STRICT_WARNINGS})
# C-only flags (not valid for C++) - apply per-flag so generator expr expands
add_compile_options(
$<$<COMPILE_LANGUAGE:C>:-Wstrict-prototypes>
$<$<COMPILE_LANGUAGE:C>:-Wmissing-prototypes>
$<$<COMPILE_LANGUAGE:C>:-Wold-style-definition>
)
endif()
endif()
if(CI_BUILD)
if(MSVC)
# For MSVC, treat warnings as errors but allow unused functions
add_compile_options(/W4 /wd4100 /wd4505)
else()
# For GCC/Clang, disable problematic warnings for CI
add_compile_options(-Wno-unused-function -Wno-shadow -Wno-cast-qual -Wno-vla)
endif()
endif()
# Security: buffer overflow protection (GCC/Clang; not MSVC)
if(ENABLE_FORTIFY_SOURCE AND NOT MSVC)
add_compile_options(-D_FORTIFY_SOURCE=2)
message(STATUS "FORTIFY_SOURCE=2 enabled (buffer overflow protection)")
endif()
# Sanitizers: AddressSanitizer for memory error detection (Debug only)
if(ENABLE_ASAN AND CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT MSVC)
add_compile_options(-fsanitize=address -fno-omit-frame-pointer)
add_link_options(-fsanitize=address)
message(STATUS "AddressSanitizer enabled (memory error detection)")
endif()
# Optional link-time optimization (IPO/LTO): off by default; use for shipping builds on GCC/Clang.
if(ENABLE_LTO)
if(MSVC)
message(WARNING "ENABLE_LTO: not wired for MSVC in this option; ignoring.")
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "ENABLE_LTO ignored (Debug build)")
else()
include(CheckIPOSupported)
check_ipo_supported(RESULT _ipo_ok OUTPUT _ipo_err)
if(_ipo_ok)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
message(STATUS "IPO/LTO enabled (CMAKE_INTERPROCEDURAL_OPTIMIZATION=ON)")
else()
message(WARNING "ENABLE_LTO requested but not supported by this toolchain: ${_ipo_err}")
endif()
endif()
endif()
# --- Begin FindSDL2.cmake
# -------------------------------------------------------------
# Adapted FindSDL2.cmake module for CMake
#
# (Full CMake FindSDL2.cmake functionality inlined here for build portability)
# This logic will try to locate an SDL2 installation, define imported targets,
# and provide variables similar to the canonical FindSDL2.cmake
#
# Minimal compatibility implementation follows:
# -------------------------------------------------------------
#
# Variables defined:
# SDL2_FOUND
# SDL2_INCLUDE_DIR
# SDL2_INCLUDE_DIRS
# SDL2_LIBRARY
# SDL2_LIBRARIES
# Targets defined (if found):
# SDL2::Core
# SDL2::SDL2
# SDL2::Main
#
# Usage (as in this CMakeLists.txt):
# find_package(SDL2 REQUIRED)
# target_link_libraries(foo SDL2::Main)
#
# Only for local inline usage -- not a full drop-in for all SDL2 find modules.
#
# -------------------------------------------------------------
set(_SDL2_HINT_PATHS
$ENV{SDL2_DIR}
$ENV{SDL2_PATH}
${CMAKE_PREFIX_PATH}
${CMAKE_INSTALL_PREFIX}
/usr/local
/usr
/opt/local
/opt
/sw
)
find_path(SDL2_INCLUDE_DIR
NAMES SDL.h SDL2/SDL.h
PATH_SUFFIXES SDL2 include
PATHS ${_SDL2_HINT_PATHS}
)
# Try SDL2::SDL2 (split main and core lib), or fallback to sdl2 for older systems
set(_SDL2_LIB_NAMES SDL2 SDL2-2.0 SDL2d)
find_library(SDL2_LIBRARY
NAMES ${_SDL2_LIB_NAMES}
PATH_SUFFIXES lib64 lib
PATHS ${_SDL2_HINT_PATHS}
)
# Common main helper (may not be present)
find_library(SDL2_MAIN_LIBRARY
NAMES SDL2main
PATH_SUFFIXES lib64 lib
PATHS ${_SDL2_HINT_PATHS}
)
if(SDL2_INCLUDE_DIR AND SDL2_LIBRARY)
set(SDL2_FOUND TRUE)
set(SDL2_INCLUDE_DIRS ${SDL2_INCLUDE_DIR})
if(SDL2_MAIN_LIBRARY)
set(SDL2_LIBRARIES ${SDL2_LIBRARY} ${SDL2_MAIN_LIBRARY})
else()
set(SDL2_LIBRARIES ${SDL2_LIBRARY})
endif()
if(NOT TARGET SDL2::Core)
add_library(SDL2::Core UNKNOWN IMPORTED)
set_target_properties(SDL2::Core PROPERTIES
IMPORTED_LOCATION "${SDL2_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}")
endif()
if(NOT TARGET SDL2::SDL2)
add_library(SDL2::SDL2 ALIAS SDL2::Core)
endif()
if(SDL2_MAIN_LIBRARY AND NOT TARGET SDL2::Main)
add_library(SDL2::Main UNKNOWN IMPORTED)
set_target_properties(SDL2::Main PROPERTIES
IMPORTED_LOCATION "${SDL2_MAIN_LIBRARY}"
INTERFACE_LINK_LIBRARIES SDL2::Core
)
elseif(NOT TARGET SDL2::Main)
add_library(SDL2::Main INTERFACE IMPORTED)
set_property(TARGET SDL2::Main PROPERTY INTERFACE_LINK_LIBRARIES SDL2::Core)
endif()
else()
set(SDL2_FOUND FALSE)
endif()
# --- End FindSDL2.cmake
# --- Begin FindOpenAL.cmake
find_path(OPENAL_INCLUDE_DIR
NAMES AL/al.h OpenAL/al.h
PATH_SUFFIXES include
PATHS ${CMAKE_PREFIX_PATH} /usr/local /usr /opt/local /opt /opt/homebrew
)
find_library(OPENAL_LIBRARY
NAMES openal OpenAL32
PATH_SUFFIXES lib64 lib
PATHS ${CMAKE_PREFIX_PATH} /usr/local /usr /opt/local /opt /opt/homebrew
)
if(OPENAL_INCLUDE_DIR AND OPENAL_LIBRARY)
set(OPENAL_FOUND TRUE)
if(NOT TARGET OpenAL::OpenAL)
add_library(OpenAL::OpenAL UNKNOWN IMPORTED)
set_target_properties(OpenAL::OpenAL PROPERTIES
IMPORTED_LOCATION "${OPENAL_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${OPENAL_INCLUDE_DIR}")
endif()
else()
set(OPENAL_FOUND FALSE)
endif()
# --- End FindOpenAL.cmake
if(NOT DEFINED USE_OPUS)
option(USE_OPUS "Enable Opus codec support" ON)
endif()
if(NOT DEFINED USE_FLAC)
option(USE_FLAC "Enable FLAC codec support" ON)
endif()
if(NOT DEFINED USE_WEBM)
option(USE_WEBM "Enable WebM audio support" ON)
endif()
if(NOT DEFINED USE_LUA)
option(USE_LUA "Enable Lua scripting support" ON)
endif()
if(NOT DEFINED USE_DUKTAPE)
option(USE_DUKTAPE "Enable Duktape JavaScript scripting support" ON)
endif()
if(NOT DEFINED USE_SYSTEM_DUKTAPE)
option(USE_SYSTEM_DUKTAPE "Use system-installed Duktape instead of vendored internal copy" OFF)
endif()
set(LUA_FOUND FALSE)
set(LUA_LINK_LIBRARIES "")
set(LUA_VERSION_NUM 0)
set(LUA_VERSION_STRING "")
set(LUA_EXTRA_LIBRARIES "")
set(DUKTAPE_FOUND FALSE)
set(DUKTAPE_LINK_LIBRARIES "")
set(DUKTAPE_EXTRA_LIBRARIES "")
if(USE_LUA)
if(NOT ANDROID)
set(_LUA_HINT_PATHS
$ENV{LUA_DIR}
$ENV{LUA_PATH}
${CMAKE_PREFIX_PATH}
${CMAKE_INSTALL_PREFIX}
/usr/local
/usr
/opt/local
/opt
/opt/homebrew
/sw
)
if(WIN32)
list(APPEND _LUA_HINT_PATHS
"C:/msys64/mingw64"
"C:/msys64/ucrt64"
"C:/msys64/mingw32"
"C:/msys64/usr"
"C:/Lua"
"C:/Program Files/Lua"
"C:/Program Files (x86)/Lua"
)
endif()
find_path(LUA_INCLUDE_DIR
NAMES lua.h
PATH_SUFFIXES
include
include/lua
include/lua5.5
include/lua-5.5
include/lua5.4
include/lua-5.4
include/lua5.3
include/lua-5.3
include/lua5.2
include/lua-5.2
include/lua5.1
include/lua-5.1
PATHS ${_LUA_HINT_PATHS}
)
set(_LUA_HEADER_PATH "")
if(LUA_INCLUDE_DIR AND EXISTS "${LUA_INCLUDE_DIR}/lua.h")
set(_LUA_HEADER_PATH "${LUA_INCLUDE_DIR}/lua.h")
endif()
if(_LUA_HEADER_PATH)
file(STRINGS "${_LUA_HEADER_PATH}" LUA_VERSION_MAJOR_LINE REGEX "^#define[ \t]+LUA_VERSION_MAJOR_N[ \t]+[0-9]+" LIMIT_COUNT 1)
file(STRINGS "${_LUA_HEADER_PATH}" LUA_VERSION_MINOR_LINE REGEX "^#define[ \t]+LUA_VERSION_MINOR_N[ \t]+[0-9]+" LIMIT_COUNT 1)
if(LUA_VERSION_MAJOR_LINE AND LUA_VERSION_MINOR_LINE)
string(REGEX REPLACE ".*LUA_VERSION_MAJOR_N[ \t]+([0-9]+).*" "\\1" LUA_VERSION_MAJOR "${LUA_VERSION_MAJOR_LINE}")
string(REGEX REPLACE ".*LUA_VERSION_MINOR_N[ \t]+([0-9]+).*" "\\1" LUA_VERSION_MINOR "${LUA_VERSION_MINOR_LINE}")
math(EXPR LUA_VERSION_NUM "${LUA_VERSION_MAJOR} * 100 + ${LUA_VERSION_MINOR}")
set(LUA_VERSION_STRING "${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
else()
file(STRINGS "${_LUA_HEADER_PATH}" LUA_VERSION_NUM_LINE REGEX "^#define[ \t]+LUA_VERSION_NUM[ \t]+[0-9]+" LIMIT_COUNT 1)
if(LUA_VERSION_NUM_LINE)
string(REGEX REPLACE ".*LUA_VERSION_NUM[ \t]+([0-9]+).*" "\\1" LUA_VERSION_NUM "${LUA_VERSION_NUM_LINE}")
math(EXPR LUA_VERSION_MAJOR "${LUA_VERSION_NUM} / 100")
math(EXPR LUA_VERSION_MINOR "${LUA_VERSION_NUM} % 100")
set(LUA_VERSION_STRING "${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
endif()
endif()
endif()
set(_LUA_LIB_NAMES lua5.5 lua-5.5 lua55 lua5.4 lua-5.4 lua54 lua5.3 lua-5.3 lua53 lua5.2 lua-5.2 lua52 lua5.1 lua-5.1 lua51 lua)
if(LUA_VERSION_STRING)
set(_LUA_LIB_NAMES lua${LUA_VERSION_STRING} lua-${LUA_VERSION_STRING} lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR} ${_LUA_LIB_NAMES})
list(REMOVE_DUPLICATES _LUA_LIB_NAMES)
endif()
set(_LUA_LIB_HINTS "")
if(LUA_INCLUDE_DIR)
get_filename_component(_LUA_INCLUDE_PARENT "${LUA_INCLUDE_DIR}" DIRECTORY)
list(APPEND _LUA_LIB_HINTS
"${LUA_INCLUDE_DIR}/../lib"
"${LUA_INCLUDE_DIR}/../lib64"
"${_LUA_INCLUDE_PARENT}/lib"
"${_LUA_INCLUDE_PARENT}/lib64"
)
list(REMOVE_DUPLICATES _LUA_LIB_HINTS)
endif()
if(_LUA_LIB_HINTS)
find_library(LUA_LIBRARY
NAMES ${_LUA_LIB_NAMES}
HINTS ${_LUA_LIB_HINTS}
PATH_SUFFIXES "" lib lib64
NO_DEFAULT_PATH
)
endif()
if(NOT LUA_LIBRARY)
find_library(LUA_LIBRARY
NAMES ${_LUA_LIB_NAMES}
PATH_SUFFIXES lib64 lib
PATHS ${_LUA_HINT_PATHS}
)
endif()
if((NOT LUA_INCLUDE_DIR OR NOT LUA_LIBRARY) AND NOT WIN32)
find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
set(_LUA_PKG_NAMES ${_LUA_LIB_NAMES})
list(REMOVE_DUPLICATES _LUA_PKG_NAMES)
if(_LUA_PKG_NAMES)
set(_LUA_PKG_DETECTED FALSE)
foreach(_LUA_PKG_NAME ${_LUA_PKG_NAMES})
pkg_search_module(LUA_PKG QUIET ${_LUA_PKG_NAME})
if(LUA_PKG_FOUND)
set(_LUA_PKG_DETECTED TRUE)
break()
endif()
endforeach()
if(_LUA_PKG_DETECTED)
if(NOT LUA_INCLUDE_DIR AND LUA_PKG_INCLUDE_DIRS)
list(GET LUA_PKG_INCLUDE_DIRS 0 LUA_INCLUDE_DIR)
endif()
if(NOT LUA_LIBRARY)
if(LUA_PKG_LIBRARIES)
list(GET LUA_PKG_LIBRARIES 0 LUA_LIBRARY)
list(REMOVE_AT LUA_PKG_LIBRARIES 0)
set(LUA_EXTRA_LIBRARIES ${LUA_PKG_LIBRARIES})
elseif(LUA_PKG_LINK_LIBRARIES)
list(GET LUA_PKG_LINK_LIBRARIES 0 LUA_LIBRARY)
list(REMOVE_AT LUA_PKG_LINK_LIBRARIES 0)
set(LUA_EXTRA_LIBRARIES ${LUA_PKG_LINK_LIBRARIES})
endif()
endif()
endif()
endif()
endif()
endif()
if(NOT LUA_INCLUDE_DIR OR NOT LUA_LIBRARY)
message(WARNING "Lua headers/library not found; Lua scripting support will be disabled.")
else()
set(LUA_FOUND TRUE)
if(LUA_VERSION_NUM GREATER 0 AND LUA_VERSION_NUM LESS 501)
message(FATAL_ERROR "Lua 5.1+ is required.")
endif()
if(LUA_VERSION_STRING)
message(STATUS "Lua support enabled: ${LUA_VERSION_STRING} (${LUA_LIBRARY})")
else()
message(STATUS "Lua support enabled: ${LUA_LIBRARY}")
endif()
list(APPEND LUA_LINK_LIBRARIES ${LUA_LIBRARY})
if(LUA_EXTRA_LIBRARIES)
list(APPEND LUA_LINK_LIBRARIES ${LUA_EXTRA_LIBRARIES})
endif()
endif()
endif()
endif()
# Android NDK: build static Lua from upstream source (no system pkg-config)
set(LUA_ANDROID_BUILT FALSE)
if(ANDROID AND USE_LUA AND NOT LUA_FOUND)
include(ExternalProject)
# Lua upstream ships a GNU Makefile; CMAKE_MAKE_PROGRAM is often Ninja on Android - use make.
find_program(LUA_ANDROID_MAKE_EXE NAMES make gmake)
if(NOT LUA_ANDROID_MAKE_EXE)
message(FATAL_ERROR "GNU make (make) is required to build Lua for Android but was not found in PATH.")
endif()
set(_LUA_ANDROID_VER "5.4.7")
set(_LUA_ANDROID_SHA "9fbf5e28ef86c69858f6d3d34eccc32e911c1a28b4120ff3e84aaa70cfbf1e30")
# One prefix per ABI - Gradle builds arm64 and armeabi-v7a in the same CMake binary dir; a shared
# "lua-android/" would leave the wrong-arch liblua.a from whichever ABI configured first.
set(_LUA_ANDROID_PREFIX "${CMAKE_BINARY_DIR}/lua-android-${ANDROID_ABI}")
set(_LUA_EP_EXTRA "")
if(ANDROID_DEPS_CACHE AND NOT ANDROID_DEPS_CACHE STREQUAL "")
set(_LUA_DL_DIR "${ANDROID_DEPS_CACHE}/externalproject-downloads")
file(MAKE_DIRECTORY "${_LUA_DL_DIR}")
list(APPEND _LUA_EP_EXTRA DOWNLOAD_DIR "${_LUA_DL_DIR}")
endif()
# Lua src/Makefile sets "AR= ar rcu" and invokes $(AR) target objs - AR must be "llvm-ar rcu", not bare llvm-ar.
# ANDROID may set CMAKE_C_COMPILER to bare NDK clang (no --target); without it, objects are host x86_64.
if(DEFINED ANDROID_PLATFORM_LEVEL AND NOT ANDROID_PLATFORM_LEVEL STREQUAL "")
set(_LUA_API "${ANDROID_PLATFORM_LEVEL}")
elseif(ANDROID_PLATFORM MATCHES "android-([0-9]+)")
set(_LUA_API "${CMAKE_MATCH_1}")
else()
set(_LUA_API "26")
endif()
if(ANDROID_ABI STREQUAL "arm64-v8a")
set(_LUA_CLANG_TARGET "aarch64-none-linux-android${_LUA_API}")
elseif(ANDROID_ABI STREQUAL "armeabi-v7a")
set(_LUA_CLANG_TARGET "armv7-none-linux-androideabi${_LUA_API}")
elseif(ANDROID_ABI STREQUAL "x86")
set(_LUA_CLANG_TARGET "i686-none-linux-android${_LUA_API}")
elseif(ANDROID_ABI STREQUAL "x86_64")
set(_LUA_CLANG_TARGET "x86_64-none-linux-android${_LUA_API}")
else()
set(_LUA_CLANG_TARGET "aarch64-none-linux-android${_LUA_API}")
endif()
set(_LUA_CC_WRAPPER "${CMAKE_C_COMPILER} --target=${_LUA_CLANG_TARGET}")
if(CMAKE_SYSROOT)
string(APPEND _LUA_CC_WRAPPER " --sysroot=${CMAKE_SYSROOT}")
endif()
set(_LUA_MAKE_CC "CC=${_LUA_CC_WRAPPER}")
set(_LUA_MAKE_AR "AR=${CMAKE_AR} rcu")
set(_LUA_MAKE_RANLIB "RANLIB=${CMAKE_RANLIB}")
ExternalProject_Add(lua_android_ep
URL "https://www.lua.org/ftp/lua-${_LUA_ANDROID_VER}.tar.gz"
URL_HASH "SHA256=${_LUA_ANDROID_SHA}"
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
${_LUA_EP_EXTRA}
CONFIGURE_COMMAND ""
# Lua src/Makefile sets "CC= gcc" (not ?=); pass overrides on the make line (one argv each).
BUILD_COMMAND ${LUA_ANDROID_MAKE_EXE} -C <SOURCE_DIR>/src
${_LUA_MAKE_CC} ${_LUA_MAKE_AR} ${_LUA_MAKE_RANLIB} liblua.a MYCFLAGS=-fPIC
INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory "${_LUA_ANDROID_PREFIX}/lib" "${_LUA_ANDROID_PREFIX}/include"
COMMAND ${CMAKE_COMMAND} -E copy_if_different <SOURCE_DIR>/src/liblua.a "${_LUA_ANDROID_PREFIX}/lib/liblua.a"
COMMAND ${CMAKE_COMMAND} -E copy_if_different <SOURCE_DIR>/src/lua.h "${_LUA_ANDROID_PREFIX}/include/"
COMMAND ${CMAKE_COMMAND} -E copy_if_different <SOURCE_DIR>/src/luaconf.h "${_LUA_ANDROID_PREFIX}/include/"
COMMAND ${CMAKE_COMMAND} -E copy_if_different <SOURCE_DIR>/src/lauxlib.h "${_LUA_ANDROID_PREFIX}/include/"
COMMAND ${CMAKE_COMMAND} -E copy_if_different <SOURCE_DIR>/src/lualib.h "${_LUA_ANDROID_PREFIX}/include/"
BUILD_BYPRODUCTS "${_LUA_ANDROID_PREFIX}/lib/liblua.a"
)
set(LUA_FOUND TRUE)
set(LUA_INCLUDE_DIR "${_LUA_ANDROID_PREFIX}/include")
set(LUA_LIBRARY "${_LUA_ANDROID_PREFIX}/lib/liblua.a")
set(LUA_LINK_LIBRARIES "${LUA_LIBRARY}")
set(LUA_VERSION_STRING "${_LUA_ANDROID_VER}")
set(LUA_VERSION_NUM 504)
set(LUA_ANDROID_BUILT TRUE)
message(STATUS "Lua for Android: will build static ${_LUA_ANDROID_VER} via ExternalProject (first build downloads tarball)")
endif()
if(USE_DUKTAPE)
set(DUKTAPE_VENDORED_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/src/external/duktape/duktape.c")
set(DUKTAPE_VENDORED_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/external/duktape/duktape.h")
if((NOT USE_SYSTEM_DUKTAPE) AND EXISTS "${DUKTAPE_VENDORED_SOURCE}" AND EXISTS "${DUKTAPE_VENDORED_HEADER}")
add_library(js_runtime_internal STATIC ${DUKTAPE_VENDORED_SOURCE})
target_include_directories(js_runtime_internal PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src/external/duktape")
set_property(TARGET js_runtime_internal PROPERTY POSITION_INDEPENDENT_CODE ON)
if(NOT MSVC)
target_compile_options(js_runtime_internal PRIVATE -fno-strict-aliasing -Wno-format-nonliteral -Wno-unused-but-set-variable)
endif()
set(DUKTAPE_FOUND TRUE)
set(DUKTAPE_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/external/duktape")
list(APPEND DUKTAPE_LINK_LIBRARIES js_runtime_internal)
message(STATUS "Duktape support enabled: vendored internal static library")
else()
set(_DUKTAPE_HINT_PATHS
$ENV{DUKTAPE_DIR}
$ENV{DUKTAPE_PATH}
${CMAKE_PREFIX_PATH}
${CMAKE_INSTALL_PREFIX}
/usr/local
/usr
/opt/local
/opt
/opt/homebrew
/sw
)
if(WIN32)
list(APPEND _DUKTAPE_HINT_PATHS
"C:/msys64/mingw64"
"C:/msys64/ucrt64"
"C:/msys64/mingw32"
"C:/msys64/usr"
)
endif()
find_path(DUKTAPE_INCLUDE_DIR
NAMES duktape.h
PATH_SUFFIXES include
PATHS ${_DUKTAPE_HINT_PATHS}
)
find_library(DUKTAPE_LIBRARY
NAMES duktape
PATH_SUFFIXES lib64 lib
PATHS ${_DUKTAPE_HINT_PATHS}
)
if((NOT DUKTAPE_INCLUDE_DIR OR NOT DUKTAPE_LIBRARY) AND NOT WIN32)
find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
pkg_search_module(DUKTAPE_PKG QUIET duktape)
if(DUKTAPE_PKG_FOUND)
if(NOT DUKTAPE_INCLUDE_DIR AND DUKTAPE_PKG_INCLUDE_DIRS)
list(GET DUKTAPE_PKG_INCLUDE_DIRS 0 DUKTAPE_INCLUDE_DIR)
endif()
if(NOT DUKTAPE_LIBRARY)
if(DUKTAPE_PKG_LIBRARIES)
list(GET DUKTAPE_PKG_LIBRARIES 0 DUKTAPE_LIBRARY)
list(REMOVE_AT DUKTAPE_PKG_LIBRARIES 0)
set(DUKTAPE_EXTRA_LIBRARIES ${DUKTAPE_PKG_LIBRARIES})
elseif(DUKTAPE_PKG_LINK_LIBRARIES)
list(GET DUKTAPE_PKG_LINK_LIBRARIES 0 DUKTAPE_LIBRARY)
list(REMOVE_AT DUKTAPE_PKG_LINK_LIBRARIES 0)
set(DUKTAPE_EXTRA_LIBRARIES ${DUKTAPE_PKG_LINK_LIBRARIES})
endif()
endif()
endif()
endif()
endif()
if(NOT DUKTAPE_INCLUDE_DIR OR NOT DUKTAPE_LIBRARY)
if(USE_SYSTEM_DUKTAPE)
message(WARNING "System Duktape requested but headers/library not found; JavaScript scripting support will be disabled.")
else()
message(WARNING "Vendored Duktape not found and system headers/library not found; JavaScript scripting support will be disabled.")
endif()
else()
set(DUKTAPE_FOUND TRUE)
message(STATUS "Duktape support enabled: system library ${DUKTAPE_LIBRARY}")
list(APPEND DUKTAPE_LINK_LIBRARIES ${DUKTAPE_LIBRARY})
if(DUKTAPE_EXTRA_LIBRARIES)
list(APPEND DUKTAPE_LINK_LIBRARIES ${DUKTAPE_EXTRA_LIBRARIES})
endif()
endif()
endif()
endif()
set(OPUS_FOUND FALSE)
set(FLAC_FOUND FALSE)
set(WEBM_FOUND FALSE)
set(OPUS_INCLUDE_DIR "")
set(OPUSFILE_INCLUDE_DIR "")
set(OPUSFILE_LIBRARY "")
set(OGG_LIBRARY "")
set(OGG_INCLUDE_DIR "")
set(FLAC_INCLUDE_DIR "")
set(FLAC_LIBRARY "")
set(NESTEGG_INCLUDE_DIR "")
set(NESTEGG_LIBRARY "")
# Prefer vendored Ogg/Opus/Opusfile/FLAC/Nestegg when present.
if(USE_OPUS OR USE_FLAC OR USE_WEBM)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/ogg/src/bitwise.c")
if(NOT TARGET ogg)
add_library(ogg STATIC
src/external/src/ogg/src/bitwise.c
src/external/src/ogg/src/framing.c
)
target_include_directories(ogg PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/ogg/include)
target_compile_definitions(ogg PRIVATE INCLUDE_INTTYPES_H=1 INCLUDE_SYS_TYPES_H=1)
if(NOT MSVC)
target_compile_options(ogg PRIVATE -Wno-undef)
endif()
endif()
set(OGG_LIBRARY ogg)
set(OGG_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/ogg/include)
endif()
endif()
if(USE_OPUS)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/opus/CMakeLists.txt")
set(OPUS_BUILD_SHARED_LIBRARY OFF CACHE BOOL "" FORCE)
set(OPUS_BUILD_TESTING OFF CACHE BOOL "" FORCE)
set(OPUS_BUILD_PROGRAMS OFF CACHE BOOL "" FORCE)
set(OPUS_BUILD_FRAMEWORK OFF CACHE BOOL "" FORCE)
set(SKIP_INSTALL_ALL ON CACHE BOOL "" FORCE)
add_subdirectory(src/external/src/opus ${CMAKE_BINARY_DIR}/external/opus)
set(SKIP_INSTALL_ALL OFF CACHE BOOL "" FORCE)
set(OPUS_LIBRARY opus)
set(OPUS_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/opus/include)
if(TARGET opus)
target_compile_definitions(opus PRIVATE EMBEDDED_ARM=0)
if(NOT MSVC)
target_compile_options(opus PRIVATE
-Wno-vla
-Wno-cast-align
-Wno-undef
-Wno-cast-qual
-Wno-missing-prototypes
-Wno-sign-compare
)
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_compile_options(opus PRIVATE -Wno-stringop-overflow)
endif()
endif()
endif()
endif()
endif()
if(USE_OPUS)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/opusfile/src/opusfile.c")
if(NOT TARGET opusfile)
add_library(opusfile STATIC
src/external/src/opusfile/src/info.c
src/external/src/opusfile/src/internal.c
src/external/src/opusfile/src/opusfile.c
src/external/src/opusfile/src/stream.c
)
target_compile_definitions(opusfile PRIVATE OP_DISABLE_HTTP INCLUDE_INTTYPES_H=1 INCLUDE_SYS_TYPES_H=1)
target_include_directories(opusfile PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/opusfile/include
${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/opusfile
${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/ogg/include
${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/opus/include
)
if(NOT MSVC)
target_compile_options(opusfile PRIVATE
-Wno-undef
-Wno-cast-qual
)
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_compile_options(opusfile PRIVATE -Wno-maybe-uninitialized)
endif()
endif()
if(OGG_LIBRARY)
target_link_libraries(opusfile PRIVATE ${OGG_LIBRARY})
endif()
if(OPUS_LIBRARY)
target_link_libraries(opusfile PRIVATE ${OPUS_LIBRARY})
endif()
endif()
set(OPUSFILE_LIBRARY opusfile)
set(OPUSFILE_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/opusfile/include)
endif()
endif()
if(USE_FLAC)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/flac/CMakeLists.txt")
set(BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(BUILD_CXXLIBS OFF CACHE BOOL "" FORCE)
set(BUILD_PROGRAMS OFF CACHE BOOL "" FORCE)
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
set(WITH_OGG OFF CACHE BOOL "" FORCE)
set(INSTALL_MANPAGES OFF CACHE BOOL "" FORCE)
set(INSTALL_PKGCONFIG_MODULES OFF CACHE BOOL "" FORCE)
set(INSTALL_CMAKE_CONFIG_MODULE OFF CACHE BOOL "" FORCE)
set(SKIP_INSTALL_ALL ON CACHE BOOL "" FORCE)
add_subdirectory(src/external/src/flac ${CMAKE_BINARY_DIR}/external/flac)
set(SKIP_INSTALL_ALL OFF CACHE BOOL "" FORCE)
if(TARGET FLAC::FLAC)
set(FLAC_LIBRARY FLAC::FLAC)
elseif(TARGET FLAC)
set(FLAC_LIBRARY FLAC)
endif()
if(TARGET FLAC AND NOT MSVC)
target_compile_options(FLAC PRIVATE -Wno-cast-qual -Wno-format-nonliteral -Wno-static-in-inline -Wno-gnu-zero-variadic-macro-arguments)
endif()
if(TARGET grabbag AND NOT MSVC)
target_compile_options(grabbag PRIVATE -Wno-cast-qual -Wno-format-nonliteral)
endif()
if(TARGET getopt AND NOT MSVC)
target_compile_options(getopt PRIVATE -Wno-cast-qual -Wno-gnu-zero-variadic-macro-arguments)
endif()
set(FLAC_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/flac/include)
if(TARGET benchmark_residual)
set_property(TARGET benchmark_residual PROPERTY EXCLUDE_FROM_ALL TRUE)
if(NOT MSVC)
target_compile_options(benchmark_residual PRIVATE -Wno-vla -Wno-cast-qual)
endif()
endif()
if(TARGET utf8)
if(NOT MSVC)
target_compile_options(utf8 PRIVATE -Wno-pedantic -Wno-cast-qual)
endif()
endif()
endif()
endif()
if(USE_WEBM)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/nestegg/src/nestegg.c")
if(NOT TARGET nestegg)
add_library(nestegg STATIC
src/external/src/nestegg/src/nestegg.c
src/external/src/nestegg/halloc/src/halloc.c
)
target_include_directories(nestegg PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/nestegg
${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/nestegg/include
${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/nestegg/halloc
)
if(NOT MSVC)
target_compile_options(nestegg PRIVATE -Wno-unused-function)
endif()
endif()
set(NESTEGG_LIBRARY nestegg)
set(NESTEGG_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/nestegg/include)
endif()
endif()
#
if(USE_OPUS AND NOT OPUS_LIBRARY)
find_path(OPUSFILE_INCLUDE_DIR
NAMES opus/opusfile.h
PATH_SUFFIXES include
PATHS ${CMAKE_PREFIX_PATH} /usr/local /usr /opt/local /opt /opt/homebrew
)
find_library(OPUSFILE_LIBRARY
NAMES opusfile
PATH_SUFFIXES lib64 lib
PATHS ${CMAKE_PREFIX_PATH} /usr/local /usr /opt/local /opt /opt/homebrew
)
find_library(OPUS_LIBRARY
NAMES opus
PATH_SUFFIXES lib64 lib
PATHS ${CMAKE_PREFIX_PATH} /usr/local /usr /opt/local /opt /opt/homebrew
)
find_library(OGG_LIBRARY
NAMES ogg
PATH_SUFFIXES lib64 lib
PATHS ${CMAKE_PREFIX_PATH} /usr/local /usr /opt/local /opt /opt/homebrew
)
endif()
if(USE_OPUS AND OPUSFILE_INCLUDE_DIR AND OPUSFILE_LIBRARY AND OPUS_LIBRARY AND OGG_LIBRARY)
set(OPUS_FOUND TRUE)
endif()
if(USE_OPUS OR USE_WEBM)
find_path(OPUS_INCLUDE_DIR
NAMES opus/opus.h
PATH_SUFFIXES include
PATHS ${CMAKE_PREFIX_PATH} /usr/local /usr /opt/local /opt /opt/homebrew
)
if(NOT OPUS_INCLUDE_DIR AND OPUSFILE_INCLUDE_DIR)
set(OPUS_INCLUDE_DIR ${OPUSFILE_INCLUDE_DIR})
endif()
endif()
if(USE_FLAC AND NOT FLAC_LIBRARY)
find_path(FLAC_INCLUDE_DIR
NAMES FLAC/stream_decoder.h
PATH_SUFFIXES include
PATHS ${CMAKE_PREFIX_PATH} /usr/local /usr /opt/local /opt /opt/homebrew
)
find_library(FLAC_LIBRARY
NAMES FLAC flac
PATH_SUFFIXES lib64 lib
PATHS ${CMAKE_PREFIX_PATH} /usr/local /usr /opt/local /opt /opt/homebrew
)
endif()
if(USE_FLAC AND FLAC_INCLUDE_DIR AND FLAC_LIBRARY)
set(FLAC_FOUND TRUE)
endif()
if(USE_WEBM AND NOT NESTEGG_LIBRARY)
find_path(NESTEGG_INCLUDE_DIR
NAMES nestegg/nestegg.h
PATH_SUFFIXES include
PATHS ${EXTERNAL_SRC}/nestegg ${EXTERNAL_INCLUDE}
)
find_library(NESTEGG_LIBRARY
NAMES nestegg
PATH_SUFFIXES lib64 lib
PATHS ${EXTERNAL_SRC}/nestegg ${EXTERNAL_ROOT}
)
endif()
if(USE_WEBM AND NESTEGG_INCLUDE_DIR AND NESTEGG_LIBRARY AND USE_OPUS AND OPUS_LIBRARY AND OPUS_INCLUDE_DIR)
set(WEBM_FOUND TRUE)
endif()
# If vendored targets were created, mark codecs as found.
if(USE_OPUS AND TARGET opus AND TARGET opusfile AND TARGET ogg)
set(OPUS_LIBRARY opus)
set(OPUSFILE_LIBRARY opusfile)
set(OGG_LIBRARY ogg)
if(NOT OPUS_INCLUDE_DIR)
set(OPUS_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/opus/include)
endif()
if(NOT OPUSFILE_INCLUDE_DIR)
set(OPUSFILE_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/opusfile/include)
endif()
if(NOT OGG_INCLUDE_DIR)
set(OGG_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/ogg/include)
endif()
set(OPUS_FOUND TRUE)
endif()
if(USE_FLAC AND (TARGET FLAC::FLAC OR TARGET FLAC))
if(NOT FLAC_LIBRARY)
if(TARGET FLAC::FLAC)
set(FLAC_LIBRARY FLAC::FLAC)
else()
set(FLAC_LIBRARY FLAC)
endif()
endif()
if(NOT FLAC_INCLUDE_DIR)
set(FLAC_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/flac/include)
endif()
set(FLAC_FOUND TRUE)
endif()
if(USE_WEBM AND TARGET nestegg AND USE_OPUS AND OPUS_LIBRARY AND OPUS_INCLUDE_DIR)
if(NOT NESTEGG_LIBRARY)
set(NESTEGG_LIBRARY nestegg)
endif()
if(NOT NESTEGG_INCLUDE_DIR)
set(NESTEGG_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/external/src/nestegg/include)
endif()
set(WEBM_FOUND TRUE)
endif()
SET(CNAME "idtech3")
SET(DNAME "idtech3_server")
SET(RENDERER_PREFIX ${CNAME})
SET(RENDERER_DEFAULT vulkan) # valid options: opengl, vulkan
add_compile_definitions(RENDERER_PREFIX="${RENDERER_PREFIX}" RENDERER_DEFAULT="${RENDERER_DEFAULT}")
OPTION(USE_SDL "" ON)
OPTION(USE_OPENAL "Enable OpenAL audio backend" ON)
OPTION(USE_CURL "" ON)
OPTION(USE_LOCAL_HEADERS "" ON)
# libcurl (HTTP/HTTPS downloads). Linked into client when found.
set(CURL_FOUND FALSE)
set(CURL_LIBRARIES "")
set(CURL_INCLUDE_DIRS "")
if(USE_CURL)
if(ANDROID)
# Restrict search to the NDK sysroot only. NO_CMAKE_FIND_ROOT_PATH would search the
# host (e.g. /usr/include) and pull in glibc headers while compiling for Android.
find_path(CURL_INCLUDE_DIR
NAMES curl/curl.h
PATHS "${CMAKE_SYSROOT}/usr/include"
NO_DEFAULT_PATH)
if(CURL_INCLUDE_DIR)
set(_CURL_ABI_DIR "")
if(ANDROID_ABI STREQUAL "arm64-v8a")
set(_CURL_ABI_DIR "aarch64-linux-android")
elseif(ANDROID_ABI STREQUAL "armeabi-v7a")
set(_CURL_ABI_DIR "arm-linux-androideabi")
endif()
set(_CURL_LIB_HINTS "")
if(_CURL_ABI_DIR AND DEFINED ANDROID_PLATFORM_LEVEL)
list(APPEND _CURL_LIB_HINTS
"${CMAKE_SYSROOT}/usr/lib/${_CURL_ABI_DIR}/${ANDROID_PLATFORM_LEVEL}"
"${CMAKE_SYSROOT}/usr/lib/${_CURL_ABI_DIR}")
endif()
find_library(CURL_LIBRARY
NAMES curl libcurl
PATHS ${_CURL_LIB_HINTS}
NO_DEFAULT_PATH)
endif()
if(CURL_INCLUDE_DIR AND CURL_LIBRARY)
set(CURL_FOUND TRUE)
set(CURL_INCLUDE_DIRS "${CURL_INCLUDE_DIR}")
set(CURL_LIBRARIES "${CURL_LIBRARY}")
message(STATUS "libcurl (Android): ${CURL_LIBRARY}")
else()
message(WARNING "USE_CURL is ON but libcurl was not found under the NDK sysroot. Install NDK curl or disable USE_CURL.")
endif()
else()
find_package(CURL QUIET)
if(CURL_FOUND)
set(CURL_INCLUDE_DIRS ${CURL_INCLUDE_DIRS})
set(CURL_LIBRARIES ${CURL_LIBRARIES})
message(STATUS "libcurl: ${CURL_LIBRARIES}")
else()
message(WARNING "USE_CURL is ON but CMake could not find CURL. Install libcurl development packages or disable USE_CURL.")
endif()
endif()
endif()
OPTION(USE_VULKAN "" ON)
OPTION(USE_MP3 "Enable MP3 codec support" ON)
#
OPTION(USE_ZLIB "Enable zlib support (vendored)" ON)
OPTION(USE_LIBPNG "Enable libpng support (vendored)" ON)
OPTION(USE_GLM "Enable glm headers (vendored)" ON)
OPTION(USE_SYSTEM_JPEG "" OFF)
OPTION(USE_RENDERER_DLOPEN "" ON)
if(WIN32 AND USE_RENDERER_DLOPEN)
message(STATUS "Renderer dlopen disabled on Windows targets; switching to static renderer builds")
set(USE_RENDERER_DLOPEN OFF CACHE BOOL "" FORCE)
endif()
if(USE_RENDERER_DLOPEN)
add_compile_definitions(USE_RENDERER_DLOPEN=1)
else()
add_compile_definitions(USE_RENDERER_DLOPEN=0)
endif()
if(USE_SDL)
add_compile_definitions(USE_SDL=1)
else()
add_compile_definitions(USE_SDL=0)
endif()
OPTION(SKIP_IDPAK_CHECK "Skip checking for original Quake III pak files (pak0.pk3)" ON)
OPTION(BUILD_FREETYPE "Enable FreeType-powered font rendering / font generation" ON)
if(BUILD_FREETYPE)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadInterFonts.cmake)
endif()
OPTION(USE_DTLS "Enable DTLS encryption for game network traffic (OpenSSL)" ON)
OPTION(USE_STEAM "Enable Steam API (achievements, overlay, rich presence, Deck detection)" OFF)
OPTION(USE_STEAM_NETWORKING "Enable Steam Datagram Relay (SDR) transport" OFF)
OPTION(USE_VULKAN_RTX "Enable Vulkan ray tracing (VK_KHR_ray_tracing_*); requires RT-capable GPU" OFF)
OPTION(USE_METAL_RENDERER "Build native Metal renderer (Apple only)" OFF)
OPTION(USE_DXR_RENDERER "Build DirectX 12 + DXR renderer (Windows only)" OFF)
if(USE_METAL_RENDERER)
if(NOT APPLE)
message(WARNING "USE_METAL_RENDERER is Apple-only; disabling.")
set(USE_METAL_RENDERER OFF CACHE BOOL "" FORCE)
else()
message(WARNING "Metal renderer not yet implemented (docs/RENDERERS_FUTURE.md); option reserved for future use.")
endif()
endif()
if(USE_DXR_RENDERER)
if(NOT WIN32)
message(WARNING "USE_DXR_RENDERER is Windows-only; disabling.")
set(USE_DXR_RENDERER OFF CACHE BOOL "" FORCE)
else()
message(WARNING "DXR renderer not yet implemented (docs/RENDERERS_FUTURE.md); option reserved for future use.")
endif()
endif()
set(EXTERNAL_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/src/external")
set(EXTERNAL_SRC "${EXTERNAL_ROOT}/src")
set(EXTERNAL_INCLUDE "${EXTERNAL_ROOT}/include")
set(EXTERNAL_SDL_INCLUDE_DIR "${EXTERNAL_SRC}/sdl/include/SDL2")
set(EXTERNAL_CURL_WINDOWS_INCLUDE_DIR "${EXTERNAL_SRC}/curl/windows/include")
set(EXTERNAL_JPEG_SRC_DIR "${EXTERNAL_SRC}/jpeg")
set(EXTERNAL_ZLIB_SRC "${EXTERNAL_SRC}/zlib")
set(EXTERNAL_LIBPNG_SRC "${EXTERNAL_SRC}/libpng")
set(EXTERNAL_GLM_INCLUDE "${EXTERNAL_SRC}/glm")
if(UNIX AND NOT APPLE AND NOT ANDROID)
find_package(X11 REQUIRED)
if(TARGET X11::X11)
set(IDTECH3_X11_LIBS X11::X11)
else()
set(IDTECH3_X11_LIBS ${X11_LIBRARIES})
endif()
set(IDTECH3_X11_INCLUDE ${X11_INCLUDE_DIR})
else()
set(IDTECH3_X11_LIBS "")
set(IDTECH3_X11_INCLUDE "")
endif()
# Add cflux2 external library
if(USE_FLUX)
add_subdirectory(src/external/src/cflux2)
endif()
if(USE_ZLIB)
set(ZLIB_BUILD_SHARED OFF CACHE BOOL "" FORCE)
set(ZLIB_BUILD_STATIC ON CACHE BOOL "" FORCE)
set(ZLIB_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(SKIP_INSTALL_ALL ON CACHE BOOL "" FORCE)
if(EXISTS "${EXTERNAL_ZLIB_SRC}/CMakeLists.txt")