aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbootstrap.sh2
-rw-r--r--build2/b.cxx13
-rw-r--r--build2/bash/init.hxx28
-rw-r--r--build2/buildfile2
-rw-r--r--libbuild2/bash/buildfile65
-rw-r--r--libbuild2/bash/export.hxx34
-rw-r--r--libbuild2/bash/init.cxx (renamed from build2/bash/init.cxx)25
-rw-r--r--libbuild2/bash/init.hxx28
-rw-r--r--libbuild2/bash/rule.cxx (renamed from build2/bash/rule.cxx)8
-rw-r--r--libbuild2/bash/rule.hxx (renamed from build2/bash/rule.hxx)16
-rw-r--r--libbuild2/bash/target.cxx (renamed from build2/bash/target.cxx)4
-rw-r--r--libbuild2/bash/target.hxx (renamed from build2/bash/target.hxx)12
-rw-r--r--libbuild2/bash/utility.hxx (renamed from build2/bash/utility.hxx)8
-rw-r--r--libbuild2/buildfile2
-rw-r--r--tests/libbuild2/buildfile7
-rw-r--r--tests/libbuild2/driver.cxx4
16 files changed, 189 insertions, 69 deletions
diff --git a/bootstrap.sh b/bootstrap.sh
index 8de5e3c..6eb570f 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -121,8 +121,6 @@ src="$src build2/bin/*.cxx"
src="$src build2/c/*.cxx"
src="$src build2/cc/*.cxx"
src="$src build2/cxx/*.cxx"
-src="$src build2/cli/*.cxx"
-src="$src build2/bash/*.cxx"
src="$src libbuild2/*.cxx"
src="$src libbuild2/config/*.cxx"
diff --git a/build2/b.cxx b/build2/b.cxx
index a016278..2bb5920 100644
--- a/build2/b.cxx
+++ b/build2/b.cxx
@@ -54,16 +54,17 @@
#include <libbuild2/in/init.hxx>
#include <libbuild2/version/init.hxx>
+#ifndef BUILD2_BOOTSTRAP
+# include <libbuild2/bash/init.hxx>
+
+# include <build2/cli/init.hxx>
+#endif
+
#include <build2/bin/init.hxx>
#include <build2/c/init.hxx>
#include <build2/cc/init.hxx>
#include <build2/cxx/init.hxx>
-#ifndef BUILD2_BOOTSTRAP
-# include <build2/cli/init.hxx>
-# include <build2/bash/init.hxx>
-#endif
-
using namespace butl;
using namespace std;
@@ -481,7 +482,7 @@ main (int argc, char* argv[])
bm["cli.config"] = mf {"cli.config", nullptr, &cli::config_init};
bm["cli"] = mf {"cli", nullptr, &cli::init};
- bm["bash"] = mf {"bash", nullptr, &bash::init};
+ reg (&bash::build2_bash_load);
#endif
}
diff --git a/build2/bash/init.hxx b/build2/bash/init.hxx
deleted file mode 100644
index 2a7e95c..0000000
--- a/build2/bash/init.hxx
+++ /dev/null
@@ -1,28 +0,0 @@
-// file : build2/bash/init.hxx -*- C++ -*-
-// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
-// license : MIT; see accompanying LICENSE file
-
-#ifndef BUILD2_BASH_INIT_HXX
-#define BUILD2_BASH_INIT_HXX
-
-#include <libbuild2/types.hxx>
-#include <libbuild2/utility.hxx>
-
-#include <libbuild2/module.hxx>
-
-namespace build2
-{
- namespace bash
- {
- bool
- init (scope&,
- scope&,
- const location&,
- unique_ptr<module_base>&,
- bool,
- bool,
- const variable_map&);
- }
-}
-
-#endif // BUILD2_BASH_INIT_HXX
diff --git a/build2/buildfile b/build2/buildfile
index ea39e87..57c2561 100644
--- a/build2/buildfile
+++ b/build2/buildfile
@@ -8,7 +8,7 @@ import libs += libpkgconf%lib{pkgconf}
include ../libbuild2/
libs += ../libbuild2/lib{build2}
-for m: version in
+for m: bash in version
{
include ../libbuild2/$m/
libs += ../libbuild2/$m/lib{build2-$m}
diff --git a/libbuild2/bash/buildfile b/libbuild2/bash/buildfile
new file mode 100644
index 0000000..e1a9f53
--- /dev/null
+++ b/libbuild2/bash/buildfile
@@ -0,0 +1,65 @@
+# file : libbuild2/bash/buildfile
+# copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+import int_libs = libbutl%lib{butl}
+
+include ../
+int_libs += ../lib{build2}
+
+include ../in/
+int_libs += ../in/lib{build2-in}
+
+./: lib{build2-bash}: libul{build2-bash}: {hxx ixx txx cxx}{** -**.test...} \
+ $int_libs
+
+# Unit tests.
+#
+exe{*.test}:
+{
+ test = true
+ install = false
+}
+
+for t: cxx{**.test...}
+{
+ d = $directory($t)
+ n = $name($t)...
+
+ ./: $d/exe{$n}: $t $d/{hxx ixx txx}{+$n} $d/testscript{+$n}
+ $d/exe{$n}: libul{build2-bash}: bin.whole = false
+}
+
+# Build options.
+#
+obja{*}: cxx.poptions += -DLIBBUILD2_BASH_STATIC_BUILD
+objs{*}: cxx.poptions += -DLIBBUILD2_BASH_SHARED_BUILD
+
+# Export options.
+#
+lib{build2-bash}:
+{
+ cxx.export.poptions = "-I$out_root" "-I$src_root"
+ cxx.export.libs = $int_libs
+}
+
+liba{build2-bash}: cxx.export.poptions += -DLIBBUILD2_BASH_STATIC
+libs{build2-bash}: cxx.export.poptions += -DLIBBUILD2_BASH_SHARED
+
+# For pre-releases use the complete version to make sure they cannot be used
+# in place of another pre-release or the final version. See the version module
+# for details on the version.* variable values.
+#
+if $version.pre_release
+ lib{build2-bash}: bin.lib.version = @"-$version.project_id"
+else
+ lib{build2-bash}: bin.lib.version = @"-$version.major.$version.minor"
+
+# Install into the libbuild2/bash/ subdirectory of, say, /usr/include/
+# recreating subdirectories.
+#
+{hxx ixx txx}{*}:
+{
+ install = include/libbuild2/bash/
+ install.subdirs = true
+}
diff --git a/libbuild2/bash/export.hxx b/libbuild2/bash/export.hxx
new file mode 100644
index 0000000..d87e677
--- /dev/null
+++ b/libbuild2/bash/export.hxx
@@ -0,0 +1,34 @@
+#pragma once
+
+// Normally we don't export class templates (but do complete specializations),
+// inline functions, and classes with only inline member functions. Exporting
+// classes that inherit from non-exported/imported bases (e.g., std::string)
+// will end up badly. The only known workarounds are to not inherit or to not
+// export. Also, MinGW GCC doesn't like seeing non-exported functions being
+// used before their inline definition. The workaround is to reorder code. In
+// the end it's all trial and error.
+
+#if defined(LIBBUILD2_BASH_STATIC) // Using static.
+# define LIBBUILD2_BASH_SYMEXPORT
+#elif defined(LIBBUILD2_BASH_STATIC_BUILD) // Building static.
+# define LIBBUILD2_BASH_SYMEXPORT
+#elif defined(LIBBUILD2_BASH_SHARED) // Using shared.
+# ifdef _WIN32
+# define LIBBUILD2_BASH_SYMEXPORT __declspec(dllimport)
+# else
+# define LIBBUILD2_BASH_SYMEXPORT
+# endif
+#elif defined(LIBBUILD2_BASH_SHARED_BUILD) // Building shared.
+# ifdef _WIN32
+# define LIBBUILD2_BASH_SYMEXPORT __declspec(dllexport)
+# else
+# define LIBBUILD2_BASH_SYMEXPORT
+# endif
+#else
+// If none of the above macros are defined, then we assume we are being used
+// by some third-party build system that cannot/doesn't signal the library
+// type. Note that this fallback works for both static and shared but in case
+// of shared will be sub-optimal compared to having dllimport.
+//
+# define LIBBUILD2_BASH_SYMEXPORT // Using static or shared.
+#endif
diff --git a/build2/bash/init.cxx b/libbuild2/bash/init.cxx
index 146e680..17c9ddd 100644
--- a/build2/bash/init.cxx
+++ b/libbuild2/bash/init.cxx
@@ -1,8 +1,8 @@
-// file : build2/bash/init.cxx -*- C++ -*-
+// file : libbuild2/bash/init.cxx -*- C++ -*-
// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
// license : MIT; see accompanying LICENSE file
-#include <build2/bash/init.hxx>
+#include <libbuild2/bash/init.hxx>
#include <libbuild2/scope.hxx>
#include <libbuild2/context.hxx>
@@ -11,9 +11,9 @@
#include <libbuild2/install/utility.hxx>
-#include <build2/bash/rule.hxx>
-#include <build2/bash/target.hxx>
-#include <build2/bash/utility.hxx>
+#include <libbuild2/bash/rule.hxx>
+#include <libbuild2/bash/target.hxx>
+#include <libbuild2/bash/utility.hxx>
using namespace std;
@@ -85,5 +85,20 @@ namespace build2
return true;
}
+
+ static const module_functions mod_functions[] =
+ {
+ // NOTE: don't forget to also update the documentation in init.hxx if
+ // changing anything here.
+
+ {"bash", nullptr, init},
+ {nullptr, nullptr, nullptr}
+ };
+
+ const module_functions*
+ build2_bash_load ()
+ {
+ return mod_functions;
+ }
}
}
diff --git a/libbuild2/bash/init.hxx b/libbuild2/bash/init.hxx
new file mode 100644
index 0000000..4d05f2d
--- /dev/null
+++ b/libbuild2/bash/init.hxx
@@ -0,0 +1,28 @@
+// file : libbuild2/bash/init.hxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef LIBBUILD2_BASH_INIT_HXX
+#define LIBBUILD2_BASH_INIT_HXX
+
+#include <libbuild2/types.hxx>
+#include <libbuild2/utility.hxx>
+
+#include <libbuild2/module.hxx>
+
+#include <libbuild2/bash/export.hxx>
+
+namespace build2
+{
+ namespace bash
+ {
+ // Module `bash` does not require bootstrapping.
+ //
+ // No submodules.
+ //
+ extern "C" LIBBUILD2_BASH_SYMEXPORT const module_functions*
+ build2_bash_load ();
+ }
+}
+
+#endif // LIBBUILD2_BASH_INIT_HXX
diff --git a/build2/bash/rule.cxx b/libbuild2/bash/rule.cxx
index a612d23..d9bf857 100644
--- a/build2/bash/rule.cxx
+++ b/libbuild2/bash/rule.cxx
@@ -1,8 +1,8 @@
-// file : build2/bash/rule.cxx -*- C++ -*-
+// file : libbuild2/bash/rule.cxx -*- C++ -*-
// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
// license : MIT; see accompanying LICENSE file
-#include <build2/bash/rule.hxx>
+#include <libbuild2/bash/rule.hxx>
#include <cstring> // strlen(), strchr()
@@ -13,8 +13,8 @@
#include <libbuild2/in/target.hxx>
-#include <build2/bash/target.hxx>
-#include <build2/bash/utility.hxx>
+#include <libbuild2/bash/target.hxx>
+#include <libbuild2/bash/utility.hxx>
using namespace std;
using namespace butl;
diff --git a/build2/bash/rule.hxx b/libbuild2/bash/rule.hxx
index c160bb7..665a6c2 100644
--- a/build2/bash/rule.hxx
+++ b/libbuild2/bash/rule.hxx
@@ -1,9 +1,9 @@
-// file : build2/bash/rule.hxx -*- C++ -*-
+// file : libbuild2/bash/rule.hxx -*- C++ -*-
// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
// license : MIT; see accompanying LICENSE file
-#ifndef BUILD2_BASH_RULE_HXX
-#define BUILD2_BASH_RULE_HXX
+#ifndef LIBBUILD2_BASH_RULE_HXX
+#define LIBBUILD2_BASH_RULE_HXX
#include <libbuild2/types.hxx>
#include <libbuild2/utility.hxx>
@@ -12,6 +12,8 @@
#include <libbuild2/in/rule.hxx>
+#include <libbuild2/bash/export.hxx>
+
namespace build2
{
namespace bash
@@ -25,7 +27,7 @@ namespace build2
// however, is still able to override both of these choices with the
// corresponding in.* variables (e.g., to use '`' and strict mode).
//
- class in_rule: public in::rule
+ class LIBBUILD2_BASH_SYMEXPORT in_rule: public in::rule
{
public:
in_rule (): rule ("bash.in 1", "bash.in", '@', false /* strict */) {}
@@ -66,7 +68,7 @@ namespace build2
//
// 2. Custom filtering of prerequisites.
//
- class install_rule: public install::file_rule
+ class LIBBUILD2_BASH_SYMEXPORT install_rule: public install::file_rule
{
public:
install_rule (const in_rule& in): in_ (in) {}
@@ -80,10 +82,10 @@ namespace build2
virtual const target*
filter (action, const target&, const prerequisite&) const override;
- private:
+ protected:
const in_rule& in_;
};
}
}
-#endif // BUILD2_BASH_RULE_HXX
+#endif // LIBBUILD2_BASH_RULE_HXX
diff --git a/build2/bash/target.cxx b/libbuild2/bash/target.cxx
index e843d53..7313316 100644
--- a/build2/bash/target.cxx
+++ b/libbuild2/bash/target.cxx
@@ -1,8 +1,8 @@
-// file : build2/bash/target.cxx -*- C++ -*-
+// file : libbuild2/bash/target.cxx -*- C++ -*-
// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
// license : MIT; see accompanying LICENSE file
-#include <build2/bash/target.hxx>
+#include <libbuild2/bash/target.hxx>
#include <libbuild2/context.hxx>
diff --git a/build2/bash/target.hxx b/libbuild2/bash/target.hxx
index 6be83c4..af8b32c 100644
--- a/build2/bash/target.hxx
+++ b/libbuild2/bash/target.hxx
@@ -1,15 +1,17 @@
-// file : build2/bash/target.hxx -*- C++ -*-
+// file : libbuild2/bash/target.hxx -*- C++ -*-
// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
// license : MIT; see accompanying LICENSE file
-#ifndef BUILD2_BASH_TARGET_HXX
-#define BUILD2_BASH_TARGET_HXX
+#ifndef LIBBUILD2_BASH_TARGET_HXX
+#define LIBBUILD2_BASH_TARGET_HXX
#include <libbuild2/types.hxx>
#include <libbuild2/utility.hxx>
#include <libbuild2/target.hxx>
+#include <libbuild2/bash/export.hxx>
+
namespace build2
{
namespace bash
@@ -17,7 +19,7 @@ namespace build2
// Bash module file to be sourced by a script. The default/standard
// extension is .bash.
//
- class bash: public file
+ class LIBBUILD2_BASH_SYMEXPORT bash: public file
{
public:
using file::file;
@@ -29,4 +31,4 @@ namespace build2
}
}
-#endif // BUILD2_BASH_TARGET_HXX
+#endif // LIBBUILD2_BASH_TARGET_HXX
diff --git a/build2/bash/utility.hxx b/libbuild2/bash/utility.hxx
index 31a6b99..1f981c2 100644
--- a/build2/bash/utility.hxx
+++ b/libbuild2/bash/utility.hxx
@@ -1,9 +1,9 @@
-// file : build2/bash/utility.hxx -*- C++ -*-
+// file : libbuild2/bash/utility.hxx -*- C++ -*-
// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
// license : MIT; see accompanying LICENSE file
-#ifndef BUILD2_BASH_UTILITY_HXX
-#define BUILD2_BASH_UTILITY_HXX
+#ifndef LIBBUILD2_BASH_UTILITY_HXX
+#define LIBBUILD2_BASH_UTILITY_HXX
#include <libbuild2/types.hxx>
#include <libbuild2/utility.hxx>
@@ -24,4 +24,4 @@ namespace build2
}
}
-#endif // BUILD2_BASH_UTILITY_HXX
+#endif // LIBBUILD2_BASH_UTILITY_HXX
diff --git a/libbuild2/buildfile b/libbuild2/buildfile
index ab95098..377ea30 100644
--- a/libbuild2/buildfile
+++ b/libbuild2/buildfile
@@ -2,7 +2,7 @@
# copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
# license : MIT; see accompanying LICENSE file
-./: lib{build2} version/ in/
+./: lib{build2} bash/ in/ version/
import int_libs = libbutl%lib{butl}
diff --git a/tests/libbuild2/buildfile b/tests/libbuild2/buildfile
index aa6c17f..bd22b4c 100644
--- a/tests/libbuild2/buildfile
+++ b/tests/libbuild2/buildfile
@@ -2,9 +2,10 @@
# copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
# license : MIT; see accompanying LICENSE file
-import libs = build2%lib{build2}
-import libs += build2%lib{build2-in}
-import libs += build2%lib{build2-version}
+import libs = build2%lib{build2}
+
+for m: bash in version
+ import libs += build2%lib{build2-$m}
exe{driver}: {hxx cxx}{*} $libs testscript
diff --git a/tests/libbuild2/driver.cxx b/tests/libbuild2/driver.cxx
index 544d43e..20c0ec2 100644
--- a/tests/libbuild2/driver.cxx
+++ b/tests/libbuild2/driver.cxx
@@ -9,6 +9,7 @@
#include <libbuild2/scheduler.hxx>
#include <libbuild2/in/init.hxx>
+#include <libbuild2/bash/init.hxx>
#include <libbuild2/version/init.hxx>
using namespace build2;
@@ -21,8 +22,9 @@ main (int, char* argv[])
init_diag (1);
init (argv[0]);
- version::build2_version_load ();
+ bash::build2_bash_load ();
in::build2_in_load ();
+ version::build2_version_load ();
sched.startup (1); // Serial execution.
reset (strings ()); // No command line variables.