mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-07 18:43:26 -08:00
Sanitizers tell us what a run did wrong; they say nothing about what it never reached. This adds the other half: an instrumented build whose report says which of our own lines no test executes. Add an ENABLE_COVERAGE option that compiles with --coverage -O0 -g, mirroring the ENABLE_SANITIZERS opt-in including the per-source carve-out that keeps vendored trees out of the denominator. -O0 is deliberate: at higher optimisation levels GCC merges and relocates lines, so the report would describe code that no longer exists in that form. Only GCC is supported, since Clang's intermediate format needs llvm-cov; asking for coverage under Clang is a hard error rather than a build that silently produces unreadable .gcno files. Keep the filters in a committed gcovr.cfg rather than in the invocation. The tests themselves are excluded because they are compiled with the same instrumentation and are only ever executed by the run doing the measuring, so leaving them in would report a healthier project than we have. The process entry points and the client's window chrome go too: each needs a display, an interactive terminal or a live database before it does anything a headless test could observe, so they would otherwise sit at 0% forever and bury real movement. Give coverage its own matrix leg rather than a second flag on the sanitizer leg. The two answer different questions, and combining them slows both down without telling us more. The new variant key gives the leg its own Docker image and ccache entry so the two legs cannot race on the same tag. The leg publishes an HTML report with per-file pages, LCOV, Cobertura XML and a JSON summary. gcovr is a report-time dependency rather than a build dependency, so a missing one warns and skips instead of failing an otherwise green build.
322 lines
9.7 KiB
CMake
322 lines
9.7 KiB
CMake
cmake_minimum_required(VERSION 3.16)
|
|
project(Oracle VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
|
|
|
|
# ------------------------
|
|
# Paths and directories
|
|
# ------------------------
|
|
set(DESKTOPDIR
|
|
share/applications
|
|
CACHE STRING "path to .desktop files"
|
|
)
|
|
|
|
set(ORACLE_MAC_QM_INSTALL_DIR "oracle.app/Contents/Resources/translations")
|
|
set(ORACLE_UNIX_QM_INSTALL_DIR "share/oracle/translations")
|
|
set(ORACLE_WIN32_QM_INSTALL_DIR "translations")
|
|
|
|
# ------------------------
|
|
# Sources
|
|
# ------------------------
|
|
set(oracle_SOURCES
|
|
src/main.cpp
|
|
src/oraclewizard.cpp
|
|
src/oracleimporter.cpp
|
|
src/pages.cpp
|
|
src/pagetemplates.cpp
|
|
src/parsehelpers.cpp
|
|
src/raw_json_scanner.cpp
|
|
../cockatrice/src/client/settings/cache_settings.cpp
|
|
../cockatrice/src/client/settings/card_counter_settings.cpp
|
|
../cockatrice/src/client/settings/shortcuts_settings.cpp
|
|
../cockatrice/src/client/network/update/client/release_channel.cpp
|
|
../cockatrice/src/interface/pixel_map_generator.cpp
|
|
../cockatrice/src/interface/theme_config.cpp
|
|
../cockatrice/src/interface/theme_manager.cpp
|
|
${VERSION_STRING_CPP}
|
|
)
|
|
|
|
# ------------------------
|
|
# Translations
|
|
# ------------------------
|
|
|
|
if(UPDATE_TRANSLATIONS)
|
|
file(GLOB_RECURSE translate_oracle_SRCS src/*.cpp src/*.h ../cockatrice/src/settingscache.cpp)
|
|
set(translate_SRCS ${translate_oracle_SRCS})
|
|
set(oracle_TS "${CMAKE_CURRENT_SOURCE_DIR}/oracle_en@source.ts")
|
|
else()
|
|
file(GLOB oracle_TS "${CMAKE_CURRENT_SOURCE_DIR}/translations/*.ts")
|
|
endif(UPDATE_TRANSLATIONS)
|
|
|
|
if(WIN32)
|
|
set(oracle_SOURCES ${oracle_SOURCES} oracle.rc)
|
|
endif(WIN32)
|
|
|
|
if(APPLE)
|
|
set(MACOSX_BUNDLE_ICON_FILE appicon.icns)
|
|
set_source_files_properties(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/resources/appicon.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources
|
|
)
|
|
set(oracle_SOURCES ${oracle_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/resources/appicon.icns)
|
|
endif(APPLE)
|
|
|
|
set(oracle_RESOURCES oracle.qrc)
|
|
|
|
# ------------------------
|
|
# Qt resources
|
|
# ------------------------
|
|
qt6_add_resources(oracle_RESOURCES_RCC ${oracle_RESOURCES})
|
|
|
|
# ------------------------
|
|
# Include directories
|
|
# ------------------------
|
|
include_directories(../cockatrice/src)
|
|
|
|
# ------------------------
|
|
# Optional libraries
|
|
# ------------------------
|
|
# ZLIB
|
|
find_package(ZLIB)
|
|
if(ZLIB_FOUND)
|
|
include_directories(${ZLIB_INCLUDE_DIRS})
|
|
add_definitions("-DHAS_ZLIB")
|
|
list(APPEND oracle_SOURCES src/zip/unzip.cpp src/zip/zipglobal.cpp)
|
|
# minizip and zlib are vendored.
|
|
cockatrice_disable_sanitizers_for(src/zip/unzip.cpp src/zip/zipglobal.cpp)
|
|
cockatrice_disable_coverage_for(src/zip/unzip.cpp src/zip/zipglobal.cpp)
|
|
else()
|
|
message(STATUS "Oracle: zlib not found; ZIP support disabled")
|
|
endif()
|
|
|
|
# LZMA
|
|
find_package(LibLZMA)
|
|
if(LIBLZMA_FOUND)
|
|
include_directories(${LIBLZMA_INCLUDE_DIRS})
|
|
add_definitions("-DHAS_LZMA")
|
|
list(APPEND oracle_SOURCES src/lzma/decompress.cpp)
|
|
# The LZMA SDK is vendored.
|
|
cockatrice_disable_sanitizers_for(src/lzma/decompress.cpp)
|
|
cockatrice_disable_coverage_for(src/lzma/decompress.cpp)
|
|
else()
|
|
message(STATUS "Oracle: LibLZMA not found; xz support disabled")
|
|
endif()
|
|
|
|
# ------------------------
|
|
# Build executable
|
|
# ------------------------
|
|
|
|
set(ORACLE_MAC_QM_INSTALL_DIR "oracle.app/Contents/Resources/translations")
|
|
set(ORACLE_UNIX_QM_INSTALL_DIR "share/oracle/translations")
|
|
set(ORACLE_WIN32_QM_INSTALL_DIR "translations")
|
|
|
|
# Qt6 Translations are linked after the executable is created in manual mode
|
|
qt6_add_executable(
|
|
oracle
|
|
WIN32
|
|
MACOSX_BUNDLE
|
|
${oracle_SOURCES}
|
|
${oracle_RESOURCES_RCC}
|
|
${oracle_MOC_SRCS}
|
|
MANUAL_FINALIZATION
|
|
)
|
|
|
|
target_precompile_headers(oracle PRIVATE "${CMAKE_SOURCE_DIR}/cmake/pch/qtwidgets_pch.h")
|
|
|
|
# ------------------------
|
|
# Link libraries
|
|
# ------------------------
|
|
target_link_libraries(
|
|
oracle
|
|
PUBLIC libcockatrice_card
|
|
PUBLIC libcockatrice_settings
|
|
PUBLIC libcockatrice_protocol
|
|
PUBLIC ${ORACLE_QT_MODULES}
|
|
)
|
|
|
|
# Only user_level.h is needed from the network headers (pulled in transitively
|
|
# by pixel_map_generator.h); nothing from the network libraries is linked.
|
|
target_include_directories(oracle PRIVATE ${CMAKE_SOURCE_DIR}/libcockatrice_network)
|
|
|
|
if(ZLIB_FOUND)
|
|
target_link_libraries(oracle PUBLIC ${ZLIB_LIBRARIES})
|
|
endif()
|
|
|
|
if(LIBLZMA_FOUND)
|
|
target_link_libraries(oracle PUBLIC ${LIBLZMA_LIBRARIES})
|
|
endif()
|
|
|
|
# ------------------------
|
|
# Install rules
|
|
# ------------------------
|
|
if(UNIX)
|
|
if(APPLE)
|
|
set(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME}")
|
|
set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.cockatrice.${PROJECT_NAME}")
|
|
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_NAME}-${PROJECT_VERSION}")
|
|
set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
|
|
set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION})
|
|
set(MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION})
|
|
set_target_properties(oracle PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/cmake/Info.plist)
|
|
|
|
install(TARGETS oracle BUNDLE DESTINATION ./)
|
|
else()
|
|
# Assume linux
|
|
install(TARGETS oracle RUNTIME DESTINATION bin/)
|
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/oracle.png DESTINATION ${ICONDIR}/hicolor/48x48/apps)
|
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/oracle.svg DESTINATION ${ICONDIR}/hicolor/scalable/apps)
|
|
endif()
|
|
elseif(WIN32)
|
|
install(TARGETS oracle RUNTIME DESTINATION ./)
|
|
endif()
|
|
|
|
if(NOT WIN32 AND NOT APPLE)
|
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/oracle.desktop DESTINATION ${DESKTOPDIR})
|
|
endif(NOT WIN32 AND NOT APPLE)
|
|
|
|
# ------------------------
|
|
# Qt plugin handling
|
|
# ------------------------
|
|
if(APPLE)
|
|
# these needs to be relative to CMAKE_INSTALL_PREFIX
|
|
set(plugin_dest_dir oracle.app/Contents/Plugins)
|
|
set(qtconf_dest_dir oracle.app/Contents/Resources)
|
|
|
|
# Qt plugins: iconengines, platforms, styles, tls (Qt6)
|
|
install(
|
|
DIRECTORY "${QT_PLUGINS_DIR}/"
|
|
DESTINATION ${plugin_dest_dir}
|
|
COMPONENT Runtime
|
|
FILES_MATCHING
|
|
PATTERN "*.dSYM" EXCLUDE
|
|
PATTERN "*_debug.dylib" EXCLUDE
|
|
PATTERN "iconengines/*.dylib"
|
|
PATTERN "platforms/*.dylib"
|
|
PATTERN "styles/*.dylib"
|
|
PATTERN "tls/*.dylib"
|
|
)
|
|
|
|
install(
|
|
CODE "
|
|
file(WRITE \"\${CMAKE_INSTALL_PREFIX}/${qtconf_dest_dir}/qt.conf\" \"[Paths]
|
|
Plugins = Plugins
|
|
Translations = Resources/translations\")
|
|
"
|
|
COMPONENT Runtime
|
|
)
|
|
|
|
install(
|
|
CODE "
|
|
file(GLOB_RECURSE QTPLUGINS
|
|
\"\${CMAKE_INSTALL_PREFIX}/${plugin_dest_dir}/*.dylib\")
|
|
set(BU_CHMOD_BUNDLE_ITEMS ON)
|
|
include(BundleUtilities)
|
|
fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/oracle.app\" \"\${QTPLUGINS}\" \"${QT_LIBRARY_DIR}\")
|
|
"
|
|
COMPONENT Runtime
|
|
)
|
|
endif()
|
|
|
|
if(WIN32)
|
|
# these needs to be relative to CMAKE_INSTALL_PREFIX
|
|
set(plugin_dest_dir Plugins)
|
|
set(qtconf_dest_dir .)
|
|
list(APPEND libSearchDirs ${QT_LIBRARY_DIR})
|
|
|
|
install(
|
|
DIRECTORY "$<TARGET_FILE_DIR:oracle>/"
|
|
DESTINATION ./
|
|
FILES_MATCHING
|
|
PATTERN "*.dll"
|
|
PATTERN "*.pdb" EXCLUDE
|
|
PATTERN "*.dir*" EXCLUDE
|
|
PATTERN "*_autogen*" EXCLUDE
|
|
PATTERN "*.tlog*" EXCLUDE
|
|
PATTERN "CMakeFiles*" EXCLUDE
|
|
PATTERN "x64*" EXCLUDE
|
|
PATTERN ".qt*" EXCLUDE
|
|
PATTERN ".qsb*" EXCLUDE
|
|
PATTERN ".lupdate*" EXCLUDE
|
|
)
|
|
|
|
# Qt plugins: iconengines, platforms, styles, tls (Qt6)
|
|
install(
|
|
DIRECTORY "${QT_PLUGINS_DIR}/"
|
|
DESTINATION ${plugin_dest_dir}
|
|
COMPONENT Runtime
|
|
FILES_MATCHING
|
|
PATTERN "iconengines/qsvgicon.dll"
|
|
PATTERN "platforms/qdirect2d.dll"
|
|
PATTERN "platforms/qminimal.dll"
|
|
PATTERN "platforms/qoffscreen.dll"
|
|
PATTERN "platforms/qwindows.dll"
|
|
PATTERN "styles/qcertonlybackend.dll"
|
|
PATTERN "styles/qopensslbackend.dll"
|
|
PATTERN "styles/qschannelbackend.dll"
|
|
PATTERN "styles/qwindowsvistastyle.dll"
|
|
PATTERN "tls/qcertonlybackend.dll"
|
|
PATTERN "tls/qopensslbackend.dll"
|
|
PATTERN "tls/qschannelbackend.dll"
|
|
)
|
|
|
|
install(
|
|
CODE "
|
|
file(WRITE \"\${CMAKE_INSTALL_PREFIX}/${qtconf_dest_dir}/qt.conf\" \"[Paths]
|
|
Plugins = Plugins
|
|
Translations = Resources/translations\")
|
|
"
|
|
COMPONENT Runtime
|
|
)
|
|
|
|
install(
|
|
CODE "
|
|
file(GLOB_RECURSE QTPLUGINS
|
|
\"\${CMAKE_INSTALL_PREFIX}/${plugin_dest_dir}/*.dll\")
|
|
set(BU_CHMOD_BUNDLE_ITEMS ON)
|
|
include(BundleUtilities)
|
|
fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/Oracle.exe\" \"\${QTPLUGINS}\" \"${libSearchDirs}\")
|
|
"
|
|
COMPONENT Runtime
|
|
)
|
|
endif()
|
|
|
|
# ------------------------
|
|
# Qt translations
|
|
# ------------------------
|
|
if(Qt6LinguistTools_FOUND)
|
|
#Qt6 Translations happen after the executable is built up
|
|
if(UPDATE_TRANSLATIONS)
|
|
qt6_add_translations(
|
|
oracle
|
|
TS_FILES
|
|
${oracle_TS}
|
|
SOURCES
|
|
${translate_SRCS}
|
|
QM_FILES_OUTPUT_VARIABLE
|
|
oracle_QM
|
|
)
|
|
else()
|
|
qt6_add_translations(oracle TS_FILES ${oracle_TS} QM_FILES_OUTPUT_VARIABLE oracle_QM)
|
|
endif()
|
|
|
|
if(UNIX)
|
|
if(APPLE)
|
|
install(FILES ${oracle_QM} DESTINATION ${ORACLE_MAC_QM_INSTALL_DIR})
|
|
else()
|
|
install(FILES ${oracle_QM} DESTINATION ${ORACLE_UNIX_QM_INSTALL_DIR})
|
|
endif()
|
|
elseif(WIN32)
|
|
install(FILES ${oracle_QM} DESTINATION ${ORACLE_WIN32_QM_INSTALL_DIR})
|
|
endif()
|
|
|
|
# Qt attaches the .qm files to the default build target only, so building the executable on its own
|
|
# (CLion, --target oracle) leaves it without any translations: nothing is translated and the
|
|
# language selector in the wizard stays empty.
|
|
# Depend on Qt's own lrelease target instead of attaching the .qm custom commands to a second
|
|
# target: two independent targets owning the same outputs race on MSBuild/Makefiles and are an
|
|
# error on Xcode. Older Qt versions already add this dependency themselves.
|
|
foreach(_lrelease_target Oracle_lrelease oracle_lrelease)
|
|
if(TARGET ${_lrelease_target})
|
|
add_dependencies(oracle ${_lrelease_target})
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
|
|
qt6_finalize_target(oracle)
|