summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/main/TARGETS24
-rw-r--r--src/buildtool/main/main.cpp15
-rw-r--r--src/buildtool/main/version.cpp22
-rw-r--r--src/buildtool/main/version.hpp8
4 files changed, 68 insertions, 1 deletions
diff --git a/src/buildtool/main/TARGETS b/src/buildtool/main/TARGETS
index 6e3d3c74..4fd16a86 100644
--- a/src/buildtool/main/TARGETS
+++ b/src/buildtool/main/TARGETS
@@ -19,6 +19,7 @@
, ["src/buildtool/build_engine/target_map", "target_cache"]
, ["src/utils/cpp", "concepts"]
, ["src/utils/cpp", "json"]
+ , "version"
]
, "stage": ["src", "buildtool", "main"]
, "link external":
@@ -27,4 +28,27 @@
, "then": ["-static"]
}
}
+, "version":
+ { "type": ["@", "rules", "CC", "library"]
+ , "arguments_config": ["SOURCE_DATE_EPOCH"]
+ , "name": ["version"]
+ , "hdrs": ["version.hpp"]
+ , "srcs": ["version.cpp"]
+ , "local defines":
+ { "type": "if"
+ , "cond": {"type": "var", "name": "SOURCE_DATE_EPOCH"}
+ , "then":
+ [ { "type": "join"
+ , "$1":
+ [ "SOURCE_DATE_EPOCH="
+ , { "type": "json_encode"
+ , "$1": {"type": "var", "name": "SOURCE_DATE_EPOCH"}
+ }
+ ]
+ }
+ ]
+ }
+ , "deps": [["@", "json", "", "json"], ["src/utils/cpp", "json"]]
+ , "stage": ["src", "buildtool", "main"]
+ }
}
diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp
index ba8bcb7d..d6d999ab 100644
--- a/src/buildtool/main/main.cpp
+++ b/src/buildtool/main/main.cpp
@@ -29,6 +29,7 @@
#include "src/buildtool/logging/log_config.hpp"
#include "src/buildtool/logging/log_sink_cmdline.hpp"
#include "src/buildtool/logging/log_sink_file.hpp"
+#include "src/buildtool/main/version.hpp"
#include "src/buildtool/multithreading/async_map_consumer.hpp"
#include "src/buildtool/multithreading/task_system.hpp"
#include "src/utils/cpp/concepts.hpp"
@@ -41,6 +42,7 @@ namespace Target = BuildMaps::Target;
enum class SubCommand {
kUnknown,
+ kVersion,
kDescribe,
kAnalyse,
kBuild,
@@ -134,6 +136,8 @@ auto ParseCommandLineArguments(int argc, char const* const* argv)
CLI::App app("just");
app.option_defaults()->take_last();
+ auto* cmd_version = app.add_subcommand(
+ "version", "Print version information in JSON format.");
auto* cmd_describe = app.add_subcommand(
"describe", "Describe the rule generating a target.");
auto* cmd_analyse =
@@ -152,6 +156,7 @@ auto ParseCommandLineArguments(int argc, char const* const* argv)
app.require_subcommand(1);
CommandLineArguments clargs;
+ SetupDescribeCommandArguments(cmd_version, &clargs);
SetupDescribeCommandArguments(cmd_describe, &clargs);
SetupAnalyseCommandArguments(cmd_analyse, &clargs);
SetupBuildCommandArguments(cmd_build, &clargs);
@@ -169,7 +174,10 @@ auto ParseCommandLineArguments(int argc, char const* const* argv)
std::exit(kExitFailure);
}
- if (*cmd_describe) {
+ if (*cmd_version) {
+ clargs.cmd = SubCommand::kVersion;
+ }
+ else if (*cmd_describe) {
clargs.cmd = SubCommand::kDescribe;
}
else if (*cmd_analyse) {
@@ -1319,6 +1327,11 @@ auto main(int argc, char* argv[]) -> int {
try {
auto arguments = ParseCommandLineArguments(argc, argv);
+ if (arguments.cmd == SubCommand::kVersion) {
+ std::cerr << version() << std::endl;
+ return kExitSuccess;
+ }
+
SetupLogging(arguments.common);
#ifndef BOOTSTRAP_BUILD_TOOL
SetupHashFunction();
diff --git a/src/buildtool/main/version.cpp b/src/buildtool/main/version.cpp
new file mode 100644
index 00000000..3bd37f2a
--- /dev/null
+++ b/src/buildtool/main/version.cpp
@@ -0,0 +1,22 @@
+#include "src/buildtool/main/version.hpp"
+
+#include "nlohmann/json.hpp"
+#include "src/utils/cpp/json.hpp"
+
+auto version() -> std::string {
+ std::size_t major = 0;
+ std::size_t minor = 1;
+ std::size_t revision = 0;
+ std::string suffix = "+devel";
+
+ nlohmann::json version_info = {{"version", {major, minor, revision}},
+ {"suffix", suffix}};
+
+#ifdef SOURCE_DATE_EPOCH
+ version_info["SOURCE_DATE_EPOCH"] = (std::size_t)SOURCE_DATE_EPOCH;
+#else
+ version_info["SOURCE_DATE_EPOCH"] = nullptr;
+#endif
+
+ return IndentOnlyUntilDepth(version_info, 2, 1, {});
+}
diff --git a/src/buildtool/main/version.hpp b/src/buildtool/main/version.hpp
new file mode 100644
index 00000000..c24e87e6
--- /dev/null
+++ b/src/buildtool/main/version.hpp
@@ -0,0 +1,8 @@
+#ifndef INCLUDED_SRC_BUILDOOL_MAIN_VERSION_HPP
+#define INCLUDED_SRC_BUILDOOL_MAIN_VERSION_HPP
+
+#include <string>
+
+auto version() -> std::string;
+
+#endif