dragonmoonlight/app/vpn/CMakeLists_vpn.cmake
Zac Gaetano 4a90ed82fb Add Qt resource file for WildDragon logo images
- app/assets/dragonmoonlight.qrc: registers wilddragon-icon.jpg and
  wilddragon-logo.jpg under the /app/assets prefix so they are
  accessible in QML as qrc:/app/assets/wilddragon-{icon,logo}.jpg

- CMakeLists_vpn.cmake: call qt5_add_resources or qt_add_resources
  (depending on Qt major version) to compile the .qrc into the binary
2026-05-07 02:39:30 +00:00

137 lines
4.9 KiB
CMake

# app/vpn/CMakeLists_vpn.cmake
#
# Include this file from the top-level moonlight-qt CMakeLists.txt:
#
# include(app/vpn/CMakeLists_vpn.cmake)
#
# Prerequisites (per platform):
# macOS : bash scripts/build-boringtun.sh --universal
# Windows: pwsh scripts/build-boringtun-win.ps1
# Linux : bash scripts/build-boringtun.sh
#
# The build scripts drop the static library at:
# macOS/Linux : deps/boringtun/libboringtun.a
# Windows : deps/boringtun/boringtun.lib
# ─── boringtun static library ─────────────────────────────────────────────────
if(WIN32)
set(BORINGTUN_LIB "${CMAKE_SOURCE_DIR}/deps/boringtun/boringtun.lib")
else()
set(BORINGTUN_LIB "${CMAKE_SOURCE_DIR}/deps/boringtun/libboringtun.a")
endif()
if(NOT EXISTS "${BORINGTUN_LIB}")
if(WIN32)
message(FATAL_ERROR
"boringtun static library not found at ${BORINGTUN_LIB}\n"
"Run: pwsh scripts/build-boringtun-win.ps1\n"
"then re-run CMake.")
else()
message(FATAL_ERROR
"boringtun static library not found at ${BORINGTUN_LIB}\n"
"Run: bash scripts/build-boringtun.sh --universal\n"
"then re-run CMake.")
endif()
endif()
add_library(boringtun STATIC IMPORTED)
set_target_properties(boringtun PROPERTIES
IMPORTED_LOCATION "${BORINGTUN_LIB}"
)
# ─── VPN source files ──────────────────────────────────────────────────────────
set(VPN_SOURCES
app/vpn/wireguardconfig.cpp
app/vpn/relayclient.cpp
app/vpn/dragonrelaybackend.cpp # QObject bridge: RelayClient + TunnelManager → QML
)
if(APPLE)
list(APPEND VPN_SOURCES app/vpn/tunnelmanager_mac.mm)
elseif(WIN32)
list(APPEND VPN_SOURCES app/vpn/tunnelmanager_win.cpp)
elseif(UNIX)
list(APPEND VPN_SOURCES app/vpn/tunnelmanager_linux.cpp) # future
endif()
# ─── Integration into moonlight-qt target ─────────────────────────────────────
# Replace moonlight-qt below with whatever your top-level CMakeLists calls the app target.
target_sources(moonlight-qt PRIVATE ${VPN_SOURCES})
target_include_directories(moonlight-qt PRIVATE
"${CMAKE_SOURCE_DIR}/app/vpn"
)
target_link_libraries(moonlight-qt PRIVATE boringtun)
if(APPLE)
# Frameworks required by boringtun + tunnel implementation on macOS
target_link_libraries(moonlight-qt PRIVATE
"-framework Security"
"-framework Network"
"-framework SystemConfiguration"
)
# Objective-C++ ARC needed for tunnelmanager_mac.mm
set_source_files_properties(
app/vpn/tunnelmanager_mac.mm
PROPERTIES COMPILE_FLAGS "-fobjc-arc"
)
elseif(WIN32)
# Windows system libraries required by Wintun + IP Helper API + Winsock
# iphlpapi — CreateUnicastIpAddressEntry, CreateIpForwardEntry2
# ws2_32 — socket, sendto, recvfrom, WSAEventSelect, …
# ntdll — required by boringtun's ring0 primitives
# ole32 — CoCreateGuid (adapter GUID)
target_link_libraries(moonlight-qt PRIVATE
iphlpapi
ws2_32
ntdll
ole32
)
# Embed the UAC manifest so Windows prompts for elevation at launch.
# Visual Studio picks this up automatically; for Ninja/MSBuild add
# a custom command that runs mt.exe post-link.
if(MSVC)
set_target_properties(moonlight-qt PROPERTIES
LINK_FLAGS "/MANIFEST:EMBED /MANIFESTINPUT:${CMAKE_SOURCE_DIR}/app/DragonMoonlight.manifest"
)
else()
# MinGW: link the manifest as a resource
configure_file(
"${CMAKE_SOURCE_DIR}/app/DragonMoonlight.manifest"
"${CMAKE_CURRENT_BINARY_DIR}/DragonMoonlight.manifest"
COPYONLY
)
target_sources(moonlight-qt PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}/DragonMoonlight.manifest"
)
endif()
endif()
# ─── Qt resources: logo images ────────────────────────────────────────────────
# Assets referenced in QML as qrc:/app/assets/wilddragon-{icon,logo}.jpg
# Both qt5_add_resources and qt_add_resources accept a .qrc file path directly.
set(DRAGON_QRC_FILE "${CMAKE_SOURCE_DIR}/app/assets/dragonmoonlight.qrc")
if(NOT QT_VERSION_MAJOR)
# Fallback if QT_VERSION_MAJOR isn't set yet — derive from Qt5/Qt6 find_package result
if(Qt6_FOUND)
set(QT_VERSION_MAJOR 6)
else()
set(QT_VERSION_MAJOR 5)
endif()
endif()
if(QT_VERSION_MAJOR EQUAL 6)
qt_add_resources(DRAGON_QRC_OBJS "${DRAGON_QRC_FILE}")
else()
qt5_add_resources(DRAGON_QRC_OBJS "${DRAGON_QRC_FILE}")
endif()
target_sources(moonlight-qt PRIVATE ${DRAGON_QRC_OBJS})