mirror of
https://github.com/SatDump/SatDump
synced 2026-08-13 17:47:30 -04:00
380 lines
15 KiB
CMake
380 lines
15 KiB
CMake
cmake_minimum_required(VERSION 3.12)
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
|
|
include(CheckCXXSourceCompiles)
|
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
|
|
|
# Automatically prepare compiler_commands
|
|
if(DEFINED ENV{CI})
|
|
message("Running in CI. Skipping EXPORT_COMPILE_COMMANDS")
|
|
else()
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
# Only copy compile_commands.json if it exists (generated by Ninja/Makefiles)
|
|
if(CMAKE_GENERATOR STREQUAL "Ninja" OR CMAKE_GENERATOR MATCHES "Makefiles")
|
|
add_custom_target(copy-compile-commands ALL
|
|
${CMAKE_COMMAND} -E copy_if_different
|
|
${CMAKE_BINARY_DIR}/compile_commands.json
|
|
${CMAKE_CURRENT_LIST_DIR}
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
if(MSVC OR BUILD_MSVC)
|
|
set(VCPKG_APPLOCAL_DEPS CACHE BOOL FALSE)
|
|
endif()
|
|
|
|
project(SatDump)
|
|
|
|
option(BUILD_GUI "Build the GUI" ON)
|
|
option(BUILD_TESTING "Build the testing program" OFF)
|
|
option(BUILD_TOOLS "Build the tools programs" OFF)
|
|
option(BUILD_ZIQ "Build support for the custom ZIQ format" ON)
|
|
option(BUILD_ZIQ2 "Build support for the custom ZIQ2 format (Very WIP)" OFF)
|
|
option(BUILD_MSVC "Build for Windows with MSVC" OFF) # Seems like "MSVC" as a macro messed up below for some reason...
|
|
option(BUILD_OPENCL "Build with OpenCL GPU Accelerations" ON)
|
|
option(BUILD_OPENMP "Build with OpenMP Optimizations" ON)
|
|
option(BUILD_DOCS "Build with Doxygen Documentation" OFF)
|
|
option(ENABLE_INSTALL "Enable INSTALL TARGET" ON)
|
|
|
|
if(ANDROID)
|
|
# Build settings
|
|
set(BUILD_OPENMP OFF)
|
|
set(OPENCL_FOUND 1)
|
|
endif()
|
|
|
|
# Set default install prefix
|
|
include(GNUInstallDirs) #Retruns good defaults on non-GNU systems as well
|
|
if(UNIX)
|
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
|
if(APPLE)
|
|
set(CMAKE_INSTALL_PREFIX /usr/local CACHE PATH "Set CMAKE Default to /usr/local" FORCE)
|
|
else()
|
|
set(CMAKE_INSTALL_PREFIX /usr CACHE PATH "Set CMAKE Default to /usr" FORCE)
|
|
endif()
|
|
endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
|
endif()
|
|
|
|
if(APPLE)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
|
|
link_directories(vcpkg/installed/osx-satdump/lib)
|
|
|
|
# Jemalloc
|
|
find_package(Jemalloc REQUIRED)
|
|
include_directories(${JEMALLOC_INCLUDE_DIR})
|
|
link_libraries(${JEMALLOC_LIBRARY})
|
|
|
|
endif()
|
|
|
|
if(UNIX)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
|
|
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi")
|
|
endif()
|
|
|
|
if(BUILD_OPENMP)
|
|
message("Compiling with OpenMP support!")
|
|
if(APPLE)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-command-line-argument -Xpreprocessor")
|
|
endif()
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
|
|
endif()
|
|
|
|
find_package(ZSTD)
|
|
|
|
if((NOT ZSTD_FOUND) AND BUILD_ZIQ AND (NOT ANDROID))
|
|
message("ZIQ Was enabled but libzstd was not found!")
|
|
set(BUILD_ZIQ OFF)
|
|
endif()
|
|
else()
|
|
# set(CMAKE_CXX_FLAGS "-Wall")
|
|
# set(CMAKE_CXX_FLAGS_DEBUG "-g")
|
|
set(CMAKE_CXX_FLAGS_RELEASE "-O2")
|
|
endif()
|
|
|
|
if(MSVC OR BUILD_MSVC)
|
|
add_compile_definitions(
|
|
_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS
|
|
_USE_MATH_DEFINES
|
|
_CRT_SECURE_NO_WARNINGS
|
|
_WINSOCK_DEPRECATED_NO_WARNINGS
|
|
_CRT_NONSTDC_NO_WARNINGS
|
|
)
|
|
|
|
if(BUILD_OPENMP)
|
|
message("Compiling with OpenMP support!")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp")
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /openmp")
|
|
endif()
|
|
|
|
# This should be the default, but sometimes it isn't apparently
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
|
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MD")
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
|
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MDd")
|
|
|
|
# Speed up this to object-level, Suppress type conversion warnings, suppress
|
|
# POSIX function warnings, suppress warnings about DLL-exported functions, and
|
|
# Suppress warnings about template methods defined in another C++ file
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP8 /EHsc /wd4305 /wd4267 /wd4244 /wd4273 /wd4661")
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP8 /EHsc /wd4305 /wd4267 /wd4244 /wd4273 /wd4661")
|
|
|
|
#Suppress pointless (to us) warnings about DLL-exported functions
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ignore:4286,4217")
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /ignore:4286,4217")
|
|
set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /ignore:4286,4217")
|
|
|
|
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
|
include_directories(vcpkg/installed/${VCPKG_TARGET_TRIPLET}/include)
|
|
link_directories(vcpkg/installed/${VCPKG_TARGET_TRIPLET}/lib)
|
|
endif()
|
|
|
|
project(SatDump VERSION "2.0.0")
|
|
set(SATDUMP_VERSION_TYPE "alpha")
|
|
|
|
# Check if the current commit has a tag
|
|
execute_process(
|
|
COMMAND git name-rev --name-only --tags HEAD
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
|
|
OUTPUT_VARIABLE GIT_HAS_TAG
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
|
|
# Get the current branch
|
|
execute_process(
|
|
COMMAND git rev-parse --abbrev-ref HEAD
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
|
|
OUTPUT_VARIABLE GIT_HAS_BRANCH
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
|
|
# Get the latest abbreviated commit hash of current branch
|
|
execute_process(
|
|
COMMAND git log -1 --format=%h
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
|
|
OUTPUT_VARIABLE GIT_HASH
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
|
|
# Set version
|
|
if(GIT_HAS_TAG STREQUAL "undefined" OR GIT_HAS_TAG STREQUAL "nightly")
|
|
message("-- Commit has no tag/nightly tag (${GIT_HAS_TAG}). Assume dev build")
|
|
if(NOT SATDUMP_VERSION_TYPE STREQUAL "")
|
|
set(SATDUMP_VERSION "${PROJECT_VERSION}-${SATDUMP_VERSION_TYPE}-${GIT_HASH}")
|
|
else()
|
|
set(SATDUMP_VERSION "${PROJECT_VERSION}-${GIT_HASH}")
|
|
endif()
|
|
else()
|
|
message("-- Commit has tag (${GIT_HAS_TAG}). Assume release build")
|
|
if(NOT SATDUMP_VERSION_TYPE STREQUAL "")
|
|
set(SATDUMP_VERSION "${PROJECT_VERSION}")
|
|
else()
|
|
set(SATDUMP_VERSION "${PROJECT_VERSION}-${SATDUMP_VERSION_TYPE}")
|
|
endif()
|
|
endif()
|
|
|
|
# Set branch
|
|
if(GIT_HAS_BRANCH STREQUAL "master")
|
|
set(SATDUMP_VERSION_TAG "")
|
|
else()
|
|
set(SATDUMP_VERSION_TAG "${GIT_HAS_BRANCH}/${CMAKE_BUILD_TYPE}")
|
|
endif()
|
|
|
|
# Used for error messages
|
|
string(LENGTH "${CMAKE_SOURCE_DIR}/" SOURCE_PATH_SIZE)
|
|
add_compile_definitions(SOURCE_PATH_SIZE=${SOURCE_PATH_SIZE})
|
|
|
|
if(ANDROID)
|
|
add_compile_definitions(ANDROID_ABI_LIB="${ANDROID_ABI}")
|
|
endif()
|
|
|
|
# Check we have OpenCL
|
|
if(NOT ANDROID)
|
|
find_package(OpenCL)
|
|
endif()
|
|
|
|
if(OPENCL_FOUND AND BUILD_OPENCL)
|
|
message("OpenCL Found! SatDump will support accelerated GPU computing.")
|
|
else()
|
|
message("OpenCL NOT found or disabled!")
|
|
set(BUILD_OPENCL OFF)
|
|
endif()
|
|
|
|
# For good measure
|
|
if(BUILD_ZIQ)
|
|
message("Building with ZIQ Support")
|
|
endif()
|
|
|
|
if(BUILD_ZIQ2)
|
|
message("Building with ZIQ2 Support")
|
|
endif()
|
|
|
|
# If in debug, set the macro
|
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
add_compile_definitions(BUILD_IS_DEBUG=1)
|
|
message("")
|
|
message("██████╗ █████╗ ███╗ ██╗ ██████╗ ███████╗██████╗ ")
|
|
message("██╔══██╗██╔══██╗████╗ ██║██╔════╝ ██╔════╝██╔══██╗")
|
|
message("██║ ██║███████║██╔██╗ ██║██║ ███╗█████╗ ██████╔╝")
|
|
message("██║ ██║██╔══██║██║╚██╗██║██║ ██║██╔══╝ ██╔══██╗")
|
|
message("██████╔╝██║ ██║██║ ╚████║╚██████╔╝███████╗██║ ██║")
|
|
message("╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝")
|
|
message("Building SatDump in Debug mode!")
|
|
message("")
|
|
endif()
|
|
|
|
# Check system has <filesystem>
|
|
check_cxx_source_compiles("#include <filesystem>\n int main() { return 0; }" STD_HAS_FILESYSTEM)
|
|
|
|
if(NOT STD_HAS_FILESYSTEM)
|
|
include_directories(std_filesystem)
|
|
endif()
|
|
|
|
add_subdirectory(src-core)
|
|
add_subdirectory(src-cli)
|
|
add_subdirectory(src-cli2)
|
|
|
|
if(BUILD_GUI)
|
|
message("Building the GUI")
|
|
add_subdirectory(src-interface)
|
|
|
|
if(NOT ANDROID)
|
|
add_subdirectory(src-ui)
|
|
endif()
|
|
endif()
|
|
|
|
if(BUILD_TESTING)
|
|
add_subdirectory(src-testing)
|
|
endif()
|
|
|
|
if(BUILD_TOOLS)
|
|
add_subdirectory(tools)
|
|
endif()
|
|
|
|
add_subdirectory(plugins)
|
|
|
|
# Install configuration
|
|
if((NOT ANDROID) AND ENABLE_INSTALL)
|
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/resources DESTINATION share/satdump)
|
|
install(FILES ${CMAKE_SOURCE_DIR}/satdump_cfg.json DESTINATION share/satdump)
|
|
install(FILES ${CMAKE_SOURCE_DIR}/icon.png DESTINATION share/satdump)
|
|
configure_file(${CMAKE_SOURCE_DIR}/satdump.desktop ${CMAKE_CURRENT_BINARY_DIR}/satdump.desktop @ONLY)
|
|
|
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/satdump.desktop DESTINATION share/applications)
|
|
endif()
|
|
|
|
# Create uninstall target
|
|
configure_file(${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake @ONLY)
|
|
add_custom_target(uninstall ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
|
|
|
|
# CPack Configuration
|
|
set(CPACK_PACKAGE_NAME ${PROJECT_NAME} CACHE STRING "satdump-${PROJECT_VERSION}")
|
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A satellite data processing software" CACHE STRING "")
|
|
set(CPACK_PACKAGE_VENDOR "SatDump")
|
|
set(CPACK_PACKAGE_CONTACT "Aang23")
|
|
|
|
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libfftw3-bin, libvolk-bin | libvolk2-bin, libpng16-16, libnng1, librtlsdr0 | librtlsdr2, libhackrf0, libairspy0, libairspyhf1, libglfw3 | libglfw3-wayland, libzstd1, libjemalloc2 | libjemalloc1, libportaudiocpp0, libhdf5-hl-100t64 | libhdf5-hl-100 | libhdf5-103 | libhdf5-100, libdbus-1-dev")
|
|
set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "libomp5-14, ocl-icd-libopencl1, intel-opencl-icd, mesa-opencl-icd")
|
|
|
|
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
|
|
set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
|
|
|
|
if(MSVC OR BUILD_MSVC)
|
|
set(CPACK_PACKAGING_INSTALL_PREFIX "/")
|
|
else()
|
|
set(CPACK_PACKAGING_INSTALL_PREFIX "/usr")
|
|
endif()
|
|
|
|
#set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
|
|
#set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
|
|
#set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
|
|
set(CPACK_PACKAGE_VERSION ${SATDUMP_VERSION})
|
|
|
|
if(MSVC OR BUILD_MSVC)
|
|
# Customize NSIS template
|
|
file(READ "${CMAKE_ROOT}/Modules/Internal/CPack/NSIS.template.in" NSIS_template)
|
|
set(CREATE_ICONS_REPLACE " SetOutPath \"$INSTDIR\\bin\"\n@CPACK_NSIS_CREATE_ICONS@\n@CPACK_NSIS_CREATE_ICONS_EXTRA@\n SetOutPath \"$INSTDIR\"")
|
|
string(CONCAT INSTALLDIR_REPLACE " InstallDir \"@CPACK_NSIS_INSTALL_ROOT@\\@CPACK_PACKAGE_INSTALL_DIRECTORY@\""
|
|
"\n InstallDirRegKey HKLM Software\\@CPACK_PACKAGE_VENDOR@\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@ \"\"")
|
|
string(REPLACE "@CPACK_NSIS_CREATE_ICONS@\n@CPACK_NSIS_CREATE_ICONS_EXTRA@" "${CREATE_ICONS_REPLACE}" NSIS_template "${NSIS_template}")
|
|
string(REPLACE " InstallDir \"@CPACK_NSIS_INSTALL_ROOT@\\@CPACK_PACKAGE_INSTALL_DIRECTORY@\"" "${INSTALLDIR_REPLACE}" NSIS_template "${NSIS_template}")
|
|
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/NSIS.template.in" "${NSIS_template}")
|
|
set(CPACK_MODULE_PATH "${CMAKE_CURRENT_BINARY_DIR}")
|
|
|
|
# Generate Installer
|
|
set(CPACK_GENERATOR NSIS)
|
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY SatDump)
|
|
set(CPACK_NSIS_MANIFEST_DPI_AWARE ON)
|
|
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
|
|
set(CPACK_NSIS_MODIFY_PATH ON)
|
|
set(CPACK_NSIS_BRANDING_TEXT "SatDump - General Purpose Satellite Data Processor")
|
|
set(CPACK_NSIS_MUI_HEADERIMAGE "${PROJECT_SOURCE_DIR}\\\\windows\\\\installer-header.bmp")
|
|
set(CPACK_NSIS_MUI_ICON "${PROJECT_SOURCE_DIR}\\\\windows\\\\icon.ico")
|
|
if(BUILD_GUI)
|
|
set(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\satdump-ui.exe")
|
|
set(CPACK_PACKAGE_EXECUTABLES ${CPACK_PACKAGE_EXECUTABLES} "satdump-ui" "SatDump")
|
|
list(APPEND CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut \\\"$DESKTOP\\\\SatDump.lnk\\\" \\\"$INSTDIR\\\\bin\\\\satdump-ui.exe\\\"")
|
|
list(APPEND CPACK_NSIS_DELETE_ICONS_EXTRA "Delete \\\"$DESKTOP\\\\SatDump.lnk\\\"")
|
|
endif()
|
|
if(PLUGIN_REMOTE_SDR_SUPPORT)
|
|
set(CPACK_PACKAGE_EXECUTABLES ${CPACK_PACKAGE_EXECUTABLES} "satdump_sdr_server" "SatDump SDR Server")
|
|
endif()
|
|
|
|
install(RUNTIME_DEPENDENCY_SET satdump_deps
|
|
PRE_EXCLUDE_REGEXES
|
|
"api-ms-.*"
|
|
"ext-ms-.*"
|
|
"^hvsifiletrust\\.dll$"
|
|
"^pdmutilities\\.dll$"
|
|
"^vc.*"
|
|
"^msvcp.*"
|
|
"^concrt.*"
|
|
"satdump_core.dll"
|
|
"satdump_interface.dll"
|
|
POST_EXCLUDE_REGEXES
|
|
".*system32/.*\\.dll"
|
|
DIRECTORIES
|
|
"${PROJECT_SOURCE_DIR}/vcpkg/installed/${VCPKG_TARGET_TRIPLET}/bin"
|
|
)
|
|
else()
|
|
set(CPACK_GENERATOR DEB)
|
|
#set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
|
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
|
|
set(CPACK_DEB_COMPONENT_INSTALL ON)
|
|
endif()
|
|
|
|
set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE)
|
|
|
|
include(CPack)
|
|
endif()
|
|
|
|
# Doxygen configuration
|
|
if((CMAKE_BUILD_TYPE MATCHES "^[Rr]elease") AND BUILD_DOCS)
|
|
find_package(Doxygen)
|
|
if(DOXYGEN_FOUND)
|
|
set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
|
|
set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
|
|
|
|
configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
|
|
message("-- Doxygen build enabled!")
|
|
|
|
add_custom_target(docs_doxygen ALL
|
|
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
COMMENT "Generating API documentation with Doxygen"
|
|
VERBATIM)
|
|
|
|
add_custom_command(TARGET docs_doxygen POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
|
${CMAKE_CURRENT_SOURCE_DIR}/docs/res
|
|
${CMAKE_CURRENT_BINARY_DIR}/documentation/html/res)
|
|
else(DOXYGEN_FOUND)
|
|
message("Doxygen need to be installed to generate the doxygen documentation")
|
|
endif(DOXYGEN_FOUND)
|
|
endif()
|