From 4d276c7ef0a1f04c3efddab7c10bca1e8ee820c2 Mon Sep 17 00:00:00 2001 From: Roman Gershman Date: Mon, 30 May 2022 08:49:16 +0300 Subject: [PATCH] Integrate version metadata into build. Fixes #46. --- CMakeLists.txt | 21 ++---------------- src/.gitignore | 1 + src/CMakeLists.txt | 44 +++++++++++++++++++++++++++++++++++++ src/server/CMakeLists.txt | 2 +- src/server/dfly_main.cc | 14 +++++++++++- src/server/main_service.cc | 24 ++++++++++---------- src/server/server_family.cc | 3 ++- src/server/version.cc.in | 16 ++++++++++++++ src/server/version.h | 14 ++++++++++++ tools/release.sh | 4 +++- 10 files changed, 109 insertions(+), 34 deletions(-) create mode 100644 src/.gitignore create mode 100644 src/server/version.cc.in create mode 100644 src/server/version.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d7dae4..23aafce 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,27 +16,10 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/helio/cmake" ${CMAKE_MODULE_P option(BUILD_SHARED_LIBS "Build shared libraries" OFF) include(third_party) +message(STATUS "after thirdpary") + include(internal) -add_third_party( - lua - URL https://github.com/lua/lua/archive/refs/tags/v5.4.4.tar.gz - PATCH_COMMAND patch -p1 -i "${CMAKE_CURRENT_SOURCE_DIR}/patches/lua-v5.4.4.patch" - CONFIGURE_COMMAND echo - BUILD_IN_SOURCE 1 - INSTALL_COMMAND cp /liblua.a ${THIRD_PARTY_LIB_DIR}/lua/lib/ - COMMAND cp /lualib.h /lua.h /lauxlib.h - /luaconf.h ${THIRD_PARTY_LIB_DIR}/lua/include -) - -add_third_party( - dconv - URL https://github.com/google/double-conversion/archive/refs/tags/v3.2.0.tar.gz - LIB libdouble-conversion.a -) - -Message(STATUS "THIRD_PARTY_LIB_DIR ${THIRD_PARTY_LIB_DIR}") - include_directories(src) include_directories(helio) diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..e3da818 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1 @@ +server/version.cc \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f62214c..6fae716 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,3 +1,47 @@ +add_third_party( + lua + URL https://github.com/lua/lua/archive/refs/tags/v5.4.4.tar.gz + PATCH_COMMAND patch -p1 -i "${CMAKE_SOURCE_DIR}/patches/lua-v5.4.4.patch" + CONFIGURE_COMMAND echo + BUILD_IN_SOURCE 1 + INSTALL_COMMAND cp /liblua.a ${THIRD_PARTY_LIB_DIR}/lua/lib/ + COMMAND cp /lualib.h /lua.h /lauxlib.h + /luaconf.h ${THIRD_PARTY_LIB_DIR}/lua/include +) + +add_third_party( + dconv + URL https://github.com/google/double-conversion/archive/refs/tags/v3.2.0.tar.gz + LIB libdouble-conversion.a +) + +Message(STATUS "THIRD_PARTY_LIB_DIR ${THIRD_PARTY_LIB_DIR}") + + +option(ENABLE_GIT_VERSION "Build with Git metadata" OFF) + +if(ENABLE_GIT_VERSION) + MESSAGE(FATAL_ERROR "foobar") + include(GetGitRevisionDescription) + get_git_head_revision(GIT_REFSPEC GIT_SHA1) + git_local_changes(GIT_CLEAN_DIRTY) + if("${GIT_CLEAN_DIRTY}" STREQUAL "DIRTY") + set(GIT_CLEAN_DIRTY "-dirty") + else() + set(GIT_CLEAN_DIRTY "") + endif() + git_describe(GIT_VER --always) + string(TIMESTAMP PRJ_BUILD_TIME "%Y-%m-%d %H:%M:%S" UTC) +else(ENABLE_GIT_VERSION) + set(GIT_VER "dev") + set(GIT_SHA1 "0000000") + set(GIT_CLEAN_DIRTY "-dev") + set(PRJ_BUILD_TIME "bigbang") +endif(ENABLE_GIT_VERSION) + +# the output file resides in the build directory. +configure_file(server/version.cc.in "${CMAKE_CURRENT_SOURCE_DIR}/server/version.cc" @ONLY) + add_subdirectory(redis) add_subdirectory(core) add_subdirectory(facade) diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 48aa902..177c210 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -8,7 +8,7 @@ add_library(dragonfly_lib blocking_controller.cc channel_slice.cc command_regist list_family.cc main_service.cc rdb_load.cc rdb_save.cc replica.cc snapshot.cc script_mgr.cc server_family.cc set_family.cc string_family.cc table.cc tiered_storage.cc - transaction.cc zset_family.cc) + transaction.cc zset_family.cc version.cc) cxx_link(dragonfly_lib dfly_core dfly_facade redis_lib strings_lib) diff --git a/src/server/dfly_main.cc b/src/server/dfly_main.cc index c703857..267cef9 100644 --- a/src/server/dfly_main.cc +++ b/src/server/dfly_main.cc @@ -18,6 +18,7 @@ #include "facade/dragonfly_listener.h" #include "io/proc_reader.h" #include "server/main_service.h" +#include "server/version.h" #include "strings/human_readable.h" #include "util/accept_server.h" #include "util/uring/uring_pool.h" @@ -133,12 +134,23 @@ bool RunEngine(ProactorPool* pool, AcceptServer* acceptor) { extern "C" void _mi_options_init(); +using namespace dfly; + int main(int argc, char* argv[]) { - absl::SetProgramUsageMessage("dragonfly [FLAGS]"); + absl::SetProgramUsageMessage( + R"(a modern in-memory store. + +Usage: dragonfly [FLAGS] +)"); + absl::FlagsUsageConfig config; config.contains_help_flags = dfly::HelpFlags; config.contains_helpshort_flags = dfly::HelpshortFlags; config.normalize_filename = dfly::NormalizePaths; + config.version_string = [] { + return StrCat("dragonfly ", ColoredStr(TermColor::kGreen, dfly::kGitTag), + "\nbuild time: ", dfly::kBuildTime, "\n"); + }; absl::SetFlagsUsageConfig(config); diff --git a/src/server/main_service.cc b/src/server/main_service.cc index 47c17ff..20611bd 100644 --- a/src/server/main_service.cc +++ b/src/server/main_service.cc @@ -30,6 +30,7 @@ extern "C" { #include "server/set_family.h" #include "server/string_family.h" #include "server/transaction.h" +#include "server/version.h" #include "server/zset_family.h" #include "util/metrics/metrics.h" #include "util/uring/uring_fiber_algo.h" @@ -43,11 +44,11 @@ using namespace std; ABSL_FLAG(uint32_t, port, 6379, "Redis port"); ABSL_FLAG(uint32_t, memcache_port, 0, "Memcached port"); ABSL_FLAG(uint64_t, maxmemory, 0, - "Limit on maximum-memory that is used by the database." - "0 - means the program will automatically determine its maximum memory usage"); + "Limit on maximum-memory that is used by the database." + "0 - means the program will automatically determine its maximum memory usage"); ABSL_FLAG(bool, cache_mode, false, - "If true, the backend behaves like a cache, " - "by evicting entries when getting close to maxmemory limit"); + "If true, the backend behaves like a cache, " + "by evicting entries when getting close to maxmemory limit"); ABSL_DECLARE_FLAG(string, requirepass); @@ -58,9 +59,10 @@ using base::VarzValue; using ::boost::intrusive_ptr; namespace fibers = ::boost::fibers; namespace this_fiber = ::boost::this_fiber; +using absl::GetFlag; +using absl::StrCat; using facade::MCReplyBuilder; using facade::RedisReplyBuilder; -using absl::GetFlag; namespace { @@ -382,7 +384,7 @@ void Service::DispatchCommand(CmdArgList args, facade::ConnectionContext* cntx) absl::Cleanup multi_error([dfly_cntx] { MultiSetError(dfly_cntx); }); if (cid == nullptr) { - (*cntx)->SendError(absl::StrCat("unknown command `", cmd_str, "`"), "unknown_cmd"); + (*cntx)->SendError(StrCat("unknown command `", cmd_str, "`"), "unknown_cmd"); lock_guard lk(mu_); if (unknown_cmds_.size() < 1024) @@ -391,7 +393,7 @@ void Service::DispatchCommand(CmdArgList args, facade::ConnectionContext* cntx) } if (etl.gstate() == GlobalState::LOADING || etl.gstate() == GlobalState::SHUTTING_DOWN) { - string err = absl::StrCat("Can not execute during ", GlobalStateName(etl.gstate())); + string err = StrCat("Can not execute during ", GlobalStateName(etl.gstate())); (*cntx)->SendError(err); return; } @@ -568,7 +570,7 @@ void Service::DispatchMC(const MemcacheParser::Command& cmd, std::string_view va server_family_.StatsMC(cmd.key, cntx); return; case MemcacheParser::VERSION: - mc_builder->SendSimpleString(absl::StrCat("VERSION ", "TBD")); + mc_builder->SendSimpleString(StrCat("VERSION ", kGitTag)); return; default: mc_builder->SendClientError("bad command line format"); @@ -812,7 +814,7 @@ void Service::EvalInternal(const EvalArgs& eval_args, Interpreter* interpreter, cntx->transaction->UnlockMulti(); if (result == Interpreter::RUN_ERR) { - string resp = absl::StrCat("Error running script (call to ", eval_args.sha, "): ", error); + string resp = StrCat("Error running script (call to ", eval_args.sha, "): ", error); return (*cntx)->SendError(resp, facade::kScriptErrType); } @@ -967,7 +969,7 @@ void Service::Function(CmdArgList args, ConnectionContext* cntx) { return (*cntx)->SendOk(); } - string err = absl::StrCat("Unknown subcommand '", sub_cmd, "'. Try FUNCTION HELP."); + string err = StrCat("Unknown subcommand '", sub_cmd, "'. Try FUNCTION HELP."); return (*cntx)->SendError(err, kSyntaxErr); } @@ -1037,7 +1039,7 @@ void Service::RegisterCommands() { if (cid.last_key_pos() < 0) key_len = "unlimited"; else - key_len = absl::StrCat(cid.last_key_pos() - cid.first_key_pos() + 1); + key_len = StrCat(cid.last_key_pos() - cid.first_key_pos() + 1); LOG(INFO) << " " << key << ": with " << key_len << " keys"; } }); diff --git a/src/server/server_family.cc b/src/server/server_family.cc index 93b843b..0347b93 100644 --- a/src/server/server_family.cc +++ b/src/server/server_family.cc @@ -33,6 +33,7 @@ extern "C" { #include "server/replica.h" #include "server/script_mgr.h" #include "server/server_state.h" +#include "server/version.h" #include "server/tiered_storage.h" #include "server/transaction.h" #include "strings/human_readable.h" @@ -290,7 +291,7 @@ void ServerFamily::StatsMC(std::string_view section, facade::ConnectionContext* ADD_LINE(pid, getpid()); ADD_LINE(uptime, uptime); ADD_LINE(time, now); - ADD_LINE(version, "1.6.12"); + ADD_LINE(version, kGitTag); ADD_LINE(libevent, "iouring"); ADD_LINE(pointer_size, sizeof(void*)); ADD_LINE(rusage_user, utime); diff --git a/src/server/version.cc.in b/src/server/version.cc.in new file mode 100644 index 0000000..d090924 --- /dev/null +++ b/src/server/version.cc.in @@ -0,0 +1,16 @@ +// Copyright 2022, Roman Gershman. All rights reserved. +// See LICENSE for licensing terms. +// + +#include "version.h" + +namespace dfly { + +// Do not edit - autogenerated file. Please see version.cc.in for details. + +const char kGitTag[] = "@GIT_VER@"; +const char kGitSha[] = "@GIT_SHA1@"; +const char kGitClean[] = "@GIT_CLEAN_DIRTY@"; +const char kBuildTime[] = "@PRJ_BUILD_TIME@"; + +} // namespace dfly diff --git a/src/server/version.h b/src/server/version.h new file mode 100644 index 0000000..38bbf1a --- /dev/null +++ b/src/server/version.h @@ -0,0 +1,14 @@ +// Copyright 2022, Roman Gershman. All rights reserved. +// See LICENSE for licensing terms. +// + +#pragma once + +namespace dfly { + +extern const char kGitTag[]; +extern const char kGitSha[]; +extern const char kGitClean[]; +extern const char kBuildTime[]; + +} // namespace dfly diff --git a/tools/release.sh b/tools/release.sh index ef5f09e..20914b5 100755 --- a/tools/release.sh +++ b/tools/release.sh @@ -11,7 +11,9 @@ ARCH=`uname -m` NAME="dragonfly-${ARCH}" pwd -./helio/blaze.sh -release -DBoost_USE_STATIC_LIBS=ON -DOPENSSL_USE_STATIC_LIBS=ON +./helio/blaze.sh -release -DBoost_USE_STATIC_LIBS=ON -DOPENSSL_USE_STATIC_LIBS=ON \ + -DENABLE_GIT_VERSION=ON -DWITH_UNWIND=OFF + cd build-opt ninja dragonfly && ldd dragonfly strip dragonfly