Skip to content

Commit 49291bb

Browse files
committed
create cmake environment
1 parent 7cdb532 commit 49291bb

2 files changed

Lines changed: 194 additions & 0 deletions

File tree

CMakeLists.txt

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
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()

cmake/toolchain-osxcross.cmake

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# CMake toolchain file for building macOS targets from Linux using osxcross.
2+
# Usage:
3+
# cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-osxcross.cmake \
4+
# -DCMAKE_BUILD_TYPE=Release ..
5+
6+
set(CMAKE_SYSTEM_NAME Darwin)
7+
set(CMAKE_SYSTEM_PROCESSOR "x86_64;arm64")
8+
9+
set(OSXCROSS_ROOT "/osxcross/target" CACHE PATH "osxcross target root")
10+
11+
# Use older SDK that osxcross understands (frameworks layout)
12+
set(SDK "${CMAKE_CURRENT_LIST_DIR}/../SDK-4.0.1" CACHE PATH "X-Plane SDK root")
13+
14+
set(CMAKE_C_COMPILER "${OSXCROSS_ROOT}/bin/o64-clang")
15+
set(CMAKE_CXX_COMPILER "${OSXCROSS_ROOT}/bin/o64-clang++")
16+
17+
# Universal binary via lipo is handled by the Makefile.
18+
# Under CMake/osxcross we build x86_64 only by default; set
19+
# CMAKE_OSX_ARCHITECTURES on the command line to override.
20+
set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "Target architecture")
21+
set(CMAKE_OSX_DEPLOYMENT_TARGET "13.0" CACHE STRING "macOS deployment target")
22+
23+
# Static expat shipped with macPorts inside osxcross
24+
set(OSXCROSS_EXPAT_LIB
25+
"${OSXCROSS_ROOT}/macports/pkgs/opt/local/lib/libexpat.a"
26+
CACHE FILEPATH "Path to static libexpat.a from osxcross macPorts")

0 commit comments

Comments
 (0)