aboutsummaryrefslogtreecommitdiff
path: root/libbutl/b.mxx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2019-01-14 22:00:36 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2019-01-16 18:21:44 +0300
commit78be8e1604f183b28527159047bab69a5cbe9232 (patch)
tree40bc9c7990992257dd2bdaf7dea27d186bc9437d /libbutl/b.mxx
parentf7dc4934b04c062b1ce8aad09725a30707255e69 (diff)
Add b_info() that runs `b info` command and parses and returns build2 project info
Diffstat (limited to 'libbutl/b.mxx')
-rw-r--r--libbutl/b.mxx110
1 files changed, 110 insertions, 0 deletions
diff --git a/libbutl/b.mxx b/libbutl/b.mxx
new file mode 100644
index 0000000..cd574f0
--- /dev/null
+++ b/libbutl/b.mxx
@@ -0,0 +1,110 @@
+// file : libbutl/b.mxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef __cpp_modules
+#pragma once
+#endif
+
+// C includes.
+
+#ifndef __cpp_lib_modules
+#include <string>
+#include <vector>
+#include <cstddef> // size_tu
+#include <cstdint> // uint16_t
+#include <stdexcept> // runtime_error
+#include <functional>
+#endif
+
+// Other includes.
+
+#ifdef __cpp_modules
+export module butl.b;
+#ifdef __cpp_lib_modules
+import std.core;
+#endif
+import butl.url;
+import butl.path;
+import butl.process;
+import butl.optional;
+import butl.project_name;
+import butl.standard_version;
+#else
+#include <libbutl/url.mxx>
+#include <libbutl/path.mxx>
+#include <libbutl/process.mxx>
+#include <libbutl/optional.mxx>
+#include <libbutl/project-name.mxx>
+#include <libbutl/standard-version.mxx>
+#endif
+
+#include <libbutl/export.hxx>
+
+LIBBUTL_MODEXPORT namespace butl
+{
+ class LIBBUTL_SYMEXPORT b_error: public std::runtime_error
+ {
+ public:
+ // Build system program exit information. May be absent if the error
+ // occured before the process has been started.
+ //
+ // Can be used by the caller to decide if to print the error message to
+ // stderr. Normally, it is not required if the process exited normally
+ // with non-zero code, since presumably it has issued diagnostics. Note
+ // that the normal() function can be used to check for this.
+ //
+ optional<process_exit> exit;
+
+ // Return true if the build2 process exited normally with non-zero code.
+ //
+ bool
+ normal () const {return exit && exit->normal () && !*exit;}
+
+ explicit
+ b_error (const std::string& description, optional<process_exit> = nullopt);
+ };
+
+ // Run `b info: <project-dir>` command and parse and return the build2
+ // project information it prints to stdout. Throw b_error on error.
+ //
+ // You can also specify the build2 verbosity level, command line callback
+ // (see process_run_callback() for details), build program search details
+ // and additional options.
+ //
+ struct b_project_info
+ {
+ using url_type = butl::url;
+
+ struct subproject
+ {
+ project_name name; // Empty if anonymous.
+ dir_path path; // Relative to the project root.
+ };
+
+ project_name project;
+ standard_version version;
+ std::string summary;
+ url_type url;
+
+ dir_path src_root;
+ dir_path out_root;
+
+ dir_path amalgamation; // Relative to project root and
+ // empty if not amalgmated.
+ std::vector<subproject> subprojects;
+
+ std::vector<std::string> operations;
+ std::vector<std::string> meta_operations;
+ };
+
+ using b_callback = void (const char* const args[], std::size_t n);
+
+ LIBBUTL_SYMEXPORT b_project_info
+ b_info (const dir_path& project,
+ std::uint16_t verb = 1,
+ const std::function<b_callback>& cmd_callback = {},
+ const path& program = path ("b"),
+ const dir_path& search_fallback = {},
+ const std::vector<std::string>& options = {});
+}