Internal
Public Access
The app's icon only appeared at runtime (window/taskbar), set programmatically via QApplication::setWindowIcon(). Explorer showed the generic default icon for orbithub.exe itself, since that requires an icon baked into the PE file as a Windows resource at build time -- a completely separate mechanism. Added packaging/windows/orbithub.ico, rendered directly from the same createOrbitHubAppIcon() logic used at runtime (via a one-off export tool, not committed) so the file icon matches what the app actually looks like. A minimal .rc resource file embeds it, compiled in only for WIN32 builds. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
236 lines
8.6 KiB
CMake
236 lines
8.6 KiB
CMake
cmake_minimum_required(VERSION 3.21)
|
|
|
|
project(OrbitHub VERSION 0.1.0 LANGUAGES CXX)
|
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
|
|
set(CMAKE_AUTOMOC ON)
|
|
set(CMAKE_AUTOUIC ON)
|
|
set(CMAKE_AUTORCC ON)
|
|
|
|
include(GNUInstallDirs)
|
|
|
|
find_package(Qt6 6.2 REQUIRED COMPONENTS Widgets Sql)
|
|
|
|
qt_standard_project_setup()
|
|
|
|
add_subdirectory(third_party/KodoTerm)
|
|
|
|
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/third_party/FreeRDP/CMakeLists.txt")
|
|
message(FATAL_ERROR "Vendored FreeRDP source is missing at third_party/FreeRDP")
|
|
endif()
|
|
|
|
# Pin FreeRDP build to the vendored source tree so headers/libs are always from the same revision.
|
|
set(FREERDP_UNIFIED_BUILD ON CACHE BOOL "" FORCE)
|
|
set(WITH_MANPAGES OFF CACHE BOOL "" FORCE)
|
|
set(WITH_SAMPLE OFF CACHE BOOL "" FORCE)
|
|
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
|
|
set(BUILD_TESTING_INTERNAL OFF CACHE BOOL "" FORCE)
|
|
set(WITH_CLIENT_COMMON ON CACHE BOOL "" FORCE)
|
|
set(WITH_CLIENT OFF CACHE BOOL "" FORCE)
|
|
set(WITH_CLIENT_SDL OFF CACHE BOOL "" FORCE)
|
|
set(WITH_CLIENT_INTERFACE OFF CACHE BOOL "" FORCE)
|
|
set(WITH_SERVER OFF CACHE BOOL "" FORCE)
|
|
set(WITH_CHANNELS ON CACHE BOOL "" FORCE)
|
|
set(WITH_CLIENT_CHANNELS ON CACHE BOOL "" FORCE)
|
|
set(WITH_FUSE OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_DRDYNVC ON CACHE BOOL "" FORCE)
|
|
set(CHANNEL_DRDYNVC_CLIENT ON CACHE BOOL "" FORCE)
|
|
set(CHANNEL_DISP ON CACHE BOOL "" FORCE)
|
|
set(CHANNEL_DISP_CLIENT ON CACHE BOOL "" FORCE)
|
|
set(CHANNEL_AINPUT OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_AUDIN OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_CLIPRDR ON CACHE BOOL "" FORCE)
|
|
set(CHANNEL_CLIPRDR_CLIENT ON CACHE BOOL "" FORCE)
|
|
set(CHANNEL_DRIVE OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_ECHO OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_ENCOMSP OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_GEOMETRY OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_LOCATION OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_PARALLEL OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_PRINTER OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_RAIL OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_RDPDR OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_RDPEAR OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_RDPECAM OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_RDPEI OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_RDPEMSC OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_RDPGFX OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_RDPSND OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_REMDESK OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_SERIAL OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_SMARTCARD OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_SSHAGENT OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_TELEMETRY OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_URBDRC OFF CACHE BOOL "" FORCE)
|
|
set(CHANNEL_VIDEO OFF CACHE BOOL "" FORCE)
|
|
set(WITH_FFMPEG OFF CACHE BOOL "" FORCE)
|
|
set(WITH_DSP_FFMPEG OFF CACHE BOOL "" FORCE)
|
|
set(WITH_VIDEO_FFMPEG OFF CACHE BOOL "" FORCE)
|
|
set(WITH_CAIRO OFF CACHE BOOL "" FORCE)
|
|
set(WITH_SWSCALE OFF CACHE BOOL "" FORCE)
|
|
set(WITH_JPEG OFF CACHE BOOL "" FORCE)
|
|
set(WITH_KRB5 OFF CACHE BOOL "" FORCE)
|
|
set(WITH_UNICODE_BUILTIN ON CACHE BOOL "" FORCE)
|
|
set(WITH_WINPR_TOOLS OFF CACHE BOOL "" FORCE)
|
|
|
|
add_subdirectory(third_party/FreeRDP EXCLUDE_FROM_ALL)
|
|
|
|
set(ORBITHUB_SOURCES
|
|
src/about_dialog.cpp
|
|
src/about_dialog.h
|
|
src/app_icon.cpp
|
|
src/app_icon.h
|
|
src/main.cpp
|
|
src/profile_dialog.cpp
|
|
src/profile_dialog.h
|
|
src/profile_repository.cpp
|
|
src/profile_repository.h
|
|
src/profiles_tree_widget.cpp
|
|
src/profiles_tree_widget.h
|
|
src/profiles_window.cpp
|
|
src/profiles_window.h
|
|
src/session_backend.h
|
|
src/session_backend_factory.cpp
|
|
src/session_backend_factory.h
|
|
src/session_tab.cpp
|
|
src/session_tab.h
|
|
src/rdp_display_widget.cpp
|
|
src/rdp_display_widget.h
|
|
src/terminal_view.cpp
|
|
src/terminal_view.h
|
|
src/session_window.cpp
|
|
src/session_window.h
|
|
src/rdp_session_backend.cpp
|
|
src/rdp_session_backend.h
|
|
src/ssh_session_backend.cpp
|
|
src/ssh_session_backend.h
|
|
src/unsupported_session_backend.cpp
|
|
src/unsupported_session_backend.h
|
|
)
|
|
|
|
if(WIN32)
|
|
list(APPEND ORBITHUB_SOURCES packaging/windows/orbithub.rc)
|
|
endif()
|
|
|
|
add_executable(orbithub WIN32 ${ORBITHUB_SOURCES})
|
|
|
|
target_link_libraries(orbithub PRIVATE Qt6::Widgets Qt6::Sql)
|
|
target_link_libraries(orbithub PRIVATE KodoTerm::KodoTerm)
|
|
if(TARGET freerdp AND TARGET winpr)
|
|
target_compile_definitions(orbithub PRIVATE ORBITHUB_HAS_FREERDP)
|
|
target_include_directories(orbithub PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/third_party/FreeRDP/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/third_party/FreeRDP/winpr/include
|
|
${CMAKE_CURRENT_BINARY_DIR}/third_party/FreeRDP/include
|
|
${CMAKE_CURRENT_BINARY_DIR}/third_party/FreeRDP/winpr/include
|
|
)
|
|
target_link_libraries(orbithub PRIVATE freerdp winpr)
|
|
if(TARGET freerdp-client)
|
|
target_link_libraries(orbithub PRIVATE freerdp-client)
|
|
endif()
|
|
else()
|
|
message(FATAL_ERROR "Vendored FreeRDP targets were not produced as expected.")
|
|
endif()
|
|
|
|
# Qt loads platform integration and SQL driver plugins dynamically at
|
|
# runtime (QFactoryLoader), so they never appear in orbithub.exe's import
|
|
# table. vcpkg's automatic DLL deployment only follows the import table, so
|
|
# these plugins have to be copied out explicitly or the app fails to start
|
|
# with "Could not find the Qt platform plugin" / "can not load requested
|
|
# driver 'QSQLITE'".
|
|
if(WIN32)
|
|
if(TARGET Qt6::QWindowsIntegrationPlugin)
|
|
add_custom_command(TARGET orbithub POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory
|
|
"$<TARGET_FILE_DIR:orbithub>/platforms"
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
"$<TARGET_FILE:Qt6::QWindowsIntegrationPlugin>"
|
|
"$<TARGET_FILE_DIR:orbithub>/platforms/"
|
|
COMMENT "Deploying Qt Windows platform plugin"
|
|
)
|
|
install(FILES "$<TARGET_FILE:Qt6::QWindowsIntegrationPlugin>"
|
|
DESTINATION "${CMAKE_INSTALL_BINDIR}/platforms"
|
|
)
|
|
endif()
|
|
|
|
if(TARGET Qt6::QSQLiteDriverPlugin)
|
|
add_custom_command(TARGET orbithub POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory
|
|
"$<TARGET_FILE_DIR:orbithub>/sqldrivers"
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
"$<TARGET_FILE:Qt6::QSQLiteDriverPlugin>"
|
|
"$<TARGET_FILE_DIR:orbithub>/sqldrivers/"
|
|
COMMENT "Deploying Qt SQLite driver plugin"
|
|
)
|
|
install(FILES "$<TARGET_FILE:Qt6::QSQLiteDriverPlugin>"
|
|
DESTINATION "${CMAKE_INSTALL_BINDIR}/sqldrivers"
|
|
)
|
|
|
|
# vcpkg's qtbase[sql-sqlite] links the plugin against vcpkg's own
|
|
# shared sqlite3 port rather than bundling SQLite into the plugin,
|
|
# so the plugin fails to load ("can not load requested driver
|
|
# 'QSQLITE'") unless sqlite3.dll also ships next to the executable.
|
|
find_file(ORBITHUB_SQLITE3_DLL
|
|
NAMES sqlite3.dll
|
|
PATHS ${CMAKE_PREFIX_PATH}
|
|
PATH_SUFFIXES bin
|
|
)
|
|
if(ORBITHUB_SQLITE3_DLL)
|
|
add_custom_command(TARGET orbithub POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
"${ORBITHUB_SQLITE3_DLL}"
|
|
"$<TARGET_FILE_DIR:orbithub>/"
|
|
COMMENT "Deploying sqlite3.dll (Qt SQLite plugin dependency)"
|
|
)
|
|
install(FILES "${ORBITHUB_SQLITE3_DLL}" DESTINATION "${CMAKE_INSTALL_BINDIR}")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
set_target_properties(orbithub PROPERTIES
|
|
BUILD_RPATH_USE_ORIGIN ON
|
|
INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}/orbithub"
|
|
INSTALL_RPATH_USE_LINK_PATH ON
|
|
)
|
|
|
|
install(TARGETS orbithub
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
)
|
|
|
|
set(ORBITHUB_PRIVATE_LIB_DESTINATION "${CMAKE_INSTALL_LIBDIR}/orbithub")
|
|
set(ORBITHUB_RUNTIME_TARGETS KodoTerm freerdp winpr)
|
|
if(TARGET freerdp-client)
|
|
list(APPEND ORBITHUB_RUNTIME_TARGETS freerdp-client)
|
|
endif()
|
|
foreach(runtime_target IN LISTS ORBITHUB_RUNTIME_TARGETS)
|
|
if(TARGET ${runtime_target})
|
|
install(TARGETS ${runtime_target}
|
|
RUNTIME DESTINATION ${ORBITHUB_PRIVATE_LIB_DESTINATION}
|
|
LIBRARY DESTINATION ${ORBITHUB_PRIVATE_LIB_DESTINATION}
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
)
|
|
endif()
|
|
endforeach()
|
|
|
|
install(FILES
|
|
packaging/linux/io.orbithub.OrbitHub.desktop
|
|
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
|
|
)
|
|
install(FILES
|
|
packaging/linux/io.orbithub.OrbitHub.svg
|
|
DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps
|
|
)
|
|
install(FILES
|
|
packaging/linux/io.orbithub.OrbitHub.svg
|
|
DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps
|
|
RENAME orbithub.svg
|
|
)
|
|
install(FILES
|
|
packaging/linux/io.orbithub.OrbitHub.metainfo.xml
|
|
DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo
|
|
)
|
|
install(FILES LICENSE DESTINATION ${CMAKE_INSTALL_DATADIR}/licenses/orbithub)
|