|
| 1 | +cmake_minimum_required(VERSION 3.20) |
| 2 | +project(openSAM LANGUAGES CXX C) |
| 3 | + |
| 4 | +set(CMAKE_CXX_STANDARD 23) |
| 5 | +set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| 6 | +set(CMAKE_CXX_EXTENSIONS OFF) |
| 7 | + |
| 8 | +# ============================================================================== |
| 9 | +# Configurable paths |
| 10 | +# ============================================================================== |
| 11 | +set(SDK "${CMAKE_CURRENT_SOURCE_DIR}/../SDK" CACHE PATH "X-Plane SDK root") |
| 12 | +set(XPLIB "${CMAKE_CURRENT_SOURCE_DIR}/../xplib" CACHE PATH "xplib root") |
| 13 | + |
| 14 | +# ============================================================================== |
| 15 | +# Version header generation (mirrors Makefile.common logic) |
| 16 | +# ============================================================================== |
| 17 | +find_package(Git) |
| 18 | +set(OPENSAM_COMMIT "unknown") |
| 19 | +set(XPLIB_COMMIT "unknown") |
| 20 | +if(GIT_FOUND) |
| 21 | + execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%h |
| 22 | + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} |
| 23 | + OUTPUT_VARIABLE OPENSAM_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) |
| 24 | + execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%h |
| 25 | + WORKING_DIRECTORY ${XPLIB} |
| 26 | + OUTPUT_VARIABLE XPLIB_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) |
| 27 | +endif() |
| 28 | +set(VERSION_SHORT "unknown") |
| 29 | +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/version.mak") |
| 30 | + file(READ "${CMAKE_CURRENT_SOURCE_DIR}/version.mak" _ver_mak) |
| 31 | + if(_ver_mak MATCHES "VERSION=([^\r\n]+)") |
| 32 | + set(VERSION_SHORT "${CMAKE_MATCH_1}") |
| 33 | + endif() |
| 34 | +endif() |
| 35 | +set(VERSION_L "${VERSION_SHORT} ${OPENSAM_COMMIT},xplib:${XPLIB_COMMIT}") |
| 36 | +set(_vh "${CMAKE_CURRENT_SOURCE_DIR}/version.h") |
| 37 | +set(_vh_content "// generated file!\n#define VERSION \"${VERSION_L}\"\n#define VERSION_SHORT \"${VERSION_SHORT}\"\n") |
| 38 | +if(EXISTS "${_vh}") |
| 39 | + file(READ "${_vh}" _vh_existing) |
| 40 | + if(NOT _vh_existing STREQUAL _vh_content) |
| 41 | + file(WRITE "${_vh}" "${_vh_content}") |
| 42 | + endif() |
| 43 | +else() |
| 44 | + file(WRITE "${_vh}" "${_vh_content}") |
| 45 | +endif() |
| 46 | + |
| 47 | +# ============================================================================== |
| 48 | +# Sources (Makefile.common: SOURCES + xplib files resolved from VPATH) |
| 49 | +# ============================================================================== |
| 50 | +set(SOURCES |
| 51 | + opensam.cpp adgs_ui.cpp autodgs_airport.cpp adgs_api.cpp seasons.cpp |
| 52 | + opensam_airport.cpp samjw.cpp jwctrl.cpp jwctrl_sound.cpp os_ui.cpp os_anim.cpp sam_xml.cpp read_wav.cpp |
| 53 | + plane.cpp myplane.cpp LTAPI.cpp mpadapter.cpp mpadapter_xpilot.cpp mpadapter_tgxp.cpp mpadapter_lt.cpp |
| 54 | + ${XPLIB}/log_msg.cpp ${XPLIB}/widget_ctx.cpp ${XPLIB}/simbrief.cpp |
| 55 | + dgs/apt_airport.cpp dgs/dgs.cpp dgs/dgs_plane.cpp dgs/airport.cpp dgs/marshaller.cpp |
| 56 | + dgs/safedock_t2_24.cpp dgs/safedock_x.cpp sam1_dgs.cpp |
| 57 | + XPListBox.cpp |
| 58 | +) |
| 59 | + |
| 60 | +add_library(openSAM MODULE ${SOURCES}) |
| 61 | +set_target_properties(openSAM PROPERTIES PREFIX "" SUFFIX ".xpl") |
| 62 | + |
| 63 | +# ============================================================================== |
| 64 | +# Common compile settings |
| 65 | +# ============================================================================== |
| 66 | +target_include_directories(openSAM PRIVATE |
| 67 | + ${CMAKE_CURRENT_SOURCE_DIR} |
| 68 | + ${CMAKE_CURRENT_SOURCE_DIR}/dgs |
| 69 | + ${XPLIB} |
| 70 | + ${SDK}/CHeaders/XPLM |
| 71 | + ${SDK}/CHeaders/Widgets |
| 72 | +) |
| 73 | + |
| 74 | +target_compile_definitions(openSAM PRIVATE |
| 75 | + XPLM200 XPLM210 XPLM300 XPLM301 XPLM400 |
| 76 | + DREF_PREFIX="opensam" |
| 77 | +) |
| 78 | + |
| 79 | +target_compile_options(openSAM PRIVATE -O3) |
| 80 | + |
| 81 | +# ============================================================================== |
| 82 | +# Platform specifics |
| 83 | +# ============================================================================== |
| 84 | +if(WIN32) |
| 85 | + # Makefile.mgw64 |
| 86 | + target_compile_definitions(openSAM PRIVATE WINDOWS WIN32 IBM=1) |
| 87 | + target_compile_options(openSAM PRIVATE |
| 88 | + -Wextra -Wall -fdiagnostics-color -Wno-format-overflow -Wno-format-truncation |
| 89 | + ) |
| 90 | + # -static causes multiple definition of std::type_info on MinGW when building |
| 91 | + # a shared module; --allow-multiple-definition resolves it (matches Makefile behavior) |
| 92 | + target_link_options(openSAM PRIVATE |
| 93 | + -static-libgcc -static -Wl,--allow-multiple-definition |
| 94 | + ) |
| 95 | + target_link_libraries(openSAM PRIVATE |
| 96 | + ${SDK}/Libraries/Win/XPLM_64.lib |
| 97 | + ${SDK}/Libraries/Win/XPWidgets_64.lib |
| 98 | + -l:libexpat.a |
| 99 | + pthread |
| 100 | + ) |
| 101 | + install(TARGETS openSAM DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/openSAM-pkg/openSAM/win_x64") |
| 102 | + |
| 103 | +elseif(APPLE) |
| 104 | + # Makefile.mac64 (native macOS or osxcross) |
| 105 | + set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE STRING "Universal binary") |
| 106 | + set(CMAKE_OSX_DEPLOYMENT_TARGET "13.0" CACHE STRING "macOS deployment target") |
| 107 | + |
| 108 | + target_compile_definitions(openSAM PRIVATE APL=1) |
| 109 | + target_compile_options(openSAM PRIVATE |
| 110 | + -Wall -fPIC -fno-stack-protector -fvisibility=hidden -ffast-math -Wno-deprecated-declarations |
| 111 | + ) |
| 112 | + target_link_options(openSAM PRIVATE |
| 113 | + -dynamiclib -rdynamic -fvisibility=hidden |
| 114 | + -Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/linkscript.mac |
| 115 | + ) |
| 116 | + find_library(XPLM_FW XPLM PATHS "${SDK}/Libraries/Mac" REQUIRED) |
| 117 | + find_library(XPWIDGETS_FW XPWidgets PATHS "${SDK}/Libraries/Mac" REQUIRED) |
| 118 | + # When cross-compiling via osxcross the toolchain file sets OSXCROSS_EXPAT_LIB |
| 119 | + if(DEFINED OSXCROSS_EXPAT_LIB AND EXISTS "${OSXCROSS_EXPAT_LIB}") |
| 120 | + set(_expat "${OSXCROSS_EXPAT_LIB}") |
| 121 | + else() |
| 122 | + set(_expat expat) # ships with macOS / Homebrew / MacPorts natively |
| 123 | + endif() |
| 124 | + target_link_libraries(openSAM PRIVATE ${XPLM_FW} ${XPWIDGETS_FW} ${_expat}) |
| 125 | + install(TARGETS openSAM DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/openSAM-pkg/openSAM/mac_x64") |
| 126 | + |
| 127 | +elseif(UNIX) |
| 128 | + # Makefile.lin64 |
| 129 | + target_compile_definitions(openSAM PRIVATE LIN=1) |
| 130 | + target_compile_options(openSAM PRIVATE |
| 131 | + -Wall -Wextra -Wno-format-overflow -Wno-format-truncation |
| 132 | + -fPIC -fno-stack-protector |
| 133 | + ) |
| 134 | + target_link_options(openSAM PRIVATE -rdynamic -nodefaultlibs) |
| 135 | + target_link_libraries(openSAM PRIVATE expat) |
| 136 | + install(TARGETS openSAM DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/openSAM-pkg/openSAM/lin_x64") |
| 137 | +endif() |
| 138 | + |
| 139 | +# ============================================================================== |
| 140 | +# sam_xml_test (all platforms, matching Makefile.mgw64 test target) |
| 141 | +# ============================================================================== |
| 142 | +option(BUILD_TESTS "Build sam_xml_test" ON) |
| 143 | +if(BUILD_TESTS) |
| 144 | + add_executable(sam_xml_test |
| 145 | + sam_xml_test.cpp |
| 146 | + sam_xml.cpp |
| 147 | + dgs/apt_airport.cpp |
| 148 | + ${XPLIB}/log_msg.cpp |
| 149 | + ) |
| 150 | + target_include_directories(sam_xml_test PRIVATE |
| 151 | + ${CMAKE_CURRENT_SOURCE_DIR} |
| 152 | + ${XPLIB} |
| 153 | + ${SDK}/CHeaders/XPLM |
| 154 | + ) |
| 155 | + target_compile_definitions(sam_xml_test PRIVATE |
| 156 | + XPLM200 XPLM210 XPLM300 XPLM301 |
| 157 | + LOCAL_DEBUGSTRING |
| 158 | + $<IF:$<BOOL:${WIN32}>,WINDOWS WIN32 IBM=1,> |
| 159 | + $<IF:$<BOOL:${APPLE}>,APL=1,> |
| 160 | + $<IF:$<AND:$<BOOL:${UNIX}>,$<NOT:$<BOOL:${APPLE}>>>,LIN=1,> |
| 161 | + ) |
| 162 | + target_compile_options(sam_xml_test PRIVATE -Wall -Wno-format-overflow) |
| 163 | + if(WIN32) |
| 164 | + target_link_libraries(sam_xml_test PRIVATE -l:libexpat.a) |
| 165 | + else() |
| 166 | + target_link_libraries(sam_xml_test PRIVATE expat) |
| 167 | + endif() |
| 168 | +endif() |
0 commit comments