cmake_minimum_required(VERSION 3.24) project(scwx-qt LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC OFF) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) OPTION(SCWX_DISABLE_CONSOLE "Disables the Windows console in release mode" ON) find_package(Boost) find_package(Fontconfig) find_package(geographiclib) find_package(geos) find_package(glm) find_package(OpenGL) find_package(Python COMPONENTS Interpreter) find_package(SQLite3) find_package(QT NAMES Qt6 COMPONENTS Gui LinguistTools Multimedia Network OpenGL OpenGLWidgets Positioning SerialPort Svg Widgets Sql REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Gui LinguistTools Multimedia Network OpenGL OpenGLWidgets Positioning SerialPort Svg Widgets Sql REQUIRED) set(SRC_EXE_MAIN source/scwx/qt/main/main.cpp) set(HDR_MAIN source/scwx/qt/main/application.hpp source/scwx/qt/main/check_privilege.hpp source/scwx/qt/main/main_window.hpp source/scwx/qt/main/process_validation.hpp) set(SRC_MAIN source/scwx/qt/main/application.cpp source/scwx/qt/main/check_privilege.cpp source/scwx/qt/main/main_window.cpp source/scwx/qt/main/process_validation.cpp) set(UI_MAIN source/scwx/qt/main/main_window.ui) set(HDR_CONFIG source/scwx/qt/config/county_database.hpp source/scwx/qt/config/radar_site.hpp) set(SRC_CONFIG source/scwx/qt/config/county_database.cpp source/scwx/qt/config/radar_site.cpp) set(SRC_EXTERNAL source/scwx/qt/external/stb_image.cpp source/scwx/qt/external/stb_rect_pack.cpp) set(HDR_GL source/scwx/qt/gl/gl.hpp source/scwx/qt/gl/gl_context.hpp source/scwx/qt/gl/shader_program.hpp) set(SRC_GL source/scwx/qt/gl/gl_context.cpp source/scwx/qt/gl/shader_program.cpp) set(HDR_GL_DRAW source/scwx/qt/gl/draw/draw_item.hpp source/scwx/qt/gl/draw/geo_icons.hpp source/scwx/qt/gl/draw/geo_lines.hpp source/scwx/qt/gl/draw/icons.hpp source/scwx/qt/gl/draw/linked_vectors.hpp source/scwx/qt/gl/draw/placefile_icons.hpp source/scwx/qt/gl/draw/placefile_images.hpp source/scwx/qt/gl/draw/placefile_lines.hpp source/scwx/qt/gl/draw/placefile_polygons.hpp source/scwx/qt/gl/draw/placefile_text.hpp source/scwx/qt/gl/draw/placefile_triangles.hpp source/scwx/qt/gl/draw/rectangle.hpp) set(SRC_GL_DRAW source/scwx/qt/gl/draw/draw_item.cpp source/scwx/qt/gl/draw/geo_icons.cpp source/scwx/qt/gl/draw/geo_lines.cpp source/scwx/qt/gl/draw/icons.cpp source/scwx/qt/gl/draw/linked_vectors.cpp source/scwx/qt/gl/draw/placefile_icons.cpp source/scwx/qt/gl/draw/placefile_images.cpp source/scwx/qt/gl/draw/placefile_lines.cpp source/scwx/qt/gl/draw/placefile_polygons.cpp source/scwx/qt/gl/draw/placefile_text.cpp source/scwx/qt/gl/draw/placefile_triangles.cpp source/scwx/qt/gl/draw/rectangle.cpp) set(HDR_MANAGER source/scwx/qt/manager/alert_manager.hpp source/scwx/qt/manager/download_manager.hpp source/scwx/qt/manager/font_manager.hpp source/scwx/qt/manager/hotkey_manager.hpp source/scwx/qt/manager/log_manager.hpp source/scwx/qt/manager/media_manager.hpp source/scwx/qt/manager/placefile_manager.hpp source/scwx/qt/manager/marker_manager.hpp source/scwx/qt/manager/position_manager.hpp source/scwx/qt/manager/radar_product_manager.hpp source/scwx/qt/manager/radar_product_manager_notifier.hpp source/scwx/qt/manager/resource_manager.hpp source/scwx/qt/manager/settings_manager.hpp source/scwx/qt/manager/task_manager.hpp source/scwx/qt/manager/text_event_manager.hpp source/scwx/qt/manager/thread_manager.hpp source/scwx/qt/manager/timeline_manager.hpp source/scwx/qt/manager/update_manager.hpp) set(SRC_MANAGER source/scwx/qt/manager/alert_manager.cpp source/scwx/qt/manager/download_manager.cpp source/scwx/qt/manager/font_manager.cpp source/scwx/qt/manager/hotkey_manager.cpp source/scwx/qt/manager/log_manager.cpp source/scwx/qt/manager/media_manager.cpp source/scwx/qt/manager/placefile_manager.cpp source/scwx/qt/manager/marker_manager.cpp source/scwx/qt/manager/position_manager.cpp source/scwx/qt/manager/radar_product_manager.cpp source/scwx/qt/manager/radar_product_manager_notifier.cpp source/scwx/qt/manager/resource_manager.cpp source/scwx/qt/manager/settings_manager.cpp source/scwx/qt/manager/task_manager.cpp source/scwx/qt/manager/text_event_manager.cpp source/scwx/qt/manager/thread_manager.cpp source/scwx/qt/manager/timeline_manager.cpp source/scwx/qt/manager/update_manager.cpp) set(HDR_MAP source/scwx/qt/map/alert_layer.hpp source/scwx/qt/map/color_table_layer.hpp source/scwx/qt/map/draw_layer.hpp source/scwx/qt/map/generic_layer.hpp source/scwx/qt/map/layer_wrapper.hpp source/scwx/qt/map/map_context.hpp source/scwx/qt/map/map_provider.hpp source/scwx/qt/map/map_settings.hpp source/scwx/qt/map/map_widget.hpp source/scwx/qt/map/overlay_layer.hpp source/scwx/qt/map/overlay_product_layer.hpp source/scwx/qt/map/placefile_layer.hpp source/scwx/qt/map/marker_layer.hpp source/scwx/qt/map/radar_product_layer.hpp source/scwx/qt/map/radar_range_layer.hpp source/scwx/qt/map/radar_site_layer.hpp) set(SRC_MAP source/scwx/qt/map/alert_layer.cpp source/scwx/qt/map/color_table_layer.cpp source/scwx/qt/map/draw_layer.cpp source/scwx/qt/map/generic_layer.cpp source/scwx/qt/map/layer_wrapper.cpp source/scwx/qt/map/map_context.cpp source/scwx/qt/map/map_provider.cpp source/scwx/qt/map/map_widget.cpp source/scwx/qt/map/overlay_layer.cpp source/scwx/qt/map/overlay_product_layer.cpp source/scwx/qt/map/placefile_layer.cpp source/scwx/qt/map/marker_layer.cpp source/scwx/qt/map/radar_product_layer.cpp source/scwx/qt/map/radar_range_layer.cpp source/scwx/qt/map/radar_site_layer.cpp) set(HDR_MODEL source/scwx/qt/model/alert_model.hpp source/scwx/qt/model/alert_proxy_model.hpp source/scwx/qt/model/imgui_context_model.hpp source/scwx/qt/model/layer_model.hpp source/scwx/qt/model/placefile_model.hpp source/scwx/qt/model/marker_model.hpp source/scwx/qt/model/radar_site_model.hpp source/scwx/qt/model/tree_item.hpp source/scwx/qt/model/tree_model.hpp) set(SRC_MODEL source/scwx/qt/model/alert_model.cpp source/scwx/qt/model/alert_proxy_model.cpp source/scwx/qt/model/imgui_context_model.cpp source/scwx/qt/model/layer_model.cpp source/scwx/qt/model/placefile_model.cpp source/scwx/qt/model/marker_model.cpp source/scwx/qt/model/radar_site_model.cpp source/scwx/qt/model/tree_item.cpp source/scwx/qt/model/tree_model.cpp) set(HDR_REQUEST source/scwx/qt/request/download_request.hpp source/scwx/qt/request/nexrad_file_request.hpp) set(SRC_REQUEST source/scwx/qt/request/download_request.cpp source/scwx/qt/request/nexrad_file_request.cpp) set(HDR_SETTINGS source/scwx/qt/settings/alert_palette_settings.hpp source/scwx/qt/settings/audio_settings.hpp source/scwx/qt/settings/general_settings.hpp source/scwx/qt/settings/hotkey_settings.hpp source/scwx/qt/settings/line_settings.hpp source/scwx/qt/settings/map_settings.hpp source/scwx/qt/settings/palette_settings.hpp source/scwx/qt/settings/product_settings.hpp source/scwx/qt/settings/settings_category.hpp source/scwx/qt/settings/settings_container.hpp source/scwx/qt/settings/settings_definitions.hpp source/scwx/qt/settings/settings_interface.hpp source/scwx/qt/settings/settings_interface_base.hpp source/scwx/qt/settings/settings_variable.hpp source/scwx/qt/settings/settings_variable_base.hpp source/scwx/qt/settings/text_settings.hpp source/scwx/qt/settings/ui_settings.hpp source/scwx/qt/settings/unit_settings.hpp) set(SRC_SETTINGS source/scwx/qt/settings/alert_palette_settings.cpp source/scwx/qt/settings/audio_settings.cpp source/scwx/qt/settings/general_settings.cpp source/scwx/qt/settings/hotkey_settings.cpp source/scwx/qt/settings/line_settings.cpp source/scwx/qt/settings/map_settings.cpp source/scwx/qt/settings/palette_settings.cpp source/scwx/qt/settings/product_settings.cpp source/scwx/qt/settings/settings_category.cpp source/scwx/qt/settings/settings_container.cpp source/scwx/qt/settings/settings_interface.cpp source/scwx/qt/settings/settings_interface_base.cpp source/scwx/qt/settings/settings_variable.cpp source/scwx/qt/settings/settings_variable_base.cpp source/scwx/qt/settings/text_settings.cpp source/scwx/qt/settings/ui_settings.cpp source/scwx/qt/settings/unit_settings.cpp) set(HDR_TYPES source/scwx/qt/types/alert_types.hpp source/scwx/qt/types/event_types.hpp source/scwx/qt/types/font_types.hpp source/scwx/qt/types/github_types.hpp source/scwx/qt/types/hotkey_types.hpp source/scwx/qt/types/icon_types.hpp source/scwx/qt/types/imgui_font.hpp source/scwx/qt/types/layer_types.hpp source/scwx/qt/types/location_types.hpp source/scwx/qt/types/map_types.hpp source/scwx/qt/types/marker_types.hpp source/scwx/qt/types/media_types.hpp source/scwx/qt/types/qt_types.hpp source/scwx/qt/types/radar_product_record.hpp source/scwx/qt/types/radar_product_types.hpp source/scwx/qt/types/text_event_key.hpp source/scwx/qt/types/text_types.hpp source/scwx/qt/types/texture_types.hpp source/scwx/qt/types/time_types.hpp source/scwx/qt/types/unit_types.hpp) set(SRC_TYPES source/scwx/qt/types/alert_types.cpp source/scwx/qt/types/github_types.cpp source/scwx/qt/types/hotkey_types.cpp source/scwx/qt/types/icon_types.cpp source/scwx/qt/types/imgui_font.cpp source/scwx/qt/types/layer_types.cpp source/scwx/qt/types/location_types.cpp source/scwx/qt/types/map_types.cpp source/scwx/qt/types/media_types.cpp source/scwx/qt/types/qt_types.cpp source/scwx/qt/types/radar_product_record.cpp source/scwx/qt/types/text_event_key.cpp source/scwx/qt/types/text_types.cpp source/scwx/qt/types/texture_types.cpp source/scwx/qt/types/time_types.cpp source/scwx/qt/types/unit_types.cpp) set(HDR_UI source/scwx/qt/ui/about_dialog.hpp source/scwx/qt/ui/alert_dialog.hpp source/scwx/qt/ui/alert_dock_widget.hpp source/scwx/qt/ui/animation_dock_widget.hpp source/scwx/qt/ui/api_key_edit_widget.hpp source/scwx/qt/ui/collapsible_group.hpp source/scwx/qt/ui/county_dialog.hpp source/scwx/qt/ui/custom_layer_dialog.hpp source/scwx/qt/ui/download_dialog.hpp source/scwx/qt/ui/edit_line_dialog.hpp source/scwx/qt/ui/edit_marker_dialog.hpp source/scwx/qt/ui/flow_layout.hpp source/scwx/qt/ui/gps_info_dialog.hpp source/scwx/qt/ui/hotkey_edit.hpp source/scwx/qt/ui/imgui_debug_dialog.hpp source/scwx/qt/ui/imgui_debug_widget.hpp source/scwx/qt/ui/layer_dialog.hpp source/scwx/qt/ui/left_elided_item_delegate.hpp source/scwx/qt/ui/level2_products_widget.hpp source/scwx/qt/ui/level2_settings_widget.hpp source/scwx/qt/ui/level3_products_widget.hpp source/scwx/qt/ui/line_label.hpp source/scwx/qt/ui/open_url_dialog.hpp source/scwx/qt/ui/placefile_dialog.hpp source/scwx/qt/ui/placefile_settings_widget.hpp source/scwx/qt/ui/marker_dialog.hpp source/scwx/qt/ui/marker_settings_widget.hpp source/scwx/qt/ui/progress_dialog.hpp source/scwx/qt/ui/radar_site_dialog.hpp source/scwx/qt/ui/serial_port_dialog.hpp source/scwx/qt/ui/settings_dialog.hpp source/scwx/qt/ui/update_dialog.hpp source/scwx/qt/ui/wfo_dialog.hpp) set(SRC_UI source/scwx/qt/ui/about_dialog.cpp source/scwx/qt/ui/alert_dialog.cpp source/scwx/qt/ui/alert_dock_widget.cpp source/scwx/qt/ui/animation_dock_widget.cpp source/scwx/qt/ui/api_key_edit_widget.cpp source/scwx/qt/ui/collapsible_group.cpp source/scwx/qt/ui/county_dialog.cpp source/scwx/qt/ui/custom_layer_dialog.cpp source/scwx/qt/ui/download_dialog.cpp source/scwx/qt/ui/edit_line_dialog.cpp source/scwx/qt/ui/edit_marker_dialog.cpp source/scwx/qt/ui/flow_layout.cpp source/scwx/qt/ui/gps_info_dialog.cpp source/scwx/qt/ui/hotkey_edit.cpp source/scwx/qt/ui/imgui_debug_dialog.cpp source/scwx/qt/ui/imgui_debug_widget.cpp source/scwx/qt/ui/layer_dialog.cpp source/scwx/qt/ui/left_elided_item_delegate.cpp source/scwx/qt/ui/level2_products_widget.cpp source/scwx/qt/ui/level2_settings_widget.cpp source/scwx/qt/ui/level3_products_widget.cpp source/scwx/qt/ui/line_label.cpp source/scwx/qt/ui/open_url_dialog.cpp source/scwx/qt/ui/placefile_dialog.cpp source/scwx/qt/ui/placefile_settings_widget.cpp source/scwx/qt/ui/marker_dialog.cpp source/scwx/qt/ui/marker_settings_widget.cpp source/scwx/qt/ui/progress_dialog.cpp source/scwx/qt/ui/radar_site_dialog.cpp source/scwx/qt/ui/settings_dialog.cpp source/scwx/qt/ui/serial_port_dialog.cpp source/scwx/qt/ui/update_dialog.cpp source/scwx/qt/ui/wfo_dialog.cpp) set(UI_UI source/scwx/qt/ui/about_dialog.ui source/scwx/qt/ui/alert_dialog.ui source/scwx/qt/ui/alert_dock_widget.ui source/scwx/qt/ui/animation_dock_widget.ui source/scwx/qt/ui/collapsible_group.ui source/scwx/qt/ui/county_dialog.ui source/scwx/qt/ui/custom_layer_dialog.ui source/scwx/qt/ui/edit_line_dialog.ui source/scwx/qt/ui/edit_marker_dialog.ui source/scwx/qt/ui/gps_info_dialog.ui source/scwx/qt/ui/imgui_debug_dialog.ui source/scwx/qt/ui/layer_dialog.ui source/scwx/qt/ui/open_url_dialog.ui source/scwx/qt/ui/placefile_dialog.ui source/scwx/qt/ui/placefile_settings_widget.ui source/scwx/qt/ui/marker_dialog.ui source/scwx/qt/ui/marker_settings_widget.ui source/scwx/qt/ui/progress_dialog.ui source/scwx/qt/ui/radar_site_dialog.ui source/scwx/qt/ui/settings_dialog.ui source/scwx/qt/ui/serial_port_dialog.ui source/scwx/qt/ui/update_dialog.ui source/scwx/qt/ui/wfo_dialog.ui) set(HDR_UI_SETTINGS source/scwx/qt/ui/settings/alert_palette_settings_widget.hpp source/scwx/qt/ui/settings/hotkey_settings_widget.hpp source/scwx/qt/ui/settings/settings_page_widget.hpp source/scwx/qt/ui/settings/unit_settings_widget.hpp) set(SRC_UI_SETTINGS source/scwx/qt/ui/settings/alert_palette_settings_widget.cpp source/scwx/qt/ui/settings/hotkey_settings_widget.cpp source/scwx/qt/ui/settings/settings_page_widget.cpp source/scwx/qt/ui/settings/unit_settings_widget.cpp) set(HDR_UI_SETUP source/scwx/qt/ui/setup/audio_codec_page.hpp source/scwx/qt/ui/setup/finish_page.hpp source/scwx/qt/ui/setup/map_layout_page.hpp source/scwx/qt/ui/setup/map_provider_page.hpp source/scwx/qt/ui/setup/setup_wizard.hpp source/scwx/qt/ui/setup/welcome_page.hpp) set(SRC_UI_SETUP source/scwx/qt/ui/setup/audio_codec_page.cpp source/scwx/qt/ui/setup/finish_page.cpp source/scwx/qt/ui/setup/map_layout_page.cpp source/scwx/qt/ui/setup/map_provider_page.cpp source/scwx/qt/ui/setup/setup_wizard.cpp source/scwx/qt/ui/setup/welcome_page.cpp) set(HDR_UI_WIDGETS source/scwx/qt/ui/widgets/focused_combo_box.hpp source/scwx/qt/ui/widgets/focused_double_spin_box.hpp source/scwx/qt/ui/widgets/focused_spin_box.hpp) set(HDR_UTIL source/scwx/qt/util/color.hpp source/scwx/qt/util/file.hpp source/scwx/qt/util/geographic_lib.hpp source/scwx/qt/util/imgui.hpp source/scwx/qt/util/json.hpp source/scwx/qt/util/maplibre.hpp source/scwx/qt/util/network.hpp source/scwx/qt/util/streams.hpp source/scwx/qt/util/texture_atlas.hpp source/scwx/qt/util/q_color_modulate.hpp source/scwx/qt/util/q_file_buffer.hpp source/scwx/qt/util/q_file_input_stream.hpp source/scwx/qt/util/queue_counter.hpp source/scwx/qt/util/time.hpp source/scwx/qt/util/tooltip.hpp) set(SRC_UTIL source/scwx/qt/util/color.cpp source/scwx/qt/util/file.cpp source/scwx/qt/util/geographic_lib.cpp source/scwx/qt/util/imgui.cpp source/scwx/qt/util/json.cpp source/scwx/qt/util/maplibre.cpp source/scwx/qt/util/network.cpp source/scwx/qt/util/texture_atlas.cpp source/scwx/qt/util/q_color_modulate.cpp source/scwx/qt/util/q_file_buffer.cpp source/scwx/qt/util/q_file_input_stream.cpp source/scwx/qt/util/queue_counter.cpp source/scwx/qt/util/time.cpp source/scwx/qt/util/tooltip.cpp) set(HDR_VIEW source/scwx/qt/view/level2_product_view.hpp source/scwx/qt/view/level3_product_view.hpp source/scwx/qt/view/level3_radial_view.hpp source/scwx/qt/view/level3_raster_view.hpp source/scwx/qt/view/overlay_product_view.hpp source/scwx/qt/view/radar_product_view.hpp source/scwx/qt/view/radar_product_view_factory.hpp) set(SRC_VIEW source/scwx/qt/view/level2_product_view.cpp source/scwx/qt/view/level3_product_view.cpp source/scwx/qt/view/level3_radial_view.cpp source/scwx/qt/view/level3_raster_view.cpp source/scwx/qt/view/overlay_product_view.cpp source/scwx/qt/view/radar_product_view.cpp source/scwx/qt/view/radar_product_view_factory.cpp) set(RESOURCE_FILES scwx-qt.qrc) set(SHADER_FILES gl/color.frag gl/color.vert gl/geo_line.vert gl/geo_texture2d.vert gl/map_color.vert gl/radar.frag gl/radar.vert gl/texture1d.frag gl/texture1d.vert gl/texture2d.frag gl/texture2d_array.frag gl/texture2d_array.vert gl/threshold.geom) set(CMAKE_FILES scwx-qt.cmake) set(JSON_FILES res/config/radar_sites.json) set(TS_FILES ts/scwx_en_US.ts) set(RADAR_SITES_FILE ${scwx-qt_SOURCE_DIR}/res/config/radar_sites.json) set(COUNTY_DBF_FILES ${SCWX_DIR}/data/db/c_18mr25.dbf) set(ZONE_DBF_FILES ${SCWX_DIR}/data/db/fz18mr25.dbf ${SCWX_DIR}/data/db/mz18mr25.dbf ${SCWX_DIR}/data/db/oz18mr25.dbf ${SCWX_DIR}/data/db/z_18mr25.dbf) set(STATE_DBF_FILES ${SCWX_DIR}/data/db/s_18mr25.dbf) set(WFO_DBF_FILES ${SCWX_DIR}/data/db/w_18mr25.dbf) set(COUNTIES_SQLITE_DB ${scwx-qt_BINARY_DIR}/res/db/counties.db) set(RESOURCE_INPUT ${scwx-qt_SOURCE_DIR}/res/scwx-qt.rc.in) set(RESOURCE_OUTPUT ${scwx-qt_BINARY_DIR}/res/scwx-qt.rc) set(VERSIONS_INPUT ${scwx-qt_SOURCE_DIR}/source/scwx/qt/main/versions.hpp.in) set(VERSIONS_CACHE ${scwx-qt_BINARY_DIR}/versions_cache.json) set(VERSIONS_HEADER ${scwx-qt_BINARY_DIR}/scwx/qt/main/versions.hpp) set(PROJECT_SOURCES ${HDR_MAIN} ${SRC_MAIN} ${HDR_CONFIG} ${SRC_CONFIG} ${SRC_EXTERNAL} ${HDR_GL} ${SRC_GL} ${HDR_GL_DRAW} ${SRC_GL_DRAW} ${HDR_MANAGER} ${SRC_MANAGER} ${UI_MAIN} ${HDR_MAP} ${SRC_MAP} ${HDR_MODEL} ${SRC_MODEL} ${HDR_REQUEST} ${SRC_REQUEST} ${HDR_SETTINGS} ${SRC_SETTINGS} ${HDR_TYPES} ${SRC_TYPES} ${HDR_UI} ${SRC_UI} ${UI_UI} ${HDR_UI_SETTINGS} ${SRC_UI_SETTINGS} ${HDR_UI_SETUP} ${SRC_UI_SETUP} ${HDR_UI_WIDGETS} ${HDR_UTIL} ${SRC_UTIL} ${HDR_VIEW} ${SRC_VIEW} ${SHADER_FILES} ${JSON_FILES} ${TS_FILES} ${CMAKE_FILES}) set(EXECUTABLE_SOURCES ${SRC_EXE_MAIN}) qt_add_resources(PROJECT_SOURCES ${RESOURCE_FILES}) source_group("Header Files\\main" FILES ${HDR_MAIN}) source_group("Source Files\\main" FILES ${SRC_MAIN}) source_group("Header Files\\config" FILES ${HDR_CONFIG}) source_group("Source Files\\config" FILES ${SRC_CONFIG}) source_group("Source Files\\external" FILES ${SRC_EXTERNAL}) source_group("Header Files\\gl" FILES ${HDR_GL}) source_group("Source Files\\gl" FILES ${SRC_GL}) source_group("Header Files\\gl\\draw" FILES ${HDR_GL_DRAW}) source_group("Source Files\\gl\\draw" FILES ${SRC_GL_DRAW}) source_group("Header Files\\manager" FILES ${HDR_MANAGER}) source_group("Source Files\\manager" FILES ${SRC_MANAGER}) source_group("UI Files\\main" FILES ${UI_MAIN}) source_group("Header Files\\map" FILES ${HDR_MAP}) source_group("Source Files\\map" FILES ${SRC_MAP}) source_group("Header Files\\model" FILES ${HDR_MODEL}) source_group("Source Files\\model" FILES ${SRC_MODEL}) source_group("Header Files\\request" FILES ${HDR_REQUEST}) source_group("Source Files\\request" FILES ${SRC_REQUEST}) source_group("Header Files\\settings" FILES ${HDR_SETTINGS}) source_group("Source Files\\settings" FILES ${SRC_SETTINGS}) source_group("Header Files\\types" FILES ${HDR_TYPES}) source_group("Source Files\\types" FILES ${SRC_TYPES}) source_group("Header Files\\ui" FILES ${HDR_UI}) source_group("Source Files\\ui" FILES ${SRC_UI}) source_group("Header Files\\ui\\settings" FILES ${HDR_UI_SETTINGS}) source_group("Source Files\\ui\\settings" FILES ${SRC_UI_SETTINGS}) source_group("Header Files\\ui\\setup" FILES ${HDR_UI_SETUP}) source_group("Source Files\\ui\\setup" FILES ${SRC_UI_SETUP}) source_group("Header Files\\ui\\widgets" FILES ${HDR_UI_WIDGETS}) source_group("UI Files\\ui" FILES ${UI_UI}) source_group("Header Files\\util" FILES ${HDR_UTIL}) source_group("Source Files\\util" FILES ${SRC_UTIL}) source_group("Header Files\\view" FILES ${HDR_VIEW}) source_group("Source Files\\view" FILES ${SRC_VIEW}) source_group("OpenGL Shaders" FILES ${SHADER_FILES}) source_group("Resources" FILES ${RESOURCE_FILES}) source_group("Resources\\json" FILES ${JSON_FILES}) source_group("I18N Files" FILES ${TS_FILES}) add_library(scwx-qt OBJECT ${PROJECT_SOURCES}) set_property(TARGET scwx-qt PROPERTY AUTOMOC ON) set_property(TARGET scwx-qt PROPERTY AUTOGEN_ORIGIN_DEPENDS OFF) add_custom_command(OUTPUT ${COUNTIES_SQLITE_DB} COMMAND ${Python_EXECUTABLE} ${scwx-qt_SOURCE_DIR}/tools/generate_counties_db.py -c ${COUNTY_DBF_FILES} -z ${ZONE_DBF_FILES} -s ${STATE_DBF_FILES} -w ${WFO_DBF_FILES} -o ${COUNTIES_SQLITE_DB} DEPENDS ${scwx-qt_SOURCE_DIR}/tools/generate_counties_db.py ${COUNTY_DB_FILES} ${STATE_DBF_FILES} ${ZONE_DBF_FILES} ${WFO_DBF_FILES}) add_custom_target(scwx-qt_generate_counties_db ALL DEPENDS ${COUNTIES_SQLITE_DB}) add_dependencies(scwx-qt scwx-qt_generate_counties_db) if (DEFINED ENV{GITHUB_RUN_NUMBER}) set(SCWX_BUILD_NUM $ENV{GITHUB_RUN_NUMBER}) else() set(SCWX_BUILD_NUM 0) endif() if (WIN32) add_custom_command(OUTPUT ${VERSIONS_HEADER} ${RESOURCE_OUTPUT} ${VERSIONS_HEADER}-ALWAYS_RUN COMMAND ${Python_EXECUTABLE} ${scwx-qt_SOURCE_DIR}/tools/generate_versions.py -g ${SCWX_DIR} -v ${SCWX_VERSION} -c ${VERSIONS_CACHE} -i ${VERSIONS_INPUT} -o ${VERSIONS_HEADER} -b ${SCWX_BUILD_NUM} --input-resource ${RESOURCE_INPUT} --output-resource ${RESOURCE_OUTPUT}) else() add_custom_command(OUTPUT ${VERSIONS_HEADER} ${VERSIONS_HEADER}-ALWAYS_RUN COMMAND ${Python_EXECUTABLE} ${scwx-qt_SOURCE_DIR}/tools/generate_versions.py -g ${SCWX_DIR} -v ${SCWX_VERSION} -c ${VERSIONS_CACHE} -i ${VERSIONS_INPUT} -o ${VERSIONS_HEADER} -b ${SCWX_BUILD_NUM}) endif() add_custom_target(scwx-qt_generate_versions ALL DEPENDS ${VERSIONS_HEADER}) add_dependencies(scwx-qt scwx-qt_generate_versions) add_custom_target(scwx-qt_update_radar_sites COMMAND ${Python_EXECUTABLE} ${scwx-qt_SOURCE_DIR}/tools/update_radar_sites.py -u ${RADAR_SITES_FILE} -t -w) qt_add_resources(scwx-qt "generated" PREFIX "/" BASE ${scwx-qt_BINARY_DIR} FILES ${COUNTIES_SQLITE_DB}) qt_add_translations(scwx-qt TS_FILES ${TS_FILES} INCLUDE_DIRECTORIES true LUPDATE_OPTIONS -locations none -no-ui-lines) if (TARGET release_translations) set_target_properties(release_translations PROPERTIES FOLDER qt) endif() if (TARGET scwx-qt_lrelease) set_target_properties(scwx-qt_lrelease PROPERTIES FOLDER qt) endif() if (TARGET scwx-qt_lupdate) set_target_properties(scwx-qt_lupdate PROPERTIES FOLDER qt) endif() if (TARGET scwx-qt_other_files) set_target_properties(scwx-qt_other_files PROPERTIES FOLDER qt) endif() if (TARGET update_translations) set_target_properties(update_translations PROPERTIES FOLDER qt) endif() set_target_properties(scwx-qt_generate_counties_db PROPERTIES FOLDER generate) set_target_properties(scwx-qt_generate_versions PROPERTIES FOLDER generate) set_target_properties(scwx-qt_update_radar_sites PROPERTIES FOLDER generate) if (WIN32) set(APP_ICON_RESOURCE_WINDOWS ${RESOURCE_OUTPUT}) qt_add_executable(supercell-wx ${EXECUTABLE_SOURCES} ${APP_ICON_RESOURCE_WINDOWS}) if (SCWX_DISABLE_CONSOLE) set_target_properties(supercell-wx PROPERTIES WIN32_EXECUTABLE $,TRUE,FALSE>) endif() elseif (APPLE) set(SCWX_ICON "${scwx-qt_SOURCE_DIR}/res/icons/scwx.icns") set_source_files_properties(${SCWX_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") qt_add_executable(supercell-wx ${EXECUTABLE_SOURCES} ${SCWX_ICON}) string(TIMESTAMP CURRENT_YEAR "%Y") set_target_properties(supercell-wx PROPERTIES MACOSX_BUNDLE TRUE MACOSX_BUNDLE_INFO_PLIST "${scwx-qt_SOURCE_DIR}/res/scwx-qt.plist.in" MACOSX_BUNDLE_GUI_IDENTIFIER "net.supercellwx.app" MACOSX_BUNDLE_BUNDLE_NAME "Supercell Wx" MACOSX_BUNDLE_BUNDLE_VERSION "${SCWX_VERSION}" MACOSX_BUNDLE_SHORT_VERSION_STRING "${SCWX_VERSION}" MACOSX_BUNDLE_COPYRIGHT "Copyright ${CURRENT_YEAR} Dan Paulat" MACOSX_BUNDLE_ICON_FILE "scwx.icns" MACOSX_BUNDLE_INFO_STRING "Free and open source advanced weather radar" RESOURCE ${SCWX_ICON}) else() qt_add_executable(supercell-wx ${EXECUTABLE_SOURCES}) endif() if (WIN32) target_compile_definitions(scwx-qt PUBLIC WIN32_LEAN_AND_MEAN) target_compile_definitions(supercell-wx PUBLIC WIN32_LEAN_AND_MEAN) endif() if (LINUX) # Qt emit keyword is incompatible with TBB target_compile_definitions(scwx-qt PRIVATE QT_NO_EMIT) target_compile_definitions(supercell-wx PRIVATE QT_NO_EMIT) endif() if (APPLE) target_compile_definitions(scwx-qt PRIVATE GL_SILENCE_DEPRECATION) target_compile_definitions(supercell-wx PRIVATE GL_SILENCE_DEPRECATION) endif() target_include_directories(scwx-qt PUBLIC ${scwx-qt_SOURCE_DIR}/source ${FTGL_INCLUDE_DIR} ${IMGUI_INCLUDE_DIRS} ${MLN_INCLUDE_DIRS} ${STB_INCLUDE_DIR} ${TEXTFLOWCPP_INCLUDE_DIR}) target_include_directories(supercell-wx PUBLIC ${scwx-qt_SOURCE_DIR}/source) target_compile_options(scwx-qt PRIVATE $<$:/W4 /WX> $<$>:-Wall -Wextra -Wpedantic -Werror> ) target_compile_options(supercell-wx PRIVATE $<$:/W4 /WX> $<$>:-Wall -Wextra -Wpedantic -Werror> ) if (MSVC) # Don't include Windows macros target_compile_options(scwx-qt PRIVATE -DNOMINMAX) target_compile_options(supercell-wx PRIVATE -DNOMINMAX) # Enable multi-processor compilation target_compile_options(scwx-qt PRIVATE "/MP") target_compile_options(supercell-wx PRIVATE "/MP") endif() # Address Sanitizer options if (SCWX_ADDRESS_SANITIZER) target_compile_options(scwx-qt PRIVATE $<$:/fsanitize=address /EHsc /D_DISABLE_STRING_ANNOTATION /D_DISABLE_VECTOR_ANNOTATION> $<$>:-fsanitize=address -fsanitize-recover=address> ) target_compile_options(supercell-wx PRIVATE $<$:/fsanitize=address /EHsc /D_DISABLE_STRING_ANNOTATION /D_DISABLE_VECTOR_ANNOTATION> $<$>:-fsanitize=address -fsanitize-recover=address> ) target_link_options(supercell-wx PRIVATE $<$>:-fsanitize=address> ) endif() if (MSVC) # Produce PDB file for debug target_compile_options(scwx-qt PRIVATE "$<$:/Zi>") target_compile_options(supercell-wx PRIVATE "$<$:/Zi>") target_link_options(supercell-wx PRIVATE "$<$:/DEBUG>") target_link_options(supercell-wx PRIVATE "$<$:/OPT:REF>") target_link_options(supercell-wx PRIVATE "$<$:/OPT:ICF>") else() target_compile_options(scwx-qt PRIVATE "$<$:-g>") target_compile_options(supercell-wx PRIVATE "$<$:-g>") endif() if (LINUX) # Add wayland client packages find_package(QT NAMES Qt6 COMPONENTS WaylandClient REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS WaylandClient REQUIRED) target_link_libraries(scwx-qt PUBLIC Qt${QT_VERSION_MAJOR}::WaylandClient) endif() if (LINUX) find_package(mesa-glu REQUIRED) target_link_libraries(scwx-qt PUBLIC mesa-glu::mesa-glu) else() target_link_libraries(scwx-qt PUBLIC OpenGL::GLU) endif() target_link_libraries(scwx-qt PUBLIC Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::OpenGLWidgets Qt${QT_VERSION_MAJOR}::Multimedia Qt${QT_VERSION_MAJOR}::Positioning Qt${QT_VERSION_MAJOR}::SerialPort Qt${QT_VERSION_MAJOR}::Svg Boost::json Boost::timer Boost::atomic QMapLibre::Core $<$:opengl32> $<$:SetupAPI> Fontconfig::Fontconfig GeographicLib::GeographicLib GEOS::geos GEOS::geos_cxx_flags glad_gl_core_33 glm::glm imgui qt6ct-common qt6ct-widgets SQLite::SQLite3 wxdata) target_link_libraries(supercell-wx PRIVATE scwx-qt wxdata) if (LINUX) # Set DT_RUNPATH for Linux targets set_target_properties(MLNQtCore PROPERTIES INSTALL_RPATH "\$ORIGIN/../lib") # QMapLibre::Core set_target_properties(supercell-wx PROPERTIES INSTALL_RPATH "\$ORIGIN/../lib") endif() install(TARGETS supercell-wx MLNQtCore # QMapLibre::Core RUNTIME_DEPENDENCIES PRE_EXCLUDE_REGEXES "api-ms-" "ext-ms-" "qt6" POST_EXCLUDE_REGEXES ".*system32/.*\\.dll" "^(/usr)?/lib/.*\\.so(\\..*)?" RUNTIME COMPONENT supercell-wx BUNDLE DESTINATION . COMPONENT supercell-wx OPTIONAL LIBRARY COMPONENT supercell-wx OPTIONAL FRAMEWORK DESTINATION Frameworks COMPONENT supercell-wx OPTIONAL) # NO_TRANSLATIONS is needed for Qt 6.5.0 (will be fixed in 6.5.1) # https://bugreports.qt.io/browse/QTBUG-112204 qt_generate_deploy_app_script(TARGET MLNQtCore # QMapLibre::Core OUTPUT_SCRIPT deploy_script_qmaplibre_core NO_TRANSLATIONS NO_UNSUPPORTED_PLATFORM_ERROR) qt_generate_deploy_app_script(TARGET supercell-wx OUTPUT_SCRIPT deploy_script_scwx NO_TRANSLATIONS NO_UNSUPPORTED_PLATFORM_ERROR) install(SCRIPT ${deploy_script_qmaplibre_core} COMPONENT supercell-wx) install(SCRIPT ${deploy_script_scwx} COMPONENT supercell-wx) if (APPLE) # Install additional script to fix up the bundle install(CODE [[ include (BundleUtilities) # Define the bundle path set(BUNDLE_PATH "${CMAKE_INSTALL_PREFIX}/supercell-wx.app") file(GLOB_RECURSE PLUGIN_DYLIBS "${BUNDLE_PATH}/Contents/PlugIns/**/*.dylib") # Add the correct rpath for plugins to find bundled frameworks foreach(PLUGIN_DYLIB ${PLUGIN_DYLIBS}) execute_process( COMMAND install_name_tool -add_rpath "@loader_path/../../Frameworks" ${PLUGIN_DYLIB} ) endforeach() # Fix up the bundle with all dependencies fixup_bundle( "${BUNDLE_PATH}" "" "${CMAKE_INSTALL_PREFIX}/lib;${CMAKE_INSTALL_PREFIX}/Frameworks" ) # Re-sign the bundle execute_process( COMMAND codesign --force --deep --sign - "${BUNDLE_PATH}" ) # Verify the bundle verify_app("${BUNDLE_PATH}") # Rename to "Supercell Wx.app" file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/Supercell Wx.app") file(RENAME "${BUNDLE_PATH}" "${CMAKE_INSTALL_PREFIX}/Supercell Wx.app") # Remove extra directories file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/Frameworks") file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/lib") ]] COMPONENT supercell-wx) endif() set(CPACK_PACKAGE_NAME "Supercell Wx") set(CPACK_PACKAGE_VENDOR "Dan Paulat") set(CPACK_PACKAGE_CHECKSUM SHA256) set(CPACK_RESOURCE_FILE_LICENSE "${SCWX_DIR}/LICENSE.txt") if (MSVC) set(CPACK_PACKAGE_FILE_NAME "supercell-wx-v${SCWX_VERSION}-windows-x64") set(CPACK_PACKAGE_INSTALL_DIRECTORY "Supercell Wx") set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/res/icons/scwx-256.ico") set(CPACK_GENERATOR WIX) set(CPACK_PACKAGE_EXECUTABLES "supercell-wx;Supercell Wx") set(CPACK_WIX_UPGRADE_GUID 36AD0F51-4D4F-4B5D-AB61-94C6B4E4FE1C) set(CPACK_WIX_UI_BANNER "${CMAKE_CURRENT_SOURCE_DIR}/res/images/scwx-banner.png") set(CPACK_WIX_UI_DIALOG "${CMAKE_CURRENT_SOURCE_DIR}/res/images/scwx-dialog.png") set(CPACK_WIX_TEMPLATE "${CMAKE_CURRENT_SOURCE_DIR}/wix.template.in") set(CPACK_WIX_EXTENSIONS WixUIExtension WiXUtilExtension) set(CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_CURRENT_BINARY_DIR};${CMAKE_PROJECT_NAME};supercell-wx;/") include(CPack) elseif(APPLE) set(CPACK_PACKAGE_FILE_NAME "supercell-wx-v${SCWX_VERSION}-macos") set(CPACK_PACKAGE_ICON "${SCWX_ICON}") set(CPACK_PACKAGE_VERSION "${SCWX_VERSION}") set(CPACK_GENERATOR DragNDrop) set(CPACK_COMPONENTS_ALL supercell-wx) include(CPack) endif()