diff --git a/main.cmake b/main.cmake index 88e81a3..57d7000 100644 --- a/main.cmake +++ b/main.cmake @@ -30,29 +30,28 @@ target_include_directories(mlat_source PUBLIC "${md}") target_link_libraries(mlat_source PUBLIC ${Core}) append_glob_source(ecap_server_srcs "${md}/Local_Server") add_executable(ecap_server "${md}/Local_Server_main.cpp" ${ecap_server_srcs}) -if (WIN32) - set(ecap_default_dsp_library_path "@/dll_source.dll") - set(ecap_default_webapp_path "@/../third_party/eacp_webapp/wwwroot") - set(ecap_default_tile_directory "C:/tiles") - set(ecap_default_file_source 1) - set(ecap_default_file_source_path "D:/ae/proj/projects/ECAP_Server/data/BIN_Blank_Text/ADS-B_195_0205.txt") - set(ecap_default_sqlite_path "@/../data/sqlite/ecap.sqlite") -else () - set(ecap_default_dsp_library_path "@/lib9002/lib9002.so") - set(ecap_default_webapp_path "@/wwwroot") - set(ecap_default_tile_directory "/home/heco/tiles") - set(ecap_default_file_source 0) - set(ecap_default_file_source_path "") - set(ecap_default_sqlite_path "@/../ecap.sqlite") -endif () -target_compile_definitions(ecap_server PRIVATE - ECAP_DEFAULT_DSP_LIBRARY_PATH="${ecap_default_dsp_library_path}" - ECAP_DEFAULT_WEBAPP_PATH="${ecap_default_webapp_path}" - ECAP_DEFAULT_TILE_DIRECTORY="${ecap_default_tile_directory}" - ECAP_DEFAULT_FILE_SOURCE=${ecap_default_file_source} - ECAP_DEFAULT_FILE_SOURCE_PATH="${ecap_default_file_source_path}" - ECAP_DEFAULT_SQLITE_PATH="${ecap_default_sqlite_path}" +set(ecap_version "v1.0.5") +set(ecap_build_version_header "${CMAKE_CURRENT_BINARY_DIR}/generated/ecap_server/Build_Version.h") +set(ecap_build_version_source "${CMAKE_CURRENT_BINARY_DIR}/generated/ecap_server/Build_Version.cpp") +add_custom_target(ecap_server_build_version + COMMAND ${CMAKE_COMMAND} + -DOUTPUT_HEADER=${ecap_build_version_header} + -DOUTPUT_SOURCE=${ecap_build_version_source} + -DVERSION=${ecap_version} + -P ${CMAKE_CURRENT_LIST_DIR}/toolchain/Generate_Build_Version.cmake + BYPRODUCTS ${ecap_build_version_header} ${ecap_build_version_source} + VERBATIM ) +add_dependencies(ecap_server ecap_server_build_version) +set_source_files_properties(${ecap_build_version_source} PROPERTIES GENERATED TRUE) +target_sources(ecap_server PRIVATE ${ecap_build_version_source}) +if (WIN32) + target_compile_definitions(ecap_server PRIVATE ECAP_TARGET_WINDOWS) +elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux") + target_compile_definitions(ecap_server PRIVATE ECAP_TARGET_LINUX) +else () + message(FATAL_ERROR "Unsupported ecap_server target platform: ${CMAKE_SYSTEM_NAME}") +endif () target_include_directories(ecap_server PUBLIC "${md}") target_include_directories(ecap_server PRIVATE "${CMAKE_CURRENT_LIST_DIR}/third_party/Adminive/backend/library/include" diff --git a/module/Local_Server/Build_Version_Api.h b/module/Local_Server/Build_Version_Api.h new file mode 100644 index 0000000..77b7812 --- /dev/null +++ b/module/Local_Server/Build_Version_Api.h @@ -0,0 +1,3 @@ +#pragma once +#include +std::string_view get_ecap_build_version(); diff --git a/module/Local_Server/server/Config.cpp b/module/Local_Server/server/Config.cpp index 54391c0..91cb7b4 100644 --- a/module/Local_Server/server/Config.cpp +++ b/module/Local_Server/server/Config.cpp @@ -95,8 +95,6 @@ void assign_config_section(Config_Section section, Function&& function) { } Psc::JSON config_section_value(Global& global, Config_Section section) { switch (section) { - case Config_Section::version: - return Psc::JSON(global.version); case Config_Section::dsp: return global.dsp_config.to_base_json(); case Config_Section::drogon: @@ -236,10 +234,13 @@ void Mode_ACS_Config::from_json(const Psc::JSON* that_json) { migrate_legacy_source_feed_relations(that_json, data_source_config, data_feed_config); data_topology_view.write([&](auto& value) { value.from_json(that_json->get("data_topology_view")); }); } +Config::Config() : version(get_ecap_build_version()) { +} void Config::create_missing_config_files() { std::filesystem::create_directories(config_directory()); std::error_code ignored_error; std::filesystem::remove(config_directory() / "device.json", ignored_error); + std::filesystem::remove(config_directory() / "version.json", ignored_error); for (std::size_t index = 0; index < static_cast(Config_Section::count); ++index) { const auto section = static_cast(index); if (std::filesystem::exists(config_section_path(section))) @@ -270,7 +271,6 @@ void Config::from_log_json(const Psc::JSON* that_json) { assign_config_section(Config_Section::log, [&] { log_config.from_base_json(that_json); }); } void Config::from_base_json(Psc::JSON* that_json) { - assign_config_section(Config_Section::version, [&] { Get_J(version) }); assign_config_section(Config_Section::mlat, [&] { mlat.from_json(that_json->get("mlat")); }); assign_config_section(Config_Section::web_server, [&] { web_server_config.from_base_json(that_json->get("web_server")); }); diff --git a/module/Local_Server/server/Config.h b/module/Local_Server/server/Config.h index df97a90..6001a2d 100644 --- a/module/Local_Server/server/Config.h +++ b/module/Local_Server/server/Config.h @@ -5,6 +5,7 @@ #include #include #include +#include "../Build_Version_Api.h" #include "../DSP/export.h" #include "../Data_Feed/export.h" #include "../Data_Source/export.h" @@ -15,7 +16,6 @@ inline bool delete_log = false; extern std::string default_config_directory; #define ECAP_CONFIG_SECTION_LIST(X) \ - X(version) \ X(dsp) \ X(drogon) \ X(http_monitor) \ @@ -488,7 +488,7 @@ struct Type_Descriptor { } class Config { public: - Config() = default; + Config(); DELETE_COPY(Config) MLAT_Config mlat; Web_Server_Config web_server_config; diff --git a/module/Local_Server/server/Config_Default/Config_Default.cpp b/module/Local_Server/server/Config_Default/Config_Default.cpp index a972ffe..3b478dd 100644 --- a/module/Local_Server/server/Config_Default/Config_Default.cpp +++ b/module/Local_Server/server/Config_Default/Config_Default.cpp @@ -1,8 +1,6 @@ #include "Config_Default.h" Default_Config_File make_default_config_file(Config_Section section, const std::filesystem::path& directory) { switch (section) { - case Config_Section::version: - return make_default_version_config(directory); case Config_Section::dsp: return make_default_dsp_config(directory); case Config_Section::drogon: diff --git a/module/Local_Server/server/Config_Default/Config_Default.h b/module/Local_Server/server/Config_Default/Config_Default.h index 34a7649..62b1fe0 100644 --- a/module/Local_Server/server/Config_Default/Config_Default.h +++ b/module/Local_Server/server/Config_Default/Config_Default.h @@ -7,7 +7,6 @@ struct Default_Config_File { Psc::JSON value; }; Default_Config_File make_default_config_file(Config_Section section, const std::filesystem::path& directory); -Default_Config_File make_default_version_config(const std::filesystem::path& directory); Default_Config_File make_default_dsp_config(const std::filesystem::path& directory); Default_Config_File make_default_drogon_config(const std::filesystem::path& directory); Default_Config_File make_default_http_monitor_config(const std::filesystem::path& directory); diff --git a/module/Local_Server/server/Config_Default/Target_Defaults.h b/module/Local_Server/server/Config_Default/Target_Defaults.h new file mode 100644 index 0000000..fbf7918 --- /dev/null +++ b/module/Local_Server/server/Config_Default/Target_Defaults.h @@ -0,0 +1,18 @@ +#pragma once +#include +namespace config_default { +#if defined(ECAP_TARGET_WINDOWS) +inline constexpr std::string_view dsp_library_path = "@/dll_source.dll"; +inline constexpr std::string_view webapp_path = "@/../third_party/eacp_webapp/wwwroot"; +inline constexpr std::string_view tile_directory = "C:/tiles"; +inline constexpr std::string_view file_source_path = "D:/ae/proj/projects/ECAP_Server/data/BIN_Blank_Text/ADS-B_195_0205.txt"; +inline constexpr std::string_view sqlite_path = "@/../data/sqlite/ecap.sqlite"; +#elif defined(ECAP_TARGET_LINUX) +inline constexpr std::string_view dsp_library_path = "@/lib9002/lib9002.so"; +inline constexpr std::string_view webapp_path = "@/wwwroot"; +inline constexpr std::string_view tile_directory = "/home/heco/tiles"; +inline constexpr std::string_view sqlite_path = "@/../ecap.sqlite"; +#else +#error Unsupported ecap_server target platform +#endif +} diff --git a/module/Local_Server/server/Config_Default/dsp.cpp b/module/Local_Server/server/Config_Default/dsp.cpp index 0e34d4c..d9ffcc6 100644 --- a/module/Local_Server/server/Config_Default/dsp.cpp +++ b/module/Local_Server/server/Config_Default/dsp.cpp @@ -1,7 +1,8 @@ #include "Config_Default.h" +#include "Target_Defaults.h" Default_Config_File make_default_dsp_config(const std::filesystem::path& directory) { DSP_Config config; - config.library_path = ECAP_DEFAULT_DSP_LIBRARY_PATH; + config.library_path = config_default::dsp_library_path; config.center_freq = 16000000; config.band_width = 6000; config.sample_rate = 60000; diff --git a/module/Local_Server/server/Config_Default/external_database.cpp b/module/Local_Server/server/Config_Default/external_database.cpp index 0a7e984..be34d2b 100644 --- a/module/Local_Server/server/Config_Default/external_database.cpp +++ b/module/Local_Server/server/Config_Default/external_database.cpp @@ -1,4 +1,5 @@ #include "Config_Default.h" +#include "Target_Defaults.h" namespace { Psc::JSON make_resource(std::string name, std::string download_url, std::string description, std::uint64_t update_interval_seconds, std::time_t last_updated_at) { @@ -10,10 +11,10 @@ Psc::JSON make_resource(std::string name, std::string download_url, std::string resource.last_updated_at = last_updated_at; return resource.to_base_json(); } -} // namespace +} Default_Config_File make_default_external_database_config(const std::filesystem::path& directory) { External_Resources_Manager config; - config.ecap_sqlite_path = ECAP_DEFAULT_SQLITE_PATH; + config.ecap_sqlite_path = config_default::sqlite_path; auto value = Psc::JSON::object(); value.append({"ecap_sqlite_path", config.ecap_sqlite_path}); auto resources = Psc::JSON::array(); diff --git a/module/Local_Server/server/Config_Default/map_resources.cpp b/module/Local_Server/server/Config_Default/map_resources.cpp index 36ddd7e..756ea88 100644 --- a/module/Local_Server/server/Config_Default/map_resources.cpp +++ b/module/Local_Server/server/Config_Default/map_resources.cpp @@ -1,4 +1,5 @@ #include "Config_Default.h" +#include "Target_Defaults.h" namespace { Map_Tile_Source_Config make_local_tile_source(std::string key, std::string name, Map_Tile_Type tile_type, std::vector files, @@ -28,11 +29,11 @@ Map_Tile_Source_Config make_online_tile_source(std::string key, std::string name source.resource.maximum_level = maximum_level; return source; } -} // namespace +} Default_Config_File make_default_map_resources_config(const std::filesystem::path& directory) { Map_Resources_Config config; config.current_imagery_key = "mixed_imagery"; - const auto tile_directory = std::string(ECAP_DEFAULT_TILE_DIRECTORY); + const auto tile_directory = std::string(config_default::tile_directory); config.tile_sources = { make_local_tile_source("mixed_imagery", "本地混合图", Map_Tile_Type::imagery, {tile_directory + "/混合图-世界-0-8.mbtiles", tile_directory + "/混合图-中国-9-10.mbtiles", diff --git a/module/Local_Server/server/Config_Default/mode_acs.cpp b/module/Local_Server/server/Config_Default/mode_acs.cpp index b5120bb..b9383a1 100644 --- a/module/Local_Server/server/Config_Default/mode_acs.cpp +++ b/module/Local_Server/server/Config_Default/mode_acs.cpp @@ -1,4 +1,5 @@ #include "Config_Default.h" +#include "Target_Defaults.h" namespace { void configure_source_display(Data_Source_Map_Display_Data& display, std::string color, std::uint32_t aircraft_pixel_size, std::uint32_t base_station_pixel_size, @@ -25,14 +26,14 @@ std::shared_ptr make_dll_source() { value.ignore_msg_time = true; }); source->specific.write([](auto& value) { - value.library_path = ECAP_DEFAULT_DSP_LIBRARY_PATH; + value.library_path = config_default::dsp_library_path; value.function_name = "adsb_read"; value.data_type = File_Data_Type::BIN_Blank_Text; value.buffer_size = 200000; }); return source; } -#if ECAP_DEFAULT_FILE_SOURCE +#if defined(ECAP_TARGET_WINDOWS) std::shared_ptr make_file_source() { auto source = std::make_shared(); source->key = "aaaa"; @@ -46,7 +47,7 @@ std::shared_ptr make_file_source() { value.ignore_msg_time = true; }); source->specific.write([](auto& value) { - value.file_path = ECAP_DEFAULT_FILE_SOURCE_PATH; + value.file_path = config_default::file_source_path; value.data_type = File_Data_Type::BIN_Blank_Text; value.play_mode = Play_Mode::loop; }); @@ -82,7 +83,7 @@ std::shared_ptr make_tcp_server_feed(std::string key, bool }); return feed; } -} // namespace +} Default_Config_File make_default_mode_acs_config(const std::filesystem::path& directory) { Mode_ACS_Config config; config.settings.write([](auto& value) { @@ -98,7 +99,7 @@ Default_Config_File make_default_mode_acs_config(const std::filesystem::path& di value.default_min_aircraft_list_num = 10; }); config.data_source_config.map.push_back(make_dll_source()); -#if ECAP_DEFAULT_FILE_SOURCE +#if defined(ECAP_TARGET_WINDOWS) config.data_source_config.map.push_back(make_file_source()); #endif config.data_feed_config.map.push_back(make_tcp_server_feed("Port_10003", true, Output_Data_Format::BIN, true, diff --git a/module/Local_Server/server/Config_Default/version.cpp b/module/Local_Server/server/Config_Default/version.cpp deleted file mode 100644 index 79ccd3d..0000000 --- a/module/Local_Server/server/Config_Default/version.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "Config_Default.h" -Default_Config_File make_default_version_config(const std::filesystem::path& directory) { - return {Config_Section::version, directory / "version.json", Psc::JSON("v1.0.5")}; -} diff --git a/module/Local_Server/server/Config_Default/web_server.cpp b/module/Local_Server/server/Config_Default/web_server.cpp index d04c6c5..8904509 100644 --- a/module/Local_Server/server/Config_Default/web_server.cpp +++ b/module/Local_Server/server/Config_Default/web_server.cpp @@ -1,7 +1,8 @@ #include "Config_Default.h" +#include "Target_Defaults.h" Default_Config_File make_default_web_server_config(const std::filesystem::path& directory) { Web_Server_Config config; - config.webapp = ECAP_DEFAULT_WEBAPP_PATH; + config.webapp = config_default::webapp_path; config.listen_port = 9081; return {Config_Section::web_server, directory / "web_server.json", config.to_base_json()}; } diff --git a/module/Local_Server/server/Global.cpp b/module/Local_Server/server/Global.cpp index 067b4bd..4066e90 100644 --- a/module/Local_Server/server/Global.cpp +++ b/module/Local_Server/server/Global.cpp @@ -52,7 +52,7 @@ void Global::handle_old_logs() { std::cerr << "Error: " + Psc::platform_2_utf8(ex.what()) + "\n"; } } -Global::Global() { +Global::Global() : Config() { auto j = load(); from_log_json(j.get("log")); handle_old_logs(); diff --git a/toolchain/Generate_Build_Version.cmake b/toolchain/Generate_Build_Version.cmake new file mode 100644 index 0000000..a4c93a8 --- /dev/null +++ b/toolchain/Generate_Build_Version.cmake @@ -0,0 +1,11 @@ +if (NOT DEFINED OUTPUT_HEADER OR NOT DEFINED OUTPUT_SOURCE OR NOT DEFINED VERSION) + message(FATAL_ERROR "OUTPUT_HEADER, OUTPUT_SOURCE and VERSION are required") +endif () +#string(TIMESTAMP build_time "%Y%m%dT%H%M%SZ" UTC) + +string(TIMESTAMP build_time "%Y-%m-%d %H:%M:%S") + +get_filename_component(output_directory "${OUTPUT_SOURCE}" DIRECTORY) +file(MAKE_DIRECTORY "${output_directory}") +file(WRITE "${OUTPUT_HEADER}" "#pragma once\ninline constexpr char ecap_build_version[] = \"${VERSION} 【${build_time}】\";\n") +file(WRITE "${OUTPUT_SOURCE}" "#include \"Build_Version.h\"\n#include \"Local_Server/Build_Version_Api.h\"\nstd::string_view get_ecap_build_version() {\n return ecap_build_version;\n}\n")