diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2019-06-24 12:01:19 +0200 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2019-07-01 18:13:55 +0300 |
commit | 977d07a3ae47ef204665d1eda2d642e5064724f3 (patch) | |
tree | 525a3d6421f61ce789b690191d3c30fc09be3517 | |
parent | 7161b24963dd9da4d218f92c736b77c35c328a2d (diff) |
Split build system into library and driver
-rw-r--r-- | README-GIT | 6 | ||||
-rw-r--r-- | bootstrap-mingw.bat | 1 | ||||
-rw-r--r-- | bootstrap-msvc.bat | 1 | ||||
-rw-r--r-- | bootstrap.gmake | 47 | ||||
-rwxr-xr-x | bootstrap.sh | 1 | ||||
-rw-r--r-- | build/export.build | 5 | ||||
-rw-r--r-- | build/root.build | 2 | ||||
-rw-r--r-- | build2/.gitignore | 8 | ||||
-rw-r--r-- | build2/b-options.hxx | 2 | ||||
-rw-r--r-- | build2/b.cli | 2 | ||||
-rw-r--r-- | build2/b.cxx | 47 | ||||
-rw-r--r-- | build2/bash/init.cxx | 8 | ||||
-rw-r--r-- | build2/bash/init.hxx | 6 | ||||
-rw-r--r-- | build2/bash/rule.cxx | 8 | ||||
-rw-r--r-- | build2/bash/rule.hxx | 4 | ||||
-rw-r--r-- | build2/bash/target.cxx | 2 | ||||
-rw-r--r-- | build2/bash/target.hxx | 6 | ||||
-rw-r--r-- | build2/bash/utility.hxx | 4 | ||||
-rw-r--r-- | build2/bin/guess.cxx | 2 | ||||
-rw-r--r-- | build2/bin/guess.hxx | 4 | ||||
-rw-r--r-- | build2/bin/init.cxx | 6 | ||||
-rw-r--r-- | build2/bin/init.hxx | 6 | ||||
-rw-r--r-- | build2/bin/rule.cxx | 8 | ||||
-rw-r--r-- | build2/bin/rule.hxx | 6 | ||||
-rw-r--r-- | build2/bin/target.cxx | 2 | ||||
-rw-r--r-- | build2/bin/target.hxx | 6 | ||||
-rw-r--r-- | build2/buildfile | 13 | ||||
-rw-r--r-- | build2/c/init.cxx | 6 | ||||
-rw-r--r-- | build2/c/init.hxx | 6 | ||||
-rw-r--r-- | build2/c/target.hxx | 4 | ||||
-rw-r--r-- | build2/cc/common.cxx | 14 | ||||
-rw-r--r-- | build2/cc/common.hxx | 6 | ||||
-rw-r--r-- | build2/cc/compile-rule.cxx | 16 | ||||
-rw-r--r-- | build2/cc/compile-rule.hxx | 8 | ||||
-rw-r--r-- | build2/cc/gcc.cxx | 12 | ||||
-rw-r--r-- | build2/cc/guess.cxx | 2 | ||||
-rw-r--r-- | build2/cc/guess.hxx | 4 | ||||
-rw-r--r-- | build2/cc/init.cxx | 10 | ||||
-rw-r--r-- | build2/cc/init.hxx | 6 | ||||
-rw-r--r-- | build2/cc/install-rule.cxx | 2 | ||||
-rw-r--r-- | build2/cc/install-rule.hxx | 4 | ||||
-rw-r--r-- | build2/cc/lexer.hxx | 6 | ||||
-rw-r--r-- | build2/cc/lexer.test.cxx | 4 | ||||
-rw-r--r-- | build2/cc/link-rule.cxx | 14 | ||||
-rw-r--r-- | build2/cc/link-rule.hxx | 6 | ||||
-rw-r--r-- | build2/cc/module.cxx | 6 | ||||
-rw-r--r-- | build2/cc/module.hxx | 8 | ||||
-rw-r--r-- | build2/cc/msvc.cxx | 14 | ||||
-rw-r--r-- | build2/cc/parser.hxx | 6 | ||||
-rw-r--r-- | build2/cc/parser.test.cxx | 4 | ||||
-rw-r--r-- | build2/cc/pkgconfig.cxx | 14 | ||||
-rw-r--r-- | build2/cc/target.cxx | 2 | ||||
-rw-r--r-- | build2/cc/target.hxx | 6 | ||||
-rw-r--r-- | build2/cc/types.hxx | 6 | ||||
-rw-r--r-- | build2/cc/utility.cxx | 6 | ||||
-rw-r--r-- | build2/cc/utility.hxx | 6 | ||||
-rw-r--r-- | build2/cc/windows-manifest.cxx | 12 | ||||
-rw-r--r-- | build2/cc/windows-rpath.cxx | 12 | ||||
-rw-r--r-- | build2/cli/init.cxx | 8 | ||||
-rw-r--r-- | build2/cli/init.hxx | 6 | ||||
-rw-r--r-- | build2/cli/rule.cxx | 14 | ||||
-rw-r--r-- | build2/cli/rule.hxx | 6 | ||||
-rw-r--r-- | build2/cli/target.cxx | 2 | ||||
-rw-r--r-- | build2/cli/target.hxx | 6 | ||||
-rw-r--r-- | build2/config/init.cxx | 12 | ||||
-rw-r--r-- | build2/config/init.hxx | 6 | ||||
-rw-r--r-- | build2/config/module.hxx | 8 | ||||
-rw-r--r-- | build2/config/operation.cxx | 16 | ||||
-rw-r--r-- | build2/config/operation.hxx | 6 | ||||
-rw-r--r-- | build2/config/utility.cxx | 8 | ||||
-rw-r--r-- | build2/config/utility.hxx | 10 | ||||
-rw-r--r-- | build2/config/utility.txx | 4 | ||||
-rw-r--r-- | build2/cxx/init.cxx | 6 | ||||
-rw-r--r-- | build2/cxx/init.hxx | 6 | ||||
-rw-r--r-- | build2/cxx/target.cxx | 2 | ||||
-rw-r--r-- | build2/cxx/target.hxx | 6 | ||||
-rw-r--r-- | build2/dist/init.cxx | 6 | ||||
-rw-r--r-- | build2/dist/init.hxx | 6 | ||||
-rw-r--r-- | build2/dist/module.hxx | 8 | ||||
-rw-r--r-- | build2/dist/operation.cxx | 16 | ||||
-rw-r--r-- | build2/dist/operation.hxx | 6 | ||||
-rw-r--r-- | build2/dist/rule.cxx | 8 | ||||
-rw-r--r-- | build2/dist/rule.hxx | 10 | ||||
-rw-r--r-- | build2/in/init.cxx | 8 | ||||
-rw-r--r-- | build2/in/init.hxx | 6 | ||||
-rw-r--r-- | build2/in/rule.cxx | 14 | ||||
-rw-r--r-- | build2/in/rule.hxx | 6 | ||||
-rw-r--r-- | build2/in/target.hxx | 6 | ||||
-rw-r--r-- | build2/install/functions.cxx | 4 | ||||
-rw-r--r-- | build2/install/init.cxx | 12 | ||||
-rw-r--r-- | build2/install/init.hxx | 6 | ||||
-rw-r--r-- | build2/install/operation.hxx | 6 | ||||
-rw-r--r-- | build2/install/rule.cxx | 10 | ||||
-rw-r--r-- | build2/install/rule.hxx | 12 | ||||
-rw-r--r-- | build2/install/utility.hxx | 8 | ||||
-rw-r--r-- | build2/test/common.cxx | 4 | ||||
-rw-r--r-- | build2/test/common.hxx | 6 | ||||
-rw-r--r-- | build2/test/init.cxx | 8 | ||||
-rw-r--r-- | build2/test/init.hxx | 6 | ||||
-rw-r--r-- | build2/test/module.hxx | 6 | ||||
-rw-r--r-- | build2/test/operation.hxx | 6 | ||||
-rw-r--r-- | build2/test/rule.cxx | 12 | ||||
-rw-r--r-- | build2/test/rule.hxx | 8 | ||||
-rw-r--r-- | build2/test/script/builtin.cxx | 2 | ||||
-rw-r--r-- | build2/test/script/builtin.hxx | 4 | ||||
-rw-r--r-- | build2/test/script/lexer.hxx | 6 | ||||
-rw-r--r-- | build2/test/script/lexer.test.cxx | 4 | ||||
-rw-r--r-- | build2/test/script/parser.cxx | 6 | ||||
-rw-r--r-- | build2/test/script/parser.hxx | 8 | ||||
-rw-r--r-- | build2/test/script/parser.test.cxx | 10 | ||||
-rw-r--r-- | build2/test/script/regex.hxx | 4 | ||||
-rw-r--r-- | build2/test/script/runner.cxx | 6 | ||||
-rw-r--r-- | build2/test/script/runner.hxx | 4 | ||||
-rw-r--r-- | build2/test/script/script.cxx | 4 | ||||
-rw-r--r-- | build2/test/script/script.hxx | 6 | ||||
-rw-r--r-- | build2/test/script/token.hxx | 6 | ||||
-rw-r--r-- | build2/test/target.hxx | 6 | ||||
-rw-r--r-- | build2/types-parsers.hxx | 2 | ||||
-rw-r--r-- | build2/version/init.cxx | 8 | ||||
-rw-r--r-- | build2/version/init.hxx | 6 | ||||
-rw-r--r-- | build2/version/module.hxx | 6 | ||||
-rw-r--r-- | build2/version/rule.cxx | 6 | ||||
-rw-r--r-- | build2/version/rule.hxx | 4 | ||||
-rw-r--r-- | build2/version/snapshot.cxx | 2 | ||||
-rw-r--r-- | build2/version/snapshot.hxx | 6 | ||||
-rw-r--r-- | build2/version/utility.cxx | 2 | ||||
-rw-r--r-- | build2/version/utility.hxx | 6 | ||||
-rw-r--r-- | libbuild2/.gitignore | 5 | ||||
-rw-r--r-- | libbuild2/action.hxx (renamed from build2/action.hxx) | 16 | ||||
-rw-r--r-- | libbuild2/algorithm.cxx (renamed from build2/algorithm.cxx) | 57 | ||||
-rw-r--r-- | libbuild2/algorithm.hxx (renamed from build2/algorithm.hxx) | 81 | ||||
-rw-r--r-- | libbuild2/algorithm.ixx (renamed from build2/algorithm.ixx) | 57 | ||||
-rw-r--r-- | libbuild2/buildfile | 85 | ||||
-rw-r--r-- | libbuild2/config.hxx | 0 | ||||
-rw-r--r-- | libbuild2/config.hxx.in (renamed from build2/config.hxx.in) | 22 | ||||
-rw-r--r-- | libbuild2/context.cxx (renamed from build2/context.cxx) | 72 | ||||
-rw-r--r-- | libbuild2/context.hxx (renamed from build2/context.hxx) | 161 | ||||
-rw-r--r-- | libbuild2/context.ixx (renamed from build2/context.ixx) | 2 | ||||
-rw-r--r-- | libbuild2/depdb.cxx (renamed from build2/depdb.cxx) | 8 | ||||
-rw-r--r-- | libbuild2/depdb.hxx (renamed from build2/depdb.hxx) | 20 | ||||
-rw-r--r-- | libbuild2/depdb.ixx (renamed from build2/depdb.ixx) | 4 | ||||
-rw-r--r-- | libbuild2/diagnostics.cxx (renamed from build2/diagnostics.cxx) | 21 | ||||
-rw-r--r-- | libbuild2/diagnostics.hxx (renamed from build2/diagnostics.hxx) | 69 | ||||
-rw-r--r-- | libbuild2/dump.cxx (renamed from build2/dump.cxx) | 14 | ||||
-rw-r--r-- | libbuild2/dump.hxx (renamed from build2/dump.hxx) | 22 | ||||
-rw-r--r-- | libbuild2/export.hxx | 58 | ||||
-rw-r--r-- | libbuild2/file.cxx (renamed from build2/file.cxx) | 33 | ||||
-rw-r--r-- | libbuild2/file.hxx (renamed from build2/file.hxx) | 86 | ||||
-rw-r--r-- | libbuild2/file.ixx (renamed from build2/file.ixx) | 6 | ||||
-rw-r--r-- | libbuild2/filesystem.cxx (renamed from build2/filesystem.cxx) | 8 | ||||
-rw-r--r-- | libbuild2/filesystem.hxx (renamed from build2/filesystem.hxx) | 42 | ||||
-rw-r--r-- | libbuild2/filesystem.txx (renamed from build2/filesystem.txx) | 6 | ||||
-rw-r--r-- | libbuild2/function+call.test.testscript (renamed from build2/function+call.test.testscript) | 2 | ||||
-rw-r--r-- | libbuild2/function+syntax.test.testscript (renamed from build2/function+syntax.test.testscript) | 2 | ||||
-rw-r--r-- | libbuild2/function.cxx (renamed from build2/function.cxx) | 6 | ||||
-rw-r--r-- | libbuild2/function.hxx (renamed from build2/function.hxx) | 50 | ||||
-rw-r--r-- | libbuild2/function.test.cxx (renamed from build2/function.test.cxx) | 16 | ||||
-rw-r--r-- | libbuild2/functions-builtin.cxx (renamed from build2/functions-builtin.cxx) | 6 | ||||
-rw-r--r-- | libbuild2/functions-filesystem.cxx (renamed from build2/functions-filesystem.cxx) | 6 | ||||
-rw-r--r-- | libbuild2/functions-name.cxx (renamed from build2/functions-name.cxx) | 8 | ||||
-rw-r--r-- | libbuild2/functions-path.cxx (renamed from build2/functions-path.cxx) | 6 | ||||
-rw-r--r-- | libbuild2/functions-process-path.cxx (renamed from build2/functions-process-path.cxx) | 6 | ||||
-rw-r--r-- | libbuild2/functions-process.cxx (renamed from build2/functions-process.cxx) | 6 | ||||
-rw-r--r-- | libbuild2/functions-project-name.cxx (renamed from build2/functions-project-name.cxx) | 6 | ||||
-rw-r--r-- | libbuild2/functions-regex.cxx (renamed from build2/functions-regex.cxx) | 6 | ||||
-rw-r--r-- | libbuild2/functions-string.cxx (renamed from build2/functions-string.cxx) | 6 | ||||
-rw-r--r-- | libbuild2/functions-target-triplet.cxx (renamed from build2/functions-target-triplet.cxx) | 6 | ||||
-rw-r--r-- | libbuild2/lexer+buildspec.test.testscript (renamed from build2/lexer+buildspec.test.testscript) | 2 | ||||
-rw-r--r-- | libbuild2/lexer+comment.test.testscript (renamed from build2/lexer+comment.test.testscript) | 2 | ||||
-rw-r--r-- | libbuild2/lexer+eval.test.testscript (renamed from build2/lexer+eval.test.testscript) | 2 | ||||
-rw-r--r-- | libbuild2/lexer+quoting.test.testscript (renamed from build2/lexer+quoting.test.testscript) | 2 | ||||
-rw-r--r-- | libbuild2/lexer.cxx (renamed from build2/lexer.cxx) | 4 | ||||
-rw-r--r-- | libbuild2/lexer.hxx (renamed from build2/lexer.hxx) | 20 | ||||
-rw-r--r-- | libbuild2/lexer.test.cxx (renamed from build2/lexer.test.cxx) | 10 | ||||
-rw-r--r-- | libbuild2/module.cxx (renamed from build2/module.cxx) | 10 | ||||
-rw-r--r-- | libbuild2/module.hxx (renamed from build2/module.hxx) | 24 | ||||
-rw-r--r-- | libbuild2/name.cxx (renamed from build2/name.cxx) | 6 | ||||
-rw-r--r-- | libbuild2/name.hxx (renamed from build2/name.hxx) | 27 | ||||
-rw-r--r-- | libbuild2/name.ixx (renamed from build2/name.ixx) | 2 | ||||
-rw-r--r-- | libbuild2/name.test.cxx (renamed from build2/name.test.cxx) | 8 | ||||
-rw-r--r-- | libbuild2/operation.cxx (renamed from build2/operation.cxx) | 14 | ||||
-rw-r--r-- | libbuild2/operation.hxx (renamed from build2/operation.hxx) | 50 | ||||
-rw-r--r-- | libbuild2/parser.cxx (renamed from build2/parser.cxx) | 26 | ||||
-rw-r--r-- | libbuild2/parser.hxx (renamed from build2/parser.hxx) | 26 | ||||
-rw-r--r-- | libbuild2/prerequisite.cxx (renamed from build2/prerequisite.cxx) | 12 | ||||
-rw-r--r-- | libbuild2/prerequisite.hxx (renamed from build2/prerequisite.hxx) | 28 | ||||
-rw-r--r-- | libbuild2/prerequisite.ixx (renamed from build2/prerequisite.ixx) | 9 | ||||
-rw-r--r-- | libbuild2/rule-map.hxx (renamed from build2/rule-map.hxx) | 14 | ||||
-rw-r--r-- | libbuild2/rule.cxx (renamed from build2/rule.cxx) | 16 | ||||
-rw-r--r-- | libbuild2/rule.hxx (renamed from build2/rule.hxx) | 26 | ||||
-rw-r--r-- | libbuild2/scheduler.cxx (renamed from build2/scheduler.cxx) | 66 | ||||
-rw-r--r-- | libbuild2/scheduler.hxx (renamed from build2/scheduler.hxx) | 38 | ||||
-rw-r--r-- | libbuild2/scheduler.test.cxx (renamed from build2/scheduler.test.cxx) | 8 | ||||
-rw-r--r-- | libbuild2/scheduler.txx (renamed from build2/scheduler.txx) | 4 | ||||
-rw-r--r-- | libbuild2/scope.cxx (renamed from build2/scope.cxx) | 8 | ||||
-rw-r--r-- | libbuild2/scope.hxx (renamed from build2/scope.hxx) | 55 | ||||
-rw-r--r-- | libbuild2/scope.ixx (renamed from build2/scope.ixx) | 2 | ||||
-rw-r--r-- | libbuild2/search.cxx (renamed from build2/search.cxx) | 16 | ||||
-rw-r--r-- | libbuild2/search.hxx (renamed from build2/search.hxx) | 20 | ||||
-rw-r--r-- | libbuild2/spec.cxx (renamed from build2/spec.cxx) | 8 | ||||
-rw-r--r-- | libbuild2/spec.hxx (renamed from build2/spec.hxx) | 24 | ||||
-rw-r--r-- | libbuild2/target-key.hxx (renamed from build2/target-key.hxx) | 20 | ||||
-rw-r--r-- | libbuild2/target-state.hxx (renamed from build2/target-state.hxx) | 16 | ||||
-rw-r--r-- | libbuild2/target-type.hxx (renamed from build2/target-type.hxx) | 16 | ||||
-rw-r--r-- | libbuild2/target.cxx (renamed from build2/target.cxx) | 16 | ||||
-rw-r--r-- | libbuild2/target.hxx (renamed from build2/target.hxx) | 221 | ||||
-rw-r--r-- | libbuild2/target.ixx (renamed from build2/target.ixx) | 166 | ||||
-rw-r--r-- | libbuild2/target.txx (renamed from build2/target.txx) | 8 | ||||
-rw-r--r-- | libbuild2/token.cxx (renamed from build2/token.cxx) | 4 | ||||
-rw-r--r-- | libbuild2/token.hxx (renamed from build2/token.hxx) | 18 | ||||
-rw-r--r-- | libbuild2/types.hxx (renamed from build2/types.hxx) | 26 | ||||
-rw-r--r-- | libbuild2/utility.cxx (renamed from build2/utility.cxx) | 16 | ||||
-rw-r--r-- | libbuild2/utility.hxx (renamed from build2/utility.hxx) | 137 | ||||
-rw-r--r-- | libbuild2/utility.ixx (renamed from build2/utility.ixx) | 2 | ||||
-rw-r--r-- | libbuild2/utility.txx (renamed from build2/utility.txx) | 2 | ||||
-rw-r--r-- | libbuild2/variable.cxx (renamed from build2/variable.cxx) | 19 | ||||
-rw-r--r-- | libbuild2/variable.hxx (renamed from build2/variable.hxx) | 112 | ||||
-rw-r--r-- | libbuild2/variable.ixx (renamed from build2/variable.ixx) | 11 | ||||
-rw-r--r-- | libbuild2/variable.txx (renamed from build2/variable.txx) | 4 | ||||
-rw-r--r-- | libbuild2/version.hxx | 0 | ||||
-rw-r--r-- | libbuild2/version.hxx.in (renamed from build2/version.hxx.in) | 24 | ||||
-rw-r--r-- | old-tests/depdb/driver.cxx | 6 | ||||
-rw-r--r-- | tests/libbuild2/buildfile | 12 | ||||
-rw-r--r-- | tests/libbuild2/driver.cxx | 24 | ||||
-rw-r--r-- | tests/libbuild2/testscript | 7 | ||||
-rw-r--r-- | tests/test/script/builtin/cp.testscript | 13 |
226 files changed, 1990 insertions, 1507 deletions
@@ -9,3 +9,9 @@ git clone --recursive https://git.build2.org/build2.git Alternatively, if you have already cloned without --recursive, run: git submodule update --init + +The checked out libbuild2/version.hxx and libbuild2/config.hxx will be +overwritten during the build process but these changes should be ignored. To +do this automatically, run: + +git update-index --assume-unchanged libbuild2/version.hxx libbuild2/config.hxx diff --git a/bootstrap-mingw.bat b/bootstrap-mingw.bat index a43278e..e2b51b7 100644 --- a/bootstrap-mingw.bat +++ b/bootstrap-mingw.bat @@ -72,6 +72,7 @@ set "src=%src% build2\test\script" set "src=%src% build2\version" set "src=%src% build2\install" set "src=%src% build2\in" +set "src=%src% libbuild2" set "src=%src% %libbutl%\libbutl" rem Get the compile options. diff --git a/bootstrap-msvc.bat b/bootstrap-msvc.bat index d9b4f5a..603395c 100644 --- a/bootstrap-msvc.bat +++ b/bootstrap-msvc.bat @@ -103,6 +103,7 @@ set "src=%src% build2\test\script" set "src=%src% build2\version" set "src=%src% build2\install" set "src=%src% build2\in" +set "src=%src% libbuild2" set "src=%src% %libbutl%\libbutl" rem Get the compile options. diff --git a/bootstrap.gmake b/bootstrap.gmake index 2aac8fc..e2fea35 100644 --- a/bootstrap.gmake +++ b/bootstrap.gmake @@ -129,42 +129,48 @@ endif # # Note: list nested subdirectories first (used in clean). # -sub_dirs := \ -config \ -dist \ -bin \ -c \ -cc \ -cxx \ -test/script \ -test \ -version \ -install \ +build2_sub := \ +config \ +dist \ +bin \ +c \ +cc \ +cxx \ +test/script \ +test \ +version \ +install \ in -build2_src := $(wildcard $(src_root)/build2/*.cxx) -build2_src += $(foreach d,$(sub_dirs),$(wildcard $(src_root)/build2/$d/*.cxx)) -libbutl_src := $(wildcard $(libbutl)/libbutl/*.cxx) +build2_src := $(wildcard $(src_root)/build2/*.cxx) +build2_src += $(foreach d,$(build2_sub),$(wildcard $(src_root)/build2/$d/*.cxx)) +libbuild2_src := $(wildcard $(src_root)/libbuild2/*.cxx) +libbutl_src := $(wildcard $(libbutl)/libbutl/*.cxx) # Filter out *.test.cxx sources. # -build2_src := $(filter-out %.test.cxx,$(build2_src)) -libbutl_src := $(filter-out %.test.cxx,$(libbutl_src)) +build2_src := $(filter-out %.test.cxx,$(build2_src)) +libbuild2_src := $(filter-out %.test.cxx,$(libbuild2_src)) +libbutl_src := $(filter-out %.test.cxx,$(libbutl_src)) # Note that we use the .b.o object file extension to avoid clashing with the # build2 builds. # -build2_obj := $(patsubst $(src_root)/%.cxx,$(out_root)/%.b.o,$(build2_src)) -libbutl_obj := $(patsubst $(libbutl)/libbutl/%.cxx,$(libbutl_out)/%.b.o,$(libbutl_src)) +build2_obj := $(patsubst $(src_root)/%.cxx,$(out_root)/%.b.o,$(build2_src)) +libbuild2_obj := $(patsubst $(src_root)/%.cxx,$(out_root)/%.b.o,$(libbuild2_src)) +libbutl_obj := $(patsubst $(libbutl)/libbutl/%.cxx,$(libbutl_out)/%.b.o,$(libbutl_src)) # Build. # -$(out_root)/build2/b-boot$(exe): $(build2_obj) $(libbutl_obj) +$(out_root)/build2/b-boot$(exe): $(build2_obj) $(libbuild2_obj) $(libbutl_obj) $(CXX) -std=c++1y $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) $(out_root)/build2/%.b.o: $(src_root)/build2/%.cxx | $$(dir $$@). $(CXX) -I$(libbutl) -I$(src_root) -DBUILD2_BOOTSTRAP -DBUILD2_HOST_TRIPLET=\"$(chost)\" $(CPPFLAGS) -std=c++1y $(CXXFLAGS) -o $@ -c $< +$(out_root)/libbuild2/%.b.o: $(src_root)/libbuild2/%.cxx | $$(dir $$@). + $(CXX) -I$(libbutl) -I$(src_root) -DBUILD2_BOOTSTRAP -DBUILD2_HOST_TRIPLET=\"$(chost)\" $(CPPFLAGS) -std=c++1y $(CXXFLAGS) -o $@ -c $< + $(libbutl_out)/%.b.o: $(libbutl)/libbutl/%.cxx | $$(dir $$@). $(CXX) -I$(libbutl) -DBUILD2_BOOTSTRAP $(CPPFLAGS) -std=c++1y $(CXXFLAGS) -o $@ -c $< @@ -181,10 +187,11 @@ all: $(out_root)/build2/b-boot$(exe) cleano: rm -f $(build2_obj) + rm -f $(libbuild2_obj) rm -f $(libbutl_obj) clean: cleano rm -f $(out_root)/build2/b-boot$(exe) ifeq ($(in_tree),false) - rm -fd $(foreach d,$(sub_dirs),$(out_root)/build2/$d) $(out_root)/build2 $(libbutl_out) + rm -fd $(foreach d,$(build2_sub),$(out_root)/build2/$d) $(out_root)/build2 $(out_root)/libbuild2 $(libbutl_out) endif diff --git a/bootstrap.sh b/bootstrap.sh index 6116550..4cacd74 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -130,6 +130,7 @@ src="$src build2/version/*.cxx" src="$src build2/install/*.cxx" src="$src build2/in/*.cxx" src="$src build2/bash/*.cxx" +src="$src libbuild2/*.cxx" src="$src $libbutl/libbutl/*.cxx" # Filter out *.test.cxx sources. diff --git a/build/export.build b/build/export.build index dc94fa4..8bca42a 100644 --- a/build/export.build +++ b/build/export.build @@ -7,4 +7,7 @@ $out_root/ include build2/ } -export $out_root/build2/exe{b} +if ($import.target == exe{b}) + export $out_root/build2/exe{b} +elif ($import.target == lib{build2}) + export $out_root/libbuild2/lib{build2} diff --git a/build/root.build b/build/root.build index 03e3fe6..9dbad8d 100644 --- a/build/root.build +++ b/build/root.build @@ -24,7 +24,7 @@ cxx.poptions =+ "-I$out_root" "-I$src_root" # While we don't have any C sources to compile, we need to get the C compiler # path to use as native/default. # -using c +using c.config # Load the cli module but only if it's available. This way a distribution # that includes pre-generated files can be built without installing cli. diff --git a/build2/.gitignore b/build2/.gitignore index 51b4c16..83bbed4 100644 --- a/build2/.gitignore +++ b/build2/.gitignore @@ -1,11 +1,11 @@ b b-boot -*.test + #*-options #*-options.?xx -config.hxx -version.hxx -# Testscript output directory (can be symlink). +# Unit test executables and Testscript output directories +# (can be symlinks). # +*.test test-*.test diff --git a/build2/b-options.hxx b/build2/b-options.hxx index 45666aa..c745025 100644 --- a/build2/b-options.hxx +++ b/build2/b-options.hxx @@ -365,7 +365,7 @@ namespace build2 #include <set> -#include <build2/types.hxx> +#include <libbuild2/types.hxx> namespace build2 { diff --git a/build2/b.cli b/build2/b.cli index 802a160..4ab397b 100644 --- a/build2/b.cli +++ b/build2/b.cli @@ -3,7 +3,7 @@ // license : MIT; see accompanying LICENSE file include <set>; -include <build2/types.hxx>; +include <libbuild2/types.hxx>; "\section=1" "\name=b" diff --git a/build2/b.cxx b/build2/b.cxx index 0eb007c..32d42aa 100644 --- a/build2/b.cxx +++ b/build2/b.cxx @@ -22,28 +22,31 @@ #include <libbutl/fdstream.mxx> // stderr_fd(), fdterm() #include <libbutl/backtrace.mxx> // backtrace() -#include <build2/types.hxx> -#include <build2/utility.hxx> - -#include <build2/dump.hxx> -#include <build2/file.hxx> -#include <build2/rule.hxx> -#include <build2/spec.hxx> -#include <build2/scope.hxx> -#include <build2/module.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/variable.hxx> -#include <build2/algorithm.hxx> -#include <build2/operation.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> -#include <build2/prerequisite.hxx> - -#include <build2/parser.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> + +#include <libbuild2/dump.hxx> +#include <libbuild2/file.hxx> +#include <libbuild2/rule.hxx> +#include <libbuild2/spec.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/module.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/operation.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> +#include <libbuild2/prerequisite.hxx> + +#include <libbuild2/parser.hxx> #include <build2/b-options.hxx> +#include <build2/config/utility.hxx> // config::save_variable() +#include <build2/config/operation.hxx> // config::preprocess_create() + using namespace butl; using namespace std; @@ -365,7 +368,7 @@ main (int argc, char* argv[]) // if (ops.version ()) { - cout << "build2 " << BUILD2_VERSION_ID << endl + cout << "build2 " << LIBBUILD2_VERSION_ID << endl << "libbutl " << LIBBUTL_VERSION_ID << endl << "host " << BUILD2_HOST_TRIPLET << endl << "Copyright (c) 2014-2019 Code Synthesis Ltd" << endl @@ -437,6 +440,10 @@ main (int argc, char* argv[]) auto& bm (builtin_modules); bm["config"] = mf {&config::boot, &config::init}; + + config_save_variable = &config::save_variable; + config_preprocess_create = &config::preprocess_create; + bm["dist"] = mf {&dist::boot, &dist::init}; bm["test"] = mf {&test::boot, &test::init}; bm["install"] = mf {&install::boot, &install::init}; diff --git a/build2/bash/init.cxx b/build2/bash/init.cxx index 6812f2b..83bfdb9 100644 --- a/build2/bash/init.cxx +++ b/build2/bash/init.cxx @@ -4,10 +4,10 @@ #include <build2/bash/init.hxx> -#include <build2/scope.hxx> -#include <build2/context.hxx> -#include <build2/variable.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/install/utility.hxx> diff --git a/build2/bash/init.hxx b/build2/bash/init.hxx index f4a82d7..2a7e95c 100644 --- a/build2/bash/init.hxx +++ b/build2/bash/init.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_BASH_INIT_HXX #define BUILD2_BASH_INIT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/bash/rule.cxx b/build2/bash/rule.cxx index 09cc930..72e3219 100644 --- a/build2/bash/rule.cxx +++ b/build2/bash/rule.cxx @@ -6,10 +6,10 @@ #include <cstring> // strlen(), strchr() -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/algorithm.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/in/target.hxx> diff --git a/build2/bash/rule.hxx b/build2/bash/rule.hxx index 9a1b161..6430947 100644 --- a/build2/bash/rule.hxx +++ b/build2/bash/rule.hxx @@ -5,8 +5,8 @@ #ifndef BUILD2_BASH_RULE_HXX #define BUILD2_BASH_RULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> #include <build2/in/rule.hxx> #include <build2/install/rule.hxx> diff --git a/build2/bash/target.cxx b/build2/bash/target.cxx index 8a4bd9e..e843d53 100644 --- a/build2/bash/target.cxx +++ b/build2/bash/target.cxx @@ -4,7 +4,7 @@ #include <build2/bash/target.hxx> -#include <build2/context.hxx> +#include <libbuild2/context.hxx> using namespace std; diff --git a/build2/bash/target.hxx b/build2/bash/target.hxx index d1ab5b1..6be83c4 100644 --- a/build2/bash/target.hxx +++ b/build2/bash/target.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_BASH_TARGET_HXX #define BUILD2_BASH_TARGET_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target.hxx> +#include <libbuild2/target.hxx> namespace build2 { diff --git a/build2/bash/utility.hxx b/build2/bash/utility.hxx index e7f72f4..31a6b99 100644 --- a/build2/bash/utility.hxx +++ b/build2/bash/utility.hxx @@ -5,8 +5,8 @@ #ifndef BUILD2_BASH_UTILITY_HXX #define BUILD2_BASH_UTILITY_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> namespace build2 { diff --git a/build2/bin/guess.cxx b/build2/bin/guess.cxx index c5effd7..d1b1545 100644 --- a/build2/bin/guess.cxx +++ b/build2/bin/guess.cxx @@ -4,7 +4,7 @@ #include <build2/bin/guess.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; diff --git a/build2/bin/guess.hxx b/build2/bin/guess.hxx index a9c7246..a3b2b34 100644 --- a/build2/bin/guess.hxx +++ b/build2/bin/guess.hxx @@ -5,8 +5,8 @@ #ifndef BUILD2_BIN_GUESS_HXX #define BUILD2_BIN_GUESS_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> namespace build2 { diff --git a/build2/bin/init.cxx b/build2/bin/init.cxx index cf47fbe..37fad6b 100644 --- a/build2/bin/init.cxx +++ b/build2/bin/init.cxx @@ -6,9 +6,9 @@ #include <map> -#include <build2/scope.hxx> -#include <build2/variable.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/config/utility.hxx> diff --git a/build2/bin/init.hxx b/build2/bin/init.hxx index c58dbfd..989dcaf 100644 --- a/build2/bin/init.hxx +++ b/build2/bin/init.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_BIN_INIT_HXX #define BUILD2_BIN_INIT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/bin/rule.cxx b/build2/bin/rule.cxx index 7eaa308..42ba86a 100644 --- a/build2/bin/rule.cxx +++ b/build2/bin/rule.cxx @@ -4,10 +4,10 @@ #include <build2/bin/rule.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/algorithm.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/bin/target.hxx> diff --git a/build2/bin/rule.hxx b/build2/bin/rule.hxx index 19902c9..4230933 100644 --- a/build2/bin/rule.hxx +++ b/build2/bin/rule.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_BIN_RULE_HXX #define BUILD2_BIN_RULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/rule.hxx> +#include <libbuild2/rule.hxx> namespace build2 { diff --git a/build2/bin/target.cxx b/build2/bin/target.cxx index c602f3b..46f19bd 100644 --- a/build2/bin/target.cxx +++ b/build2/bin/target.cxx @@ -4,7 +4,7 @@ #include <build2/bin/target.hxx> -#include <build2/context.hxx> +#include <libbuild2/context.hxx> using namespace std; diff --git a/build2/bin/target.hxx b/build2/bin/target.hxx index 1430477..a56c636 100644 --- a/build2/bin/target.hxx +++ b/build2/bin/target.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_BIN_TARGET_HXX #define BUILD2_BIN_TARGET_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target.hxx> +#include <libbuild2/target.hxx> namespace build2 { diff --git a/build2/buildfile b/build2/buildfile index ba8f25c..eb22266 100644 --- a/build2/buildfile +++ b/build2/buildfile @@ -5,14 +5,13 @@ import libs = libbutl%lib{butl} import libs += libpkgconf%lib{pkgconf} -./: exe{b}: {hxx ixx txx cxx}{+b} libue{b} +include ../libbuild2/ -libue{b}: {hxx ixx txx cxx}{** -b -b-options -config -version -**.test...} \ - {hxx ixx cxx}{b-options} {hxx}{config version} \ - $libs +./: exe{b}: {hxx ixx txx cxx}{+b} libue{b} -hxx{config}: in{config} -hxx{version}: in{version} $src_root/manifest +libue{b}: {hxx ixx txx cxx}{** -b -b-options -**.test...} \ + {hxx ixx cxx}{b-options} \ + ../libbuild2/lib{build2} $libs # Unit tests. # @@ -36,7 +35,7 @@ for t: cxx{**.test...} # # Pass our compiler target to be used as build2 host. # -obj{b context}: cxx.poptions += -DBUILD2_HOST_TRIPLET=\"$cxx.target\" +obj{b}: cxx.poptions += -DBUILD2_HOST_TRIPLET=\"$cxx.target\" # Pass native C and C++ compiler paths (not forgetting to escape backslashes # on Windows). These are used as defaults for BUILD2_DEFAULT_*. diff --git a/build2/c/init.cxx b/build2/c/init.cxx index 7c12fdd..08846a7 100644 --- a/build2/c/init.cxx +++ b/build2/c/init.cxx @@ -4,9 +4,9 @@ #include <build2/c/init.hxx> -#include <build2/scope.hxx> -#include <build2/context.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/cc/guess.hxx> #include <build2/cc/module.hxx> diff --git a/build2/c/init.hxx b/build2/c/init.hxx index 54cebf1..77119a9 100644 --- a/build2/c/init.hxx +++ b/build2/c/init.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_C_INIT_HXX #define BUILD2_C_INIT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/c/target.hxx b/build2/c/target.hxx index 3119758..486c29c 100644 --- a/build2/c/target.hxx +++ b/build2/c/target.hxx @@ -5,8 +5,8 @@ #ifndef BUILD2_C_TARGET_HXX #define BUILD2_C_TARGET_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> #include <build2/cc/target.hxx> diff --git a/build2/cc/common.cxx b/build2/cc/common.cxx index fa774d7..84ebbd5 100644 --- a/build2/cc/common.cxx +++ b/build2/cc/common.cxx @@ -4,13 +4,13 @@ #include <build2/cc/common.hxx> -#include <build2/file.hxx> // import() -#include <build2/scope.hxx> -#include <build2/context.hxx> -#include <build2/variable.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/file.hxx> // import() +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/cc/utility.hxx> diff --git a/build2/cc/common.hxx b/build2/cc/common.hxx index 6eccf23..c58a7f3 100644 --- a/build2/cc/common.hxx +++ b/build2/cc/common.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CC_COMMON_HXX #define BUILD2_CC_COMMON_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/variable.hxx> +#include <libbuild2/variable.hxx> #include <build2/bin/target.hxx> diff --git a/build2/cc/compile-rule.cxx b/build2/cc/compile-rule.cxx index a1796eb..c0c7eb3 100644 --- a/build2/cc/compile-rule.cxx +++ b/build2/cc/compile-rule.cxx @@ -7,14 +7,14 @@ #include <cstdlib> // exit() #include <cstring> // strlen(), strchr() -#include <build2/file.hxx> -#include <build2/depdb.hxx> -#include <build2/scope.hxx> -#include <build2/context.hxx> -#include <build2/variable.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> // mtime() -#include <build2/diagnostics.hxx> +#include <libbuild2/file.hxx> +#include <libbuild2/depdb.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> // mtime() +#include <libbuild2/diagnostics.hxx> #include <build2/bin/target.hxx> #include <build2/config/utility.hxx> // create_project() diff --git a/build2/cc/compile-rule.hxx b/build2/cc/compile-rule.hxx index ab19e1c..62127a7 100644 --- a/build2/cc/compile-rule.hxx +++ b/build2/cc/compile-rule.hxx @@ -5,11 +5,11 @@ #ifndef BUILD2_CC_COMPILE_RULE_HXX #define BUILD2_CC_COMPILE_RULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/rule.hxx> -#include <build2/filesystem.hxx> // auto_rmfile +#include <libbuild2/rule.hxx> +#include <libbuild2/filesystem.hxx> // auto_rmfile #include <build2/cc/types.hxx> #include <build2/cc/common.hxx> diff --git a/build2/cc/gcc.cxx b/build2/cc/gcc.cxx index 724c555..52cc386 100644 --- a/build2/cc/gcc.cxx +++ b/build2/cc/gcc.cxx @@ -2,12 +2,12 @@ // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/variable.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/bin/target.hxx> diff --git a/build2/cc/guess.cxx b/build2/cc/guess.cxx index f5db253..c74ccaf 100644 --- a/build2/cc/guess.cxx +++ b/build2/cc/guess.cxx @@ -7,7 +7,7 @@ #include <map> #include <cstring> // strlen(), strchr() -#include <build2/diagnostics.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; diff --git a/build2/cc/guess.hxx b/build2/cc/guess.hxx index b807446..1ab6e49 100644 --- a/build2/cc/guess.hxx +++ b/build2/cc/guess.hxx @@ -5,8 +5,8 @@ #ifndef BUILD2_CC_GUESS_HXX #define BUILD2_CC_GUESS_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> #include <build2/cc/types.hxx> diff --git a/build2/cc/init.cxx b/build2/cc/init.cxx index 882b205..18fba20 100644 --- a/build2/cc/init.cxx +++ b/build2/cc/init.cxx @@ -4,11 +4,11 @@ #include <build2/cc/init.hxx> -#include <build2/file.hxx> -#include <build2/scope.hxx> -#include <build2/context.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/file.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/config/utility.hxx> diff --git a/build2/cc/init.hxx b/build2/cc/init.hxx index e62da3e..98defde 100644 --- a/build2/cc/init.hxx +++ b/build2/cc/init.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CC_INIT_HXX #define BUILD2_CC_INIT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/cc/install-rule.cxx b/build2/cc/install-rule.cxx index 5f8722b..ce2424c 100644 --- a/build2/cc/install-rule.cxx +++ b/build2/cc/install-rule.cxx @@ -4,7 +4,7 @@ #include <build2/cc/install-rule.hxx> -#include <build2/algorithm.hxx> +#include <libbuild2/algorithm.hxx> #include <build2/bin/target.hxx> diff --git a/build2/cc/install-rule.hxx b/build2/cc/install-rule.hxx index 7616b61..ea966b8 100644 --- a/build2/cc/install-rule.hxx +++ b/build2/cc/install-rule.hxx @@ -5,8 +5,8 @@ #ifndef BUILD2_CC_INSTALL_RULE_HXX #define BUILD2_CC_INSTALL_RULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> #include <build2/install/rule.hxx> diff --git a/build2/cc/lexer.hxx b/build2/cc/lexer.hxx index c8b1042..5d5fa60 100644 --- a/build2/cc/lexer.hxx +++ b/build2/cc/lexer.hxx @@ -8,10 +8,10 @@ #include <libbutl/sha256.mxx> #include <libbutl/char-scanner.mxx> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/diagnostics.hxx> namespace build2 { diff --git a/build2/cc/lexer.test.cxx b/build2/cc/lexer.test.cxx index a2e33b7..4acc304 100644 --- a/build2/cc/lexer.test.cxx +++ b/build2/cc/lexer.test.cxx @@ -5,8 +5,8 @@ #include <cassert> #include <iostream> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> #include <build2/cc/lexer.hxx> diff --git a/build2/cc/link-rule.cxx b/build2/cc/link-rule.cxx index 9942f48..6dfcfa9 100644 --- a/build2/cc/link-rule.cxx +++ b/build2/cc/link-rule.cxx @@ -10,13 +10,13 @@ #include <libbutl/filesystem.mxx> // file_exists() -#include <build2/depdb.hxx> -#include <build2/scope.hxx> -#include <build2/context.hxx> -#include <build2/variable.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/depdb.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/bin/target.hxx> diff --git a/build2/cc/link-rule.hxx b/build2/cc/link-rule.hxx index 14a8570..487b1cd 100644 --- a/build2/cc/link-rule.hxx +++ b/build2/cc/link-rule.hxx @@ -7,10 +7,10 @@ #include <set> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/rule.hxx> +#include <libbuild2/rule.hxx> #include <build2/cc/types.hxx> #include <build2/cc/common.hxx> diff --git a/build2/cc/module.cxx b/build2/cc/module.cxx index 7ea790b..ec35444 100644 --- a/build2/cc/module.cxx +++ b/build2/cc/module.cxx @@ -6,9 +6,9 @@ #include <iomanip> // left, setw() -#include <build2/scope.hxx> -#include <build2/context.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/bin/target.hxx> diff --git a/build2/cc/module.hxx b/build2/cc/module.hxx index f277f95..a7f787f 100644 --- a/build2/cc/module.hxx +++ b/build2/cc/module.hxx @@ -5,11 +5,11 @@ #ifndef BUILD2_CC_MODULE_HXX #define BUILD2_CC_MODULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> -#include <build2/variable.hxx> +#include <libbuild2/module.hxx> +#include <libbuild2/variable.hxx> #include <build2/cc/common.hxx> diff --git a/build2/cc/msvc.cxx b/build2/cc/msvc.cxx index 08cd43c..e978f6a 100644 --- a/build2/cc/msvc.cxx +++ b/build2/cc/msvc.cxx @@ -4,13 +4,13 @@ #include <cstring> // strcmp() -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/variable.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/bin/target.hxx> diff --git a/build2/cc/parser.hxx b/build2/cc/parser.hxx index 2050dd1..3a588e9 100644 --- a/build2/cc/parser.hxx +++ b/build2/cc/parser.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CC_PARSER_HXX #define BUILD2_CC_PARSER_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/cc/types.hxx> diff --git a/build2/cc/parser.test.cxx b/build2/cc/parser.test.cxx index 2269a28..3b2da57 100644 --- a/build2/cc/parser.test.cxx +++ b/build2/cc/parser.test.cxx @@ -5,8 +5,8 @@ #include <cassert> #include <iostream> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> #include <build2/cc/parser.hxx> diff --git a/build2/cc/pkgconfig.cxx b/build2/cc/pkgconfig.cxx index dcf3cff..99715be 100644 --- a/build2/cc/pkgconfig.cxx +++ b/build2/cc/pkgconfig.cxx @@ -9,13 +9,13 @@ # include <libpkgconf/libpkgconf.h> #endif -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/variable.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/install/utility.hxx> diff --git a/build2/cc/target.cxx b/build2/cc/target.cxx index d31a38c..c637e60 100644 --- a/build2/cc/target.cxx +++ b/build2/cc/target.cxx @@ -4,7 +4,7 @@ #include <build2/cc/target.hxx> -#include <build2/context.hxx> +#include <libbuild2/context.hxx> using namespace std; diff --git a/build2/cc/target.hxx b/build2/cc/target.hxx index 6764fe5..fd6f6d5 100644 --- a/build2/cc/target.hxx +++ b/build2/cc/target.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CC_TARGET_HXX #define BUILD2_CC_TARGET_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target.hxx> +#include <libbuild2/target.hxx> namespace build2 { diff --git a/build2/cc/types.hxx b/build2/cc/types.hxx index 60c9a34..481c3c6 100644 --- a/build2/cc/types.hxx +++ b/build2/cc/types.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CC_TYPES_HXX #define BUILD2_CC_TYPES_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target-type.hxx> +#include <libbuild2/target-type.hxx> namespace build2 { diff --git a/build2/cc/utility.cxx b/build2/cc/utility.cxx index 2751032..2179c14 100644 --- a/build2/cc/utility.cxx +++ b/build2/cc/utility.cxx @@ -4,9 +4,9 @@ #include <build2/cc/utility.hxx> -#include <build2/file.hxx> -#include <build2/variable.hxx> -#include <build2/algorithm.hxx> // search() +#include <libbuild2/file.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/algorithm.hxx> // search() #include <build2/bin/rule.hxx> #include <build2/bin/target.hxx> diff --git a/build2/cc/utility.hxx b/build2/cc/utility.hxx index bc6c3fb..80ca741 100644 --- a/build2/cc/utility.hxx +++ b/build2/cc/utility.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CC_UTILITY_HXX #define BUILD2_CC_UTILITY_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target.hxx> +#include <libbuild2/target.hxx> #include <build2/bin/target.hxx> #include <build2/cc/types.hxx> diff --git a/build2/cc/windows-manifest.cxx b/build2/cc/windows-manifest.cxx index f890ad5..da12f0f 100644 --- a/build2/cc/windows-manifest.cxx +++ b/build2/cc/windows-manifest.cxx @@ -2,12 +2,12 @@ // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/variable.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/cc/link-rule.hxx> diff --git a/build2/cc/windows-rpath.cxx b/build2/cc/windows-rpath.cxx index 9ad2602..d18e36d 100644 --- a/build2/cc/windows-rpath.cxx +++ b/build2/cc/windows-rpath.cxx @@ -4,12 +4,12 @@ #include <errno.h> // E* -#include <build2/scope.hxx> -#include <build2/context.hxx> -#include <build2/variable.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/bin/target.hxx> diff --git a/build2/cli/init.cxx b/build2/cli/init.cxx index 35ef04e..24266ca 100644 --- a/build2/cli/init.cxx +++ b/build2/cli/init.cxx @@ -4,10 +4,10 @@ #include <build2/cli/init.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/variable.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/cxx/target.hxx> diff --git a/build2/cli/init.hxx b/build2/cli/init.hxx index e6a7079..341dc11 100644 --- a/build2/cli/init.hxx +++ b/build2/cli/init.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CLI_INIT_HXX #define BUILD2_CLI_INIT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/cli/rule.cxx b/build2/cli/rule.cxx index 2da5802..f6bebee 100644 --- a/build2/cli/rule.cxx +++ b/build2/cli/rule.cxx @@ -4,13 +4,13 @@ #include <build2/cli/rule.hxx> -#include <build2/depdb.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/depdb.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/cli/target.hxx> diff --git a/build2/cli/rule.hxx b/build2/cli/rule.hxx index 3603f47..e839999 100644 --- a/build2/cli/rule.hxx +++ b/build2/cli/rule.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CLI_RULE_HXX #define BUILD2_CLI_RULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/rule.hxx> +#include <libbuild2/rule.hxx> namespace build2 { diff --git a/build2/cli/target.cxx b/build2/cli/target.cxx index 33aff72..096295a 100644 --- a/build2/cli/target.cxx +++ b/build2/cli/target.cxx @@ -4,7 +4,7 @@ #include <build2/cli/target.hxx> -#include <build2/context.hxx> +#include <libbuild2/context.hxx> using namespace std; using namespace butl; diff --git a/build2/cli/target.hxx b/build2/cli/target.hxx index 44126ff..c6aa266 100644 --- a/build2/cli/target.hxx +++ b/build2/cli/target.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CLI_TARGET_HXX #define BUILD2_CLI_TARGET_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target.hxx> +#include <libbuild2/target.hxx> #include <build2/cxx/target.hxx> diff --git a/build2/config/init.cxx b/build2/config/init.cxx index 7b518ab..bd2d573 100644 --- a/build2/config/init.cxx +++ b/build2/config/init.cxx @@ -4,12 +4,12 @@ #include <build2/config/init.hxx> -#include <build2/file.hxx> -#include <build2/rule.hxx> -#include <build2/scope.hxx> -#include <build2/context.hxx> -#include <build2/filesystem.hxx> // exists() -#include <build2/diagnostics.hxx> +#include <libbuild2/file.hxx> +#include <libbuild2/rule.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/filesystem.hxx> // exists() +#include <libbuild2/diagnostics.hxx> #include <build2/config/module.hxx> #include <build2/config/utility.hxx> diff --git a/build2/config/init.hxx b/build2/config/init.hxx index 2ac0f96..5a9b66d 100644 --- a/build2/config/init.hxx +++ b/build2/config/init.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CONFIG_INIT_HXX #define BUILD2_CONFIG_INIT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/config/module.hxx b/build2/config/module.hxx index 10dac40..0c78b18 100644 --- a/build2/config/module.hxx +++ b/build2/config/module.hxx @@ -9,11 +9,11 @@ #include <libbutl/prefix-map.mxx> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> -#include <build2/variable.hxx> +#include <libbuild2/module.hxx> +#include <libbuild2/variable.hxx> namespace build2 { diff --git a/build2/config/operation.cxx b/build2/config/operation.cxx index f857330..ff5b44a 100644 --- a/build2/config/operation.cxx +++ b/build2/config/operation.cxx @@ -6,14 +6,14 @@ #include <set> -#include <build2/file.hxx> -#include <build2/spec.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/file.hxx> +#include <libbuild2/spec.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/config/module.hxx> #include <build2/config/utility.hxx> diff --git a/build2/config/operation.hxx b/build2/config/operation.hxx index 2892885..9f426ca 100644 --- a/build2/config/operation.hxx +++ b/build2/config/operation.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CONFIG_OPERATION_HXX #define BUILD2_CONFIG_OPERATION_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/operation.hxx> +#include <libbuild2/operation.hxx> namespace build2 { diff --git a/build2/config/utility.cxx b/build2/config/utility.cxx index e15c689..1ce07f7 100644 --- a/build2/config/utility.cxx +++ b/build2/config/utility.cxx @@ -4,10 +4,10 @@ #include <build2/config/utility.hxx> -#include <build2/file.hxx> -#include <build2/context.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/file.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/config/module.hxx> diff --git a/build2/config/utility.hxx b/build2/config/utility.hxx index eff1a02..5e4eac2 100644 --- a/build2/config/utility.hxx +++ b/build2/config/utility.hxx @@ -5,12 +5,12 @@ #ifndef BUILD2_CONFIG_UTILITY_HXX #define BUILD2_CONFIG_UTILITY_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/scope.hxx> -#include <build2/variable.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/diagnostics.hxx> namespace build2 { diff --git a/build2/config/utility.txx b/build2/config/utility.txx index b8e0acc..84650d9 100644 --- a/build2/config/utility.txx +++ b/build2/config/utility.txx @@ -2,8 +2,8 @@ // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/scope.hxx> -#include <build2/context.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> namespace build2 { diff --git a/build2/cxx/init.cxx b/build2/cxx/init.cxx index 518a823..9db5817 100644 --- a/build2/cxx/init.cxx +++ b/build2/cxx/init.cxx @@ -4,9 +4,9 @@ #include <build2/cxx/init.hxx> -#include <build2/scope.hxx> -#include <build2/context.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/cc/guess.hxx> #include <build2/cc/module.hxx> diff --git a/build2/cxx/init.hxx b/build2/cxx/init.hxx index 0a8bde9..83553e6 100644 --- a/build2/cxx/init.hxx +++ b/build2/cxx/init.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CXX_INIT_HXX #define BUILD2_CXX_INIT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/cxx/target.cxx b/build2/cxx/target.cxx index 1b7c1cf..025bf9d 100644 --- a/build2/cxx/target.cxx +++ b/build2/cxx/target.cxx @@ -4,7 +4,7 @@ #include <build2/cxx/target.hxx> -#include <build2/context.hxx> +#include <libbuild2/context.hxx> using namespace std; diff --git a/build2/cxx/target.hxx b/build2/cxx/target.hxx index 33959af..fabd3b6 100644 --- a/build2/cxx/target.hxx +++ b/build2/cxx/target.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_CXX_TARGET_HXX #define BUILD2_CXX_TARGET_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target.hxx> +#include <libbuild2/target.hxx> #include <build2/cc/target.hxx> namespace build2 diff --git a/build2/dist/init.cxx b/build2/dist/init.cxx index 56f676a..8edbccb 100644 --- a/build2/dist/init.cxx +++ b/build2/dist/init.cxx @@ -4,9 +4,9 @@ #include <build2/dist/init.hxx> -#include <build2/scope.hxx> -#include <build2/file.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/file.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/config/utility.hxx> diff --git a/build2/dist/init.hxx b/build2/dist/init.hxx index f337dad..0449a99 100644 --- a/build2/dist/init.hxx +++ b/build2/dist/init.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_DIST_INIT_HXX #define BUILD2_DIST_INIT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/dist/module.hxx b/build2/dist/module.hxx index 74d8854..cd0d9a3 100644 --- a/build2/dist/module.hxx +++ b/build2/dist/module.hxx @@ -5,11 +5,11 @@ #ifndef BUILD2_DIST_MODULE_HXX #define BUILD2_DIST_MODULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> -#include <build2/variable.hxx> +#include <libbuild2/module.hxx> +#include <libbuild2/variable.hxx> namespace build2 { diff --git a/build2/dist/operation.cxx b/build2/dist/operation.cxx index 3b247b2..ca90b50 100644 --- a/build2/dist/operation.cxx +++ b/build2/dist/operation.cxx @@ -9,14 +9,14 @@ #include <libbutl/filesystem.mxx> // path_match() -#include <build2/file.hxx> -#include <build2/dump.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/file.hxx> +#include <libbuild2/dump.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/dist/module.hxx> diff --git a/build2/dist/operation.hxx b/build2/dist/operation.hxx index 592bf8c..00d8664 100644 --- a/build2/dist/operation.hxx +++ b/build2/dist/operation.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_DIST_OPERATION_HXX #define BUILD2_DIST_OPERATION_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/operation.hxx> +#include <libbuild2/operation.hxx> namespace build2 { diff --git a/build2/dist/rule.cxx b/build2/dist/rule.cxx index 274e3c2..c877abc 100644 --- a/build2/dist/rule.cxx +++ b/build2/dist/rule.cxx @@ -4,10 +4,10 @@ #include <build2/dist/rule.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/algorithm.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; diff --git a/build2/dist/rule.hxx b/build2/dist/rule.hxx index b409118..accce4c 100644 --- a/build2/dist/rule.hxx +++ b/build2/dist/rule.hxx @@ -5,12 +5,12 @@ #ifndef BUILD2_DIST_RULE_HXX #define BUILD2_DIST_RULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/rule.hxx> -#include <build2/action.hxx> -#include <build2/target.hxx> +#include <libbuild2/rule.hxx> +#include <libbuild2/action.hxx> +#include <libbuild2/target.hxx> namespace build2 { diff --git a/build2/in/init.cxx b/build2/in/init.cxx index 1bd93e1..f01fe20 100644 --- a/build2/in/init.cxx +++ b/build2/in/init.cxx @@ -4,10 +4,10 @@ #include <build2/in/init.hxx> -#include <build2/scope.hxx> -#include <build2/context.hxx> -#include <build2/variable.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/in/rule.hxx> #include <build2/in/target.hxx> diff --git a/build2/in/init.hxx b/build2/in/init.hxx index a8482f8..3cf8ebf 100644 --- a/build2/in/init.hxx +++ b/build2/in/init.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_IN_INIT_HXX #define BUILD2_IN_INIT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/in/rule.cxx b/build2/in/rule.cxx index a6d4f2c..8a3244d 100644 --- a/build2/in/rule.cxx +++ b/build2/in/rule.cxx @@ -6,13 +6,13 @@ #include <cstdlib> // strtoull() -#include <build2/depdb.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/function.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/depdb.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/in/target.hxx> diff --git a/build2/in/rule.hxx b/build2/in/rule.hxx index b3430c5..71dc032 100644 --- a/build2/in/rule.hxx +++ b/build2/in/rule.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_IN_RULE_HXX #define BUILD2_IN_RULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/rule.hxx> +#include <libbuild2/rule.hxx> namespace build2 { diff --git a/build2/in/target.hxx b/build2/in/target.hxx index 2e735f8..47b0eed 100644 --- a/build2/in/target.hxx +++ b/build2/in/target.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_IN_TARGET_HXX #define BUILD2_IN_TARGET_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target.hxx> +#include <libbuild2/target.hxx> namespace build2 { diff --git a/build2/install/functions.cxx b/build2/install/functions.cxx index a097052..5780fd8 100644 --- a/build2/install/functions.cxx +++ b/build2/install/functions.cxx @@ -2,8 +2,8 @@ // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/function.hxx> -#include <build2/variable.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> #include <build2/install/utility.hxx> diff --git a/build2/install/init.cxx b/build2/install/init.cxx index 06bef86..055b8b1 100644 --- a/build2/install/init.cxx +++ b/build2/install/init.cxx @@ -4,12 +4,12 @@ #include <build2/install/init.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/rule.hxx> -#include <build2/function.hxx> -#include <build2/operation.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/rule.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/operation.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/config/utility.hxx> diff --git a/build2/install/init.hxx b/build2/install/init.hxx index 968ae93..579c03e 100644 --- a/build2/install/init.hxx +++ b/build2/install/init.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_INSTALL_INIT_HXX #define BUILD2_INSTALL_INIT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/install/operation.hxx b/build2/install/operation.hxx index 1cfbab5..7de0225 100644 --- a/build2/install/operation.hxx +++ b/build2/install/operation.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_INSTALL_OPERATION_HXX #define BUILD2_INSTALL_OPERATION_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/operation.hxx> +#include <libbuild2/operation.hxx> namespace build2 { diff --git a/build2/install/rule.cxx b/build2/install/rule.cxx index a17cc0d..faa7c3f 100644 --- a/build2/install/rule.cxx +++ b/build2/install/rule.cxx @@ -6,11 +6,11 @@ #include <libbutl/filesystem.mxx> // dir_exists(), file_exists() -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; using namespace butl; diff --git a/build2/install/rule.hxx b/build2/install/rule.hxx index 526683d..09dd1b5 100644 --- a/build2/install/rule.hxx +++ b/build2/install/rule.hxx @@ -5,13 +5,13 @@ #ifndef BUILD2_INSTALL_RULE_HXX #define BUILD2_INSTALL_RULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/rule.hxx> -#include <build2/action.hxx> -#include <build2/target.hxx> -#include <build2/filesystem.hxx> +#include <libbuild2/rule.hxx> +#include <libbuild2/action.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/filesystem.hxx> namespace build2 { diff --git a/build2/install/utility.hxx b/build2/install/utility.hxx index 2544630..29c6db0 100644 --- a/build2/install/utility.hxx +++ b/build2/install/utility.hxx @@ -5,11 +5,11 @@ #ifndef BUILD2_INSTALL_UTILITY_HXX #define BUILD2_INSTALL_UTILITY_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> namespace build2 { diff --git a/build2/test/common.cxx b/build2/test/common.cxx index 161ba94..bbfd489 100644 --- a/build2/test/common.cxx +++ b/build2/test/common.cxx @@ -4,8 +4,8 @@ #include <build2/test/common.hxx> -#include <build2/target.hxx> -#include <build2/algorithm.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/algorithm.hxx> using namespace std; diff --git a/build2/test/common.hxx b/build2/test/common.hxx index f5d31c3..7ee72bd 100644 --- a/build2/test/common.hxx +++ b/build2/test/common.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_TEST_COMMON_HXX #define BUILD2_TEST_COMMON_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target.hxx> +#include <libbuild2/target.hxx> namespace build2 { diff --git a/build2/test/init.cxx b/build2/test/init.cxx index 342add7..725d557 100644 --- a/build2/test/init.cxx +++ b/build2/test/init.cxx @@ -4,10 +4,10 @@ #include <build2/test/init.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/rule.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/rule.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/config/utility.hxx> diff --git a/build2/test/init.hxx b/build2/test/init.hxx index 2ef0af7..f429645 100644 --- a/build2/test/init.hxx +++ b/build2/test/init.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_TEST_INIT_HXX #define BUILD2_TEST_INIT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/test/module.hxx b/build2/test/module.hxx index 02ba492..0c32fb9 100644 --- a/build2/test/module.hxx +++ b/build2/test/module.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_TEST_MODULE_HXX #define BUILD2_TEST_MODULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> #include <build2/test/rule.hxx> #include <build2/test/common.hxx> diff --git a/build2/test/operation.hxx b/build2/test/operation.hxx index 9b5f8db..09b954e 100644 --- a/build2/test/operation.hxx +++ b/build2/test/operation.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_TEST_OPERATION_HXX #define BUILD2_TEST_OPERATION_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/operation.hxx> +#include <libbuild2/operation.hxx> namespace build2 { diff --git a/build2/test/rule.cxx b/build2/test/rule.cxx index a67ceff..7cb830c 100644 --- a/build2/test/rule.cxx +++ b/build2/test/rule.cxx @@ -4,11 +4,11 @@ #include <build2/test/rule.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/test/target.hxx> @@ -548,7 +548,7 @@ namespace build2 diag_frame::stack_guard dsg (ds); r = perform_script_impl (t, ts, wd, *this); }, - diag_frame::stack, + diag_frame::stack (), ref (r), cref (t), cref (ts), diff --git a/build2/test/rule.hxx b/build2/test/rule.hxx index 81952f9..2f0ef53 100644 --- a/build2/test/rule.hxx +++ b/build2/test/rule.hxx @@ -5,11 +5,11 @@ #ifndef BUILD2_TEST_RULE_HXX #define BUILD2_TEST_RULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/rule.hxx> -#include <build2/action.hxx> +#include <libbuild2/rule.hxx> +#include <libbuild2/action.hxx> #include <build2/test/common.hxx> diff --git a/build2/test/script/builtin.cxx b/build2/test/script/builtin.cxx index e4eb895..14ea267 100644 --- a/build2/test/script/builtin.cxx +++ b/build2/test/script/builtin.cxx @@ -15,7 +15,7 @@ #include <libbutl/fdstream.mxx> // fdopen_mode, fdstream_mode #include <libbutl/filesystem.mxx> -#include <build2/context.hxx> // sched +#include <libbuild2/context.hxx> // sched #include <build2/test/script/script.hxx> diff --git a/build2/test/script/builtin.hxx b/build2/test/script/builtin.hxx index 2c6c0c5..af7c809 100644 --- a/build2/test/script/builtin.hxx +++ b/build2/test/script/builtin.hxx @@ -7,8 +7,8 @@ #include <map> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> namespace build2 { diff --git a/build2/test/script/lexer.hxx b/build2/test/script/lexer.hxx index 5ab0cc0..ad1c386 100644 --- a/build2/test/script/lexer.hxx +++ b/build2/test/script/lexer.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_TEST_SCRIPT_LEXER_HXX #define BUILD2_TEST_SCRIPT_LEXER_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/lexer.hxx> +#include <libbuild2/lexer.hxx> #include <build2/test/script/token.hxx> diff --git a/build2/test/script/lexer.test.cxx b/build2/test/script/lexer.test.cxx index 56418b7..c9905ec 100644 --- a/build2/test/script/lexer.test.cxx +++ b/build2/test/script/lexer.test.cxx @@ -5,8 +5,8 @@ #include <cassert> #include <iostream> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> #include <build2/test/script/token.hxx> #include <build2/test/script/lexer.hxx> diff --git a/build2/test/script/parser.cxx b/build2/test/script/parser.cxx index 2ae0b05..59b950f 100644 --- a/build2/test/script/parser.cxx +++ b/build2/test/script/parser.cxx @@ -6,7 +6,7 @@ #include <sstream> -#include <build2/context.hxx> // sched, keep_going +#include <libbuild2/context.hxx> // sched, keep_going #include <build2/test/script/lexer.hxx> #include <build2/test/script/runner.hxx> @@ -3013,7 +3013,9 @@ namespace build2 // If the scope was executed synchronously, check the status // and bail out if we weren't asked to keep going. // - const diag_frame* df (diag_frame::stack); // UBSan workaround. + // UBSan workaround. + // + const diag_frame* df (diag_frame::stack ()); if (!sched.async (task_count, [] (const diag_frame* ds, scope& s, diff --git a/build2/test/script/parser.hxx b/build2/test/script/parser.hxx index 9ca0cf1..dfa1126 100644 --- a/build2/test/script/parser.hxx +++ b/build2/test/script/parser.hxx @@ -5,11 +5,11 @@ #ifndef BUILD2_TEST_SCRIPT_PARSER_HXX #define BUILD2_TEST_SCRIPT_PARSER_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/parser.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/parser.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/test/script/token.hxx> #include <build2/test/script/script.hxx> diff --git a/build2/test/script/parser.test.cxx b/build2/test/script/parser.test.cxx index ea5da0a..352941a 100644 --- a/build2/test/script/parser.test.cxx +++ b/build2/test/script/parser.test.cxx @@ -5,12 +5,12 @@ #include <cassert> #include <iostream> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> // reset() -#include <build2/scheduler.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> // reset() +#include <libbuild2/scheduler.hxx> #include <build2/test/target.hxx> diff --git a/build2/test/script/regex.hxx b/build2/test/script/regex.hxx index 70de7ee..500c21b 100644 --- a/build2/test/script/regex.hxx +++ b/build2/test/script/regex.hxx @@ -12,8 +12,8 @@ #include <type_traits> // make_unsigned, enable_if, is_* #include <unordered_set> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> namespace build2 { diff --git a/build2/test/script/runner.cxx b/build2/test/script/runner.cxx index 0d3716f..9031211 100644 --- a/build2/test/script/runner.cxx +++ b/build2/test/script/runner.cxx @@ -10,9 +10,9 @@ #include <libbutl/regex.mxx> #include <libbutl/fdstream.mxx> // fdopen_mode, fdnull(), fddup() -#include <build2/variable.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/test/common.hxx> diff --git a/build2/test/script/runner.hxx b/build2/test/script/runner.hxx index 843ff52..5f70dcc 100644 --- a/build2/test/script/runner.hxx +++ b/build2/test/script/runner.hxx @@ -5,8 +5,8 @@ #ifndef BUILD2_TEST_SCRIPT_RUNNER_HXX #define BUILD2_TEST_SCRIPT_RUNNER_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> #include <build2/test/script/script.hxx> diff --git a/build2/test/script/script.cxx b/build2/test/script/script.cxx index 865c798..8e6351f 100644 --- a/build2/test/script/script.cxx +++ b/build2/test/script/script.cxx @@ -6,8 +6,8 @@ #include <sstream> -#include <build2/target.hxx> -#include <build2/algorithm.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/algorithm.hxx> using namespace std; diff --git a/build2/test/script/script.hxx b/build2/test/script/script.hxx index 4da9d97..cc162cb 100644 --- a/build2/test/script/script.hxx +++ b/build2/test/script/script.hxx @@ -7,10 +7,10 @@ #include <set> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/variable.hxx> +#include <libbuild2/variable.hxx> #include <build2/test/target.hxx> diff --git a/build2/test/script/token.hxx b/build2/test/script/token.hxx index d239787..c79ef1b 100644 --- a/build2/test/script/token.hxx +++ b/build2/test/script/token.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_TEST_SCRIPT_TOKEN_HXX #define BUILD2_TEST_SCRIPT_TOKEN_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/token.hxx> +#include <libbuild2/token.hxx> namespace build2 { diff --git a/build2/test/target.hxx b/build2/test/target.hxx index b8b2d3d..6cd07b9 100644 --- a/build2/test/target.hxx +++ b/build2/test/target.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_TEST_TARGET_HXX #define BUILD2_TEST_TARGET_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target.hxx> +#include <libbuild2/target.hxx> namespace build2 { diff --git a/build2/types-parsers.hxx b/build2/types-parsers.hxx index 5aa9d37..beea977 100644 --- a/build2/types-parsers.hxx +++ b/build2/types-parsers.hxx @@ -8,7 +8,7 @@ #ifndef BUILD2_TYPES_PARSERS_HXX #define BUILD2_TYPES_PARSERS_HXX -#include <build2/types.hxx> +#include <libbuild2/types.hxx> namespace build2 { diff --git a/build2/version/init.cxx b/build2/version/init.cxx index 77fb35d..8c9cd42 100644 --- a/build2/version/init.cxx +++ b/build2/version/init.cxx @@ -6,10 +6,10 @@ #include <libbutl/manifest-parser.mxx> -#include <build2/scope.hxx> -#include <build2/context.hxx> -#include <build2/variable.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/config/utility.hxx> diff --git a/build2/version/init.hxx b/build2/version/init.hxx index 1e23371..ef3688a 100644 --- a/build2/version/init.hxx +++ b/build2/version/init.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_VERSION_INIT_HXX #define BUILD2_VERSION_INIT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/version/module.hxx b/build2/version/module.hxx index 1c6e637..d2b681c 100644 --- a/build2/version/module.hxx +++ b/build2/version/module.hxx @@ -7,10 +7,10 @@ #include <map> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> +#include <libbuild2/module.hxx> namespace build2 { diff --git a/build2/version/rule.cxx b/build2/version/rule.cxx index 674defd..912efe3 100644 --- a/build2/version/rule.cxx +++ b/build2/version/rule.cxx @@ -4,9 +4,9 @@ #include <build2/version/rule.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/diagnostics.hxx> #include <build2/in/target.hxx> diff --git a/build2/version/rule.hxx b/build2/version/rule.hxx index 2813f87..8eb4830 100644 --- a/build2/version/rule.hxx +++ b/build2/version/rule.hxx @@ -5,8 +5,8 @@ #ifndef BUILD2_VERSION_RULE_HXX #define BUILD2_VERSION_RULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> #include <build2/in/rule.hxx> #include <build2/install/rule.hxx> diff --git a/build2/version/snapshot.cxx b/build2/version/snapshot.cxx index aa58a6e..b43e083 100644 --- a/build2/version/snapshot.cxx +++ b/build2/version/snapshot.cxx @@ -4,7 +4,7 @@ #include <build2/version/snapshot.hxx> -#include <build2/filesystem.hxx> +#include <libbuild2/filesystem.hxx> using namespace std; diff --git a/build2/version/snapshot.hxx b/build2/version/snapshot.hxx index 78ad174..824ec89 100644 --- a/build2/version/snapshot.hxx +++ b/build2/version/snapshot.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_VERSION_SNAPSHOT_HXX #define BUILD2_VERSION_SNAPSHOT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/scope.hxx> +#include <libbuild2/scope.hxx> namespace build2 { diff --git a/build2/version/utility.cxx b/build2/version/utility.cxx index 6c4d43e..8286ff8 100644 --- a/build2/version/utility.cxx +++ b/build2/version/utility.cxx @@ -7,7 +7,7 @@ #include <libbutl/manifest-parser.mxx> #include <libbutl/manifest-serializer.mxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/diagnostics.hxx> using namespace butl; diff --git a/build2/version/utility.hxx b/build2/version/utility.hxx index 5baebeb..83bb91c 100644 --- a/build2/version/utility.hxx +++ b/build2/version/utility.hxx @@ -5,10 +5,10 @@ #ifndef BUILD2_VERSION_UTILITY_HXX #define BUILD2_VERSION_UTILITY_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/filesystem.hxx> +#include <libbuild2/filesystem.hxx> namespace build2 { diff --git a/libbuild2/.gitignore b/libbuild2/.gitignore new file mode 100644 index 0000000..292d2f8 --- /dev/null +++ b/libbuild2/.gitignore @@ -0,0 +1,5 @@ +# Unit test executables and Testscript output directories +# (can be symlinks). +# +*.test +test-*.test diff --git a/build2/action.hxx b/libbuild2/action.hxx index eeb73fd..9fa2a16 100644 --- a/build2/action.hxx +++ b/libbuild2/action.hxx @@ -1,12 +1,14 @@ -// file : build2/action.hxx -*- C++ -*- +// file : libbuild2/action.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_ACTION_HXX -#define BUILD2_ACTION_HXX +#ifndef LIBBUILD2_ACTION_HXX +#define LIBBUILD2_ACTION_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -106,7 +108,7 @@ namespace build2 bool operator>= (action, action) = delete; bool operator<= (action, action) = delete; - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, action); // operation.cxx // Inner/outer operation state container. @@ -197,4 +199,4 @@ namespace build2 enum class execution_mode {first, last}; } -#endif // BUILD2_ACTION_HXX +#endif // LIBBUILD2_ACTION_HXX diff --git a/build2/algorithm.cxx b/libbuild2/algorithm.cxx index 892767a..963714b 100644 --- a/build2/algorithm.cxx +++ b/libbuild2/algorithm.cxx @@ -1,18 +1,18 @@ -// file : build2/algorithm.cxx -*- C++ -*- +// file : libbuild2/algorithm.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/algorithm.hxx> +#include <libbuild2/algorithm.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/rule.hxx> -#include <build2/file.hxx> // import() -#include <build2/search.hxx> -#include <build2/context.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> -#include <build2/prerequisite.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/rule.hxx> +#include <libbuild2/file.hxx> // import() +#include <libbuild2/search.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> +#include <libbuild2/prerequisite.hxx> using namespace std; using namespace butl; @@ -104,12 +104,27 @@ namespace build2 // target_lock // + static #ifdef __cpp_thread_local thread_local #else __thread #endif - const target_lock* target_lock::stack = nullptr; + const target_lock* target_lock_stack = nullptr; + + const target_lock* target_lock:: + stack () noexcept + { + return target_lock_stack; + } + + const target_lock* target_lock:: + stack (const target_lock* s) noexcept + { + const target_lock* r (target_lock_stack); + target_lock_stack = s; + return r; + } // If the work_queue is absent, then we don't wait. // @@ -601,8 +616,8 @@ namespace build2 } catch (const failed&) {} // Phase lock failure. }, - diag_frame::stack, - target_lock::stack, + diag_frame::stack (), + target_lock::stack (), ref (*ld.target), ld.offset)) return make_pair (true, target_state::postponed); // Queued. @@ -798,11 +813,11 @@ namespace build2 // Instantiate only for what we need. // - template void + template LIBBUILD2_SYMEXPORT void match_members<const target*> (action, target&, const target* const*, size_t); - template void + template LIBBUILD2_SYMEXPORT void match_members<prerequisite_target> (action, target&, prerequisite_target const*, size_t); @@ -1580,7 +1595,7 @@ namespace build2 diag_frame::stack_guard dsg (ds); execute_impl (a, t); }, - diag_frame::stack, + diag_frame::stack (), ref (t))) return target_state::unknown; // Queued. @@ -1763,19 +1778,19 @@ namespace build2 // Instantiate only for what we need. // - template target_state + template LIBBUILD2_SYMEXPORT target_state straight_execute_members<const target*> ( action, atomic_count&, const target*[], size_t, size_t); - template target_state + template LIBBUILD2_SYMEXPORT target_state reverse_execute_members<const target*> ( action, atomic_count&, const target*[], size_t, size_t); - template target_state + template LIBBUILD2_SYMEXPORT target_state straight_execute_members<prerequisite_target> ( action, atomic_count&, prerequisite_target[], size_t, size_t); - template target_state + template LIBBUILD2_SYMEXPORT target_state reverse_execute_members<prerequisite_target> ( action, atomic_count&, prerequisite_target[], size_t, size_t); diff --git a/build2/algorithm.hxx b/libbuild2/algorithm.hxx index b246c37..50e8423 100644 --- a/build2/algorithm.hxx +++ b/libbuild2/algorithm.hxx @@ -1,15 +1,17 @@ -// file : build2/algorithm.hxx -*- C++ -*- +// file : libbuild2/algorithm.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_ALGORITHM_HXX -#define BUILD2_ALGORITHM_HXX +#ifndef LIBBUILD2_ALGORITHM_HXX +#define LIBBUILD2_ALGORITHM_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/action.hxx> -#include <build2/target.hxx> +#include <libbuild2/action.hxx> +#include <libbuild2/target.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -36,10 +38,10 @@ namespace build2 // As above but specify the prerequisite to search as a key. // - const target& + LIBBUILD2_SYMEXPORT const target& search (const target&, const prerequisite_key&); - const target* + LIBBUILD2_SYMEXPORT const target* search_existing (const prerequisite_key&); // Uniform search interface for prerequisite/prerequisite_member. @@ -91,13 +93,13 @@ namespace build2 // first created a prerequisite based on this name in exactly the same way // as the parser would and then searched based on this prerequisite. // - const target& + LIBBUILD2_SYMEXPORT const target& search (const target&, name, const scope&); // Unlike the above version, this one can be called during the execute // phase. Return NULL for unknown target types. // - const target* + LIBBUILD2_SYMEXPORT const target* search_existing (const name&, const scope&, const dir_path& out = dir_path ()); @@ -108,7 +110,7 @@ namespace build2 // maintain a stack of active locks in the current dependency chain (used to // detect dependency cycles). // - struct target_lock + struct LIBBUILD2_SYMEXPORT target_lock { using action_type = build2::action; using target_type = build2::target; @@ -146,13 +148,16 @@ namespace build2 data release (); - static -#ifdef __cpp_thread_local - thread_local -#else - __thread -#endif - const target_lock* stack; // Tip of the stack. + // Tip of the stack. + // + static const target_lock* + stack () noexcept; + + // Set the new and return the previous tip of the stack. + // + static const target_lock* + stack (const target_lock*) noexcept; + const target_lock* prev; void @@ -160,8 +165,8 @@ namespace build2 struct stack_guard { - explicit stack_guard (const target_lock* s): s_ (stack) {stack = s;} - ~stack_guard () {stack = s_;} + explicit stack_guard (const target_lock* s): s_ (stack (s)) {} + ~stack_guard () {stack (s_);} const target_lock* s_; }; }; @@ -198,7 +203,7 @@ namespace build2 // things like changing the ad hoc member name by declaring it in a // buildfile. // - target& + LIBBUILD2_SYMEXPORT target& add_adhoc_member (target&, const target_type&, const dir_path& dir, @@ -336,7 +341,7 @@ namespace build2 // prerequisites for the clean operation. If this target is a member of a // group, then first do this to the group's prerequisites. // - using match_search =function< + using match_search = function< prerequisite_target (action, const target&, const prerequisite&, @@ -433,7 +438,7 @@ namespace build2 // the target is in src tree). This can be used, for example, to place // output into an otherwise non-existent directory. // - const fsdir* + LIBBUILD2_SYMEXPORT const fsdir* inject_fsdir (action, target&, bool parent = true); // Execute the action on target, assuming a rule has been matched and the @@ -493,7 +498,7 @@ namespace build2 // Note: waits for the completion if the target is busy and translates // target_state::failed to the failed exception. // - target_state + LIBBUILD2_SYMEXPORT target_state execute_direct (action, const target&); // The default prerequisite execute implementation. Call execute_async() on @@ -656,36 +661,36 @@ namespace build2 // Return noop_recipe instead of using this function directly. // - target_state + LIBBUILD2_SYMEXPORT target_state noop_action (action, const target&); // Default action implementation which forwards to the prerequisites. // Use default_recipe instead of using this function directly. // - target_state + LIBBUILD2_SYMEXPORT target_state default_action (action, const target&); // Standard perform(clean) action implementation for the file target // (or derived). // - target_state + LIBBUILD2_SYMEXPORT target_state perform_clean (action, const target&); // As above, but also removes the auxiliary dependency database (.d file). // - target_state + LIBBUILD2_SYMEXPORT target_state perform_clean_depdb (action, const target&); // As above but clean the target group. The group should be an mtime_target // and members should be files. // - target_state + LIBBUILD2_SYMEXPORT target_state perform_clean_group (action, const target&); // As above but clean both the target group and depdb. The depdb file path // is derived from the first member file path. // - target_state + LIBBUILD2_SYMEXPORT target_state perform_clean_group_depdb (action, const target&); // Helper for custom perform(clean) implementations that cleans extra files @@ -721,7 +726,7 @@ namespace build2 using clean_adhoc_extras = small_vector<clean_adhoc_extra, 2>; - target_state + LIBBUILD2_SYMEXPORT target_state perform_clean_extra (action, const file&, const clean_extras&, const clean_adhoc_extras& = {}); @@ -745,29 +750,29 @@ namespace build2 overwrite // Copy over but don't remove on clean (committed gen code). }; - void + LIBBUILD2_SYMEXPORT void update_backlink (const file& target, const path& link, bool changed, backlink_mode = backlink_mode::link); - void + LIBBUILD2_SYMEXPORT void update_backlink (const path& target, const path& link, bool changed, backlink_mode = backlink_mode::link); - void + LIBBUILD2_SYMEXPORT void update_backlink (const path& target, const path& link, backlink_mode = backlink_mode::link); - void + LIBBUILD2_SYMEXPORT void clean_backlink (const path& link, uint16_t verbosity, backlink_mode = backlink_mode::link); } -#include <build2/algorithm.ixx> +#include <libbuild2/algorithm.ixx> -#endif // BUILD2_ALGORITHM_HXX +#endif // LIBBUILD2_ALGORITHM_HXX diff --git a/build2/algorithm.ixx b/libbuild2/algorithm.ixx index c79ee49..7d68611 100644 --- a/build2/algorithm.ixx +++ b/libbuild2/algorithm.ixx @@ -1,9 +1,11 @@ -// file : build2/algorithm.ixx -*- C++ -*- +// file : libbuild2/algorithm.ixx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/rule.hxx> -#include <build2/context.hxx> +#include <libbuild2/rule.hxx> +#include <libbuild2/context.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -117,10 +119,10 @@ namespace build2 t, T::static_type, dir, out, name, ext, scope).template as<T> (); } - target_lock + LIBBUILD2_SYMEXPORT target_lock lock_impl (action, const target&, optional<scheduler::work_queue>); - void + LIBBUILD2_SYMEXPORT void unlock_impl (action, target&, size_t); inline target_lock:: @@ -128,10 +130,7 @@ namespace build2 : action (a), target (t), offset (o) { if (target != nullptr) - { - prev = stack; - stack = this; - } + prev = stack (this); } inline void target_lock:: @@ -139,8 +138,8 @@ namespace build2 { if (target != nullptr && prev != this) { - assert (stack == this); - stack = prev; + const target_lock* cur (stack (prev)); + assert (cur == this); prev = this; } } @@ -154,8 +153,8 @@ namespace build2 if (prev != this) { - assert (stack == this); - stack = prev; + const target_lock* cur (stack (prev)); + assert (cur == this); } target = nullptr; @@ -171,8 +170,8 @@ namespace build2 { if (prev != this) { - assert (stack == this); - stack = prev; + const target_lock* cur (stack (prev)); + assert (cur == this); } target = nullptr; @@ -195,9 +194,9 @@ namespace build2 { if (x.prev != &x) { - assert (stack == &x); + const target_lock* cur (stack (this)); + assert (cur == &x); prev = x.prev; - stack = this; } else prev = this; @@ -221,9 +220,9 @@ namespace build2 { if (x.prev != &x) { - assert (stack == &x); + const target_lock* cur (stack (this)); + assert (cur == &x); prev = x.prev; - stack = this; } else prev = this; @@ -238,7 +237,7 @@ namespace build2 inline const target_lock* dependency_cycle (action a, const target& t) { - const target_lock* l (target_lock::stack); + const target_lock* l (target_lock::stack ()); for (; l != nullptr; l = l->prev) { @@ -291,13 +290,13 @@ namespace build2 return m; } - const rule_match* + LIBBUILD2_SYMEXPORT const rule_match* match_impl (action, target&, const rule* skip, bool try_match = false); - recipe + LIBBUILD2_SYMEXPORT recipe apply_impl (action, target&, const rule_match&); - pair<bool, target_state> + LIBBUILD2_SYMEXPORT pair<bool, target_state> match (action, const target&, size_t, atomic_count*, bool try_match = false); inline void @@ -470,7 +469,7 @@ namespace build2 return match (a.inner_action (), t, um); } - group_view + LIBBUILD2_SYMEXPORT group_view resolve_members_impl (action, const target&, target_lock); inline group_view @@ -508,7 +507,7 @@ namespace build2 return r; } - void + LIBBUILD2_SYMEXPORT void resolve_group_impl (action, const target&, target_lock); inline const target* @@ -540,10 +539,10 @@ namespace build2 return t.group; } - void + LIBBUILD2_SYMEXPORT void match_prerequisites (action, target&, const match_search&, const scope*); - void + LIBBUILD2_SYMEXPORT void match_prerequisite_members (action, target&, const match_search_member&, const scope*); @@ -597,7 +596,7 @@ namespace build2 match_prerequisite_members (a, t, nullptr, &s); } - target_state + LIBBUILD2_SYMEXPORT target_state execute (action, const target&, size_t, atomic_count*); inline target_state @@ -708,7 +707,7 @@ namespace build2 // If the first argument is NULL, then the result is treated as a boolean // value. // - pair<optional<target_state>, const target*> + LIBBUILD2_SYMEXPORT pair<optional<target_state>, const target*> execute_prerequisites (const target_type*, action, const target&, const timestamp&, const execute_filter&, diff --git a/libbuild2/buildfile b/libbuild2/buildfile new file mode 100644 index 0000000..99f616c --- /dev/null +++ b/libbuild2/buildfile @@ -0,0 +1,85 @@ +# file : libbuild2/buildfile +# copyright : Copyright (c) 2014-2019 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +import int_libs = libbutl%lib{butl} + +./: lib{build2}: libul{build2}: {hxx ixx txx cxx}{** -config \ + -version \ + -**.test...} \ + {hxx}{config version} \ + $int_libs + +# Include the generated config and version headers into the distribution (so +# that we don't pick up installed ones) and don't remove them when cleaning in +# src (so that clean results in a state identical to distributed). +# +hxx{config}: in{config} +hxx{version}: in{version} $src_root/manifest + +hxx{config version}: +{ + dist = true + clean = ($src_root != $out_root) +} + +# Unit tests. +# +exe{*.test}: +{ + test = true + install = false +} + +for t: cxx{**.test...} +{ + d = $directory($t) + n = $name($t)... + b = $path.base($name($t)) + + ./: $d/exe{$n}: $t $d/{hxx ixx txx}{+$n} $d/testscript{+$n +$b+*.test...} + $d/exe{$n}: libul{build2}: bin.whole = false +} + +# Build options. +# +obja{*}: cxx.poptions += -DLIBBUILD2_STATIC_BUILD +objs{*}: cxx.poptions += -DLIBBUILD2_SHARED_BUILD + +# Pass our compiler target to be used as libbuild2 host. +# +obj{context}: cxx.poptions += -DBUILD2_HOST_TRIPLET=\"$cxx.target\" +obja{context}: cxx.poptions += -DLIBBUILD2_STATIC_BUILD +objs{context}: cxx.poptions += -DLIBBUILD2_SHARED_BUILD + +if ($cxx.target.class != "windows") + cxx.libs += -lpthread + +# Export options. +# +lib{build2}: +{ + cxx.export.poptions = "-I$out_root" "-I$src_root" + cxx.export.libs = $int_libs +} + +liba{build2}: cxx.export.poptions += -DLIBBUILD2_STATIC +libs{build2}: cxx.export.poptions += -DLIBBUILD2_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}: bin.lib.version = @"-$version.project_id" +else + lib{build2}: bin.lib.version = @"-$version.major.$version.minor" + +# Install into the libbuild2/ subdirectory of, say, /usr/include/ +# recreating subdirectories. +# +{hxx ixx txx}{*}: +{ + install = include/libbuild2/ + install.subdirs = true +} diff --git a/libbuild2/config.hxx b/libbuild2/config.hxx new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/libbuild2/config.hxx diff --git a/build2/config.hxx.in b/libbuild2/config.hxx.in index 07499b1..62110da 100644 --- a/build2/config.hxx.in +++ b/libbuild2/config.hxx.in @@ -1,16 +1,16 @@ -// file : build2/config.hxx.in -*- C++ -*- +// file : libbuild2/config.hxx.in -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -// This file is included by <build2/types.hxx> so normally you don't need to -// include it directly. Note that this file is included unprocessed (i.e., as -// an .in) during bootstrap. +// This file is included by <libbuild2/types.hxx> so normally you don't need +// to include it directly. Note that this file is included unprocessed (i.e., +// as an .in) during bootstrap. // // Also, note that some BUILD_* configuration macros are passed directly from // the buildfile with the -D options. -#ifndef BUILD2_CONFIG_HXX -#define BUILD2_CONFIG_HXX +#ifndef LIBBUILD2_CONFIG_HXX +#define LIBBUILD2_CONFIG_HXX // Currently the value is adjusted manually during release but in the future // the idea is to use version metadata (e.g., 1.2.3-a.1+0.stage). This way it @@ -19,19 +19,19 @@ // toolchain. Bootstrap will be a problem though. (Maybe set it to nullptr and // say that it shall not be queried?) // -#define BUILD2_STAGE true +#define LIBBUILD2_STAGE true // Modification time sanity checks are by default only enabled for the staged // version but this can be overridden at runtime with --[no-]mtime-check. // -#if BUILD2_STAGE -# define BUILD2_MTIME_CHECK true +#if LIBBUILD2_STAGE +# define LIBBUILD2_MTIME_CHECK true #else -# define BUILD2_MTIME_CHECK false +# define LIBBUILD2_MTIME_CHECK false #endif #ifdef BUILD2_BOOTSTRAP #else #endif -#endif // BUILD2_CONFIG_HXX +#endif // LIBBUILD2_CONFIG_HXX diff --git a/build2/context.cxx b/libbuild2/context.cxx index e71201d..d56abb3 100644 --- a/build2/context.cxx +++ b/libbuild2/context.cxx @@ -1,26 +1,24 @@ -// file : build2/context.cxx -*- C++ -*- +// file : libbuild2/context.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/context.hxx> +#include <libbuild2/context.hxx> #include <sstream> #include <exception> // uncaught_exception[s]() -#include <build2/rule.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/rule.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/diagnostics.hxx> #include <libbutl/ft/exception.hxx> // uncaught_exceptions // For command line variable parsing. // -#include <build2/token.hxx> -#include <build2/lexer.hxx> -#include <build2/parser.hxx> - -#include <build2/config/operation.hxx> // config::preprocess_create(). +#include <libbuild2/token.hxx> +#include <libbuild2/lexer.hxx> +#include <libbuild2/parser.hxx> using namespace std; using namespace butl; @@ -34,13 +32,6 @@ namespace build2 size_t load_generation; -#ifdef __cpp_thread_local - thread_local -#else - __thread -#endif - phase_lock* phase_lock::instance; - bool phase_mutex:: lock (run_phase p) { @@ -216,11 +207,19 @@ namespace build2 // phase_lock // + static +#ifdef __cpp_thread_local + thread_local +#else + __thread +#endif + phase_lock* phase_lock_instance; + phase_lock:: phase_lock (run_phase p) : p (p) { - if (phase_lock* l = instance) + if (phase_lock* l = phase_lock_instance) assert (l->p == p); else { @@ -230,7 +229,7 @@ namespace build2 throw failed (); } - instance = this; + phase_lock_instance = this; //text << this_thread::get_id () << " phase acquire " << p; } @@ -239,9 +238,9 @@ namespace build2 phase_lock:: ~phase_lock () { - if (instance == this) + if (phase_lock_instance == this) { - instance = nullptr; + phase_lock_instance = nullptr; phase_mutex::instance.unlock (p); //text << this_thread::get_id () << " phase release " << p; @@ -252,11 +251,11 @@ namespace build2 // phase_unlock:: phase_unlock (bool u) - : l (u ? phase_lock::instance : nullptr) + : l (u ? phase_lock_instance : nullptr) { if (u) { - phase_lock::instance = nullptr; + phase_lock_instance = nullptr; phase_mutex::instance.unlock (l->p); //text << this_thread::get_id () << " phase unlock " << l->p; @@ -269,7 +268,7 @@ namespace build2 if (l != nullptr) { bool r (phase_mutex::instance.lock (l->p)); - phase_lock::instance = l; + phase_lock_instance = l; // Fail unless we are already failing. Note that we keep the phase // locked since there will be phase_lock down the stack to unlock it. @@ -293,7 +292,7 @@ namespace build2 throw failed (); } - phase_lock::instance->p = n; + phase_lock_instance->p = n; if (n == run_phase::load) // Note: load lock is exclusive. load_generation++; @@ -315,7 +314,7 @@ namespace build2 } bool r (phase_mutex::instance.relock (n, o)); - phase_lock::instance->p = o; + phase_lock_instance->p = o; // Similar logic to ~phase_unlock(). // @@ -366,6 +365,14 @@ namespace build2 bool keep_going = false; bool dry_run = false; + void (*config_save_variable) (scope&, const variable&, uint64_t); + + const string& (*config_preprocess_create) (const variable_overrides&, + values&, + vector_view<opspec>&, + bool, + const location&); + variable_overrides reset (const strings& cmd_vars) { @@ -386,15 +393,18 @@ namespace build2 vp.clear (); // Reset meta/operation tables. Note that the order should match the id - // constants in <build2/operation.hxx>. + // constants in <libbuild2/operation.hxx>. // meta_operation_table.clear (); meta_operation_table.insert ("noop"); meta_operation_table.insert ("perform"); meta_operation_table.insert ("configure"); meta_operation_table.insert ("disfigure"); - meta_operation_table.insert ( - meta_operation_data ("create", &config::preprocess_create)); + + if (config_preprocess_create != nullptr) + meta_operation_table.insert ( + meta_operation_data ("create", config_preprocess_create)); + meta_operation_table.insert ("dist"); meta_operation_table.insert ("info"); @@ -481,7 +491,7 @@ namespace build2 // Note that it is either staged or public, without queued, since we do // not re-package things during the queued-to-public transition. // - set ("build.version.stage", BUILD2_STAGE); + set ("build.version.stage", LIBBUILD2_STAGE); } // Enter the host information. Rather than jumping through hoops like diff --git a/build2/context.hxx b/libbuild2/context.hxx index 5799eef..66874e7 100644 --- a/build2/context.hxx +++ b/libbuild2/context.hxx @@ -1,23 +1,25 @@ -// file : build2/context.hxx -*- C++ -*- +// file : libbuild2/context.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_CONTEXT_HXX -#define BUILD2_CONTEXT_HXX +#ifndef LIBBUILD2_CONTEXT_HXX +#define LIBBUILD2_CONTEXT_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/scope.hxx> -#include <build2/variable.hxx> -#include <build2/operation.hxx> -#include <build2/scheduler.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/operation.hxx> +#include <libbuild2/scheduler.hxx> + +#include <libbuild2/export.hxx> namespace build2 { // Main (and only) scheduler. Started up and shut down in main(). // - extern scheduler sched; + LIBBUILD2_SYMEXPORT extern scheduler sched; // In order to perform each operation the build system goes through the // following phases: @@ -50,8 +52,8 @@ namespace build2 // various "nodes" to verify modifications are only done "within the // islands". // - extern run_phase phase; - extern size_t load_generation; + LIBBUILD2_SYMEXPORT extern run_phase phase; + LIBBUILD2_SYMEXPORT extern size_t load_generation; // A "tri-mutex" that keeps all the threads in one of the three phases. When // a thread wants to switch a phase, it has to wait for all the other @@ -78,7 +80,7 @@ namespace build2 // false. Note that in this case we still switch to the desired phase. See // the phase_{lock,switch,unlock} implementations for details. // - class phase_mutex + class LIBBUILD2_SYMEXPORT phase_mutex { public: // Acquire a phase lock potentially blocking (unless already in the @@ -190,7 +192,7 @@ namespace build2 // 3. Before calling wait(), we release our phase lock to allow switching // the phase. // - struct phase_lock + struct LIBBUILD2_SYMEXPORT phase_lock { explicit phase_lock (run_phase); ~phase_lock (); @@ -202,20 +204,12 @@ namespace build2 phase_lock& operator= (const phase_lock&) = delete; run_phase p; - - static -#ifdef __cpp_thread_local - thread_local -#else - __thread -#endif - phase_lock* instance; }; // Assuming we have a lock on the current phase, temporarily release it // and reacquire on destruction. // - struct phase_unlock + struct LIBBUILD2_SYMEXPORT phase_unlock { phase_unlock (bool unlock = true); ~phase_unlock () noexcept (false); @@ -226,7 +220,7 @@ namespace build2 // Assuming we have a lock on the current phase, temporarily switch to a // new phase and switch back on destruction. // - struct phase_switch + struct LIBBUILD2_SYMEXPORT phase_switch { explicit phase_switch (run_phase); ~phase_switch () noexcept (false); @@ -270,23 +264,32 @@ namespace build2 // // Note: consider printing in info meta-operation if adding anything here. // - extern const variable* var_src_root; - extern const variable* var_out_root; - extern const variable* var_src_base; - extern const variable* var_out_base; - extern const variable* var_forwarded; + LIBBUILD2_SYMEXPORT extern const variable* var_src_root; + LIBBUILD2_SYMEXPORT extern const variable* var_out_root; + LIBBUILD2_SYMEXPORT extern const variable* var_src_base; + LIBBUILD2_SYMEXPORT extern const variable* var_out_base; + LIBBUILD2_SYMEXPORT extern const variable* var_forwarded; - extern const variable* var_project; - extern const variable* var_amalgamation; - extern const variable* var_subprojects; - extern const variable* var_version; + LIBBUILD2_SYMEXPORT extern const variable* var_project; + LIBBUILD2_SYMEXPORT extern const variable* var_amalgamation; + LIBBUILD2_SYMEXPORT extern const variable* var_subprojects; + LIBBUILD2_SYMEXPORT extern const variable* var_version; + + // project.url + // + LIBBUILD2_SYMEXPORT extern const variable* var_project_url; - extern const variable* var_project_url; // project.url - extern const variable* var_project_summary; // project.summary + // project.summary + // + LIBBUILD2_SYMEXPORT extern const variable* var_project_summary; - extern const variable* var_import_target; // import.target + // import.target + // + LIBBUILD2_SYMEXPORT extern const variable* var_import_target; - extern const variable* var_clean; // [bool] target visibility + // [bool] target visibility + // + LIBBUILD2_SYMEXPORT extern const variable* var_clean; // Forwarded configuration backlink mode. Valid values are: // @@ -299,7 +302,9 @@ namespace build2 // // Note that it can be set by a matching rule as a rule-specific variable. // - extern const variable* var_backlink; // [string] target visibility + // [string] target visibility + // + LIBBUILD2_SYMEXPORT extern const variable* var_backlink; // Prerequisite inclusion/exclusion. Valid values are: // @@ -324,13 +329,17 @@ namespace build2 // To query this value in rule implementations use the include() helpers // from prerequisites.hxx. // - extern const variable* var_include; // [string] prereq visibility + // [string] prereq visibility + // + LIBBUILD2_SYMEXPORT extern const variable* var_include; - extern const char var_extension[10]; // "extension" + LIBBUILD2_SYMEXPORT extern const char var_extension[10]; // "extension" // The build.* namespace. // - extern const variable* var_build_meta_operation; // .meta_operation + // .meta_operation + // + LIBBUILD2_SYMEXPORT extern const variable* var_build_meta_operation; // Current action (meta/operation). // @@ -338,23 +347,25 @@ namespace build2 // lifted. The name is always for an outer operation (or meta operation // that hasn't been recognized as such yet). // - extern string current_mname; - extern string current_oname; + LIBBUILD2_SYMEXPORT extern string current_mname; + LIBBUILD2_SYMEXPORT extern string current_oname; - extern const meta_operation_info* current_mif; - extern const operation_info* current_inner_oif; - extern const operation_info* current_outer_oif; - extern size_t current_on; // Current operation number (1-based) in the - // meta-operation batch. + LIBBUILD2_SYMEXPORT extern const meta_operation_info* current_mif; + LIBBUILD2_SYMEXPORT extern const operation_info* current_inner_oif; + LIBBUILD2_SYMEXPORT extern const operation_info* current_outer_oif; + + // Current operation number (1-based) in the meta-operation batch. + // + LIBBUILD2_SYMEXPORT extern size_t current_on; - extern execution_mode current_mode; + LIBBUILD2_SYMEXPORT extern execution_mode current_mode; // Some diagnostics (for example output directory creation/removal by the // fsdir rule) is just noise at verbosity level 1 unless it is the only // thing that is printed. So we can only suppress it in certain situations // (e.g., dist) where we know we have already printed something. // - extern bool current_diag_noise; + LIBBUILD2_SYMEXPORT extern bool current_diag_noise; // Total number of dependency relationships and targets with non-noop // recipe in the current action. @@ -368,9 +379,9 @@ namespace build2 // skipped executing the operation, then it should increment the skip count. // These two counters are used for progress monitoring and diagnostics. // - extern atomic_count dependency_count; - extern atomic_count target_count; - extern atomic_count skip_count; + LIBBUILD2_SYMEXPORT extern atomic_count dependency_count; + LIBBUILD2_SYMEXPORT extern atomic_count target_count; + LIBBUILD2_SYMEXPORT extern atomic_count skip_count; inline void set_current_mif (const meta_operation_info& mif) @@ -410,7 +421,7 @@ namespace build2 // serially. In parallel we queue most of the things up before we see any // failures. // - extern bool keep_going; + LIBBUILD2_SYMEXPORT extern bool keep_going; // Dry run flag (see --dry-run|-n). // @@ -443,12 +454,24 @@ namespace build2 // from filesystem) that respect this flag in order not to end up with a // job half done. // - extern bool dry_run; + LIBBUILD2_SYMEXPORT extern bool dry_run; + + // Config module entry points. + // + LIBBUILD2_SYMEXPORT extern void (*config_save_variable) ( + scope&, const variable&, uint64_t flags); + + LIBBUILD2_SYMEXPORT extern const string& (*config_preprocess_create) ( + const variable_overrides&, + values&, + vector_view<opspec>&, + bool lifted, + const location&); // Reset the build state. In particular, this removes all the targets, // scopes, and variables. // - variable_overrides + LIBBUILD2_SYMEXPORT variable_overrides reset (const strings& cmd_vars); // Return the project name or empty string if unnamed. @@ -463,17 +486,17 @@ namespace build2 // Return the src/out directory corresponding to the given out/src. The // passed directory should be a sub-directory of out/src_root. // - dir_path + LIBBUILD2_SYMEXPORT dir_path src_out (const dir_path& out, const scope& root); - dir_path + LIBBUILD2_SYMEXPORT dir_path src_out (const dir_path& out, const dir_path& out_root, const dir_path& src_root); - dir_path + LIBBUILD2_SYMEXPORT dir_path out_src (const dir_path& src, const scope& root); - dir_path + LIBBUILD2_SYMEXPORT dir_path out_src (const dir_path& src, const dir_path& out_root, const dir_path& src_root); @@ -498,10 +521,10 @@ namespace build2 return os; } - string + LIBBUILD2_SYMEXPORT string diag_do (const action&); - void + LIBBUILD2_SYMEXPORT void diag_do (ostream&, const action&, const target&); inline diag_phrase @@ -510,10 +533,10 @@ namespace build2 return diag_phrase {a, t, &diag_do}; } - string + LIBBUILD2_SYMEXPORT string diag_doing (const action&); - void + LIBBUILD2_SYMEXPORT void diag_doing (ostream&, const action&, const target&); inline diag_phrase @@ -522,10 +545,10 @@ namespace build2 return diag_phrase {a, t, &diag_doing}; } - string + LIBBUILD2_SYMEXPORT string diag_did (const action&); - void + LIBBUILD2_SYMEXPORT void diag_did (ostream&, const action&, const target&); inline diag_phrase @@ -534,7 +557,7 @@ namespace build2 return diag_phrase {a, t, &diag_did}; } - void + LIBBUILD2_SYMEXPORT void diag_done (ostream&, const action&, const target&); inline diag_phrase @@ -544,6 +567,6 @@ namespace build2 } } -#include <build2/context.ixx> +#include <libbuild2/context.ixx> -#endif // BUILD2_CONTEXT_HXX +#endif // LIBBUILD2_CONTEXT_HXX diff --git a/build2/context.ixx b/libbuild2/context.ixx index 1c25922..f947bd7 100644 --- a/build2/context.ixx +++ b/libbuild2/context.ixx @@ -1,4 +1,4 @@ -// file : build2/context.ixx -*- C++ -*- +// file : libbuild2/context.ixx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file diff --git a/build2/depdb.cxx b/libbuild2/depdb.cxx index 607e85a..32e5916 100644 --- a/build2/depdb.cxx +++ b/libbuild2/depdb.cxx @@ -1,15 +1,15 @@ -// file : build2/depdb.cxx -*- C++ -*- +// file : libbuild2/depdb.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/depdb.hxx> +#include <libbuild2/depdb.hxx> #ifdef _WIN32 # include <libbutl/win32-utility.hxx> #endif -#include <build2/filesystem.hxx> // mtime() -#include <build2/diagnostics.hxx> +#include <libbuild2/filesystem.hxx> // mtime() +#include <libbuild2/diagnostics.hxx> using namespace std; using namespace butl; diff --git a/build2/depdb.hxx b/libbuild2/depdb.hxx index 95d9f4b..8a1cd1f 100644 --- a/build2/depdb.hxx +++ b/libbuild2/depdb.hxx @@ -1,14 +1,16 @@ -// file : build2/depdb.hxx -*- C++ -*- +// file : libbuild2/depdb.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_DEPDB_HXX -#define BUILD2_DEPDB_HXX +#ifndef LIBBUILD2_DEPDB_HXX +#define LIBBUILD2_DEPDB_HXX #include <cstring> // strlen() -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -58,7 +60,7 @@ namespace build2 // also used to handle the dry-run mode where we essentially do the // interruption ourselves. // - struct depdb_base + struct LIBBUILD2_SYMEXPORT depdb_base { explicit depdb_base (const path&, timestamp); @@ -76,7 +78,7 @@ namespace build2 butl::fdbuf* buf_; // Current buffer (for tellg()/tellp()). }; - class depdb: private depdb_base + class LIBBUILD2_SYMEXPORT depdb: private depdb_base { public: using path_type = build2::path; @@ -281,6 +283,6 @@ namespace build2 }; } -#include <build2/depdb.ixx> +#include <libbuild2/depdb.ixx> -#endif // BUILD2_DEPDB_HXX +#endif // LIBBUILD2_DEPDB_HXX diff --git a/build2/depdb.ixx b/libbuild2/depdb.ixx index cf67434..9f73fcb 100644 --- a/build2/depdb.ixx +++ b/libbuild2/depdb.ixx @@ -1,4 +1,4 @@ -// file : build2/depdb.ixx -*- C++ -*- +// file : libbuild2/depdb.ixx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file @@ -23,7 +23,7 @@ namespace build2 inline bool depdb:: mtime_check () { - return mtime_check_option ? *mtime_check_option : BUILD2_MTIME_CHECK; + return mtime_check_option ? *mtime_check_option : LIBBUILD2_MTIME_CHECK; } inline void depdb:: diff --git a/build2/diagnostics.cxx b/libbuild2/diagnostics.cxx index ac95c64..eab3b78 100644 --- a/build2/diagnostics.cxx +++ b/libbuild2/diagnostics.cxx @@ -1,8 +1,8 @@ -// file : build2/diagnostics.cxx -*- C++ -*- +// file : libbuild2/diagnostics.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/diagnostics.hxx> +#include <libbuild2/diagnostics.hxx> #include <cstring> // strchr() @@ -53,12 +53,27 @@ namespace build2 // Diagnostics stack. // + static #ifdef __cpp_thread_local thread_local #else __thread #endif - const diag_frame* diag_frame::stack = nullptr; + const diag_frame* diag_frame_stack = nullptr; + + const diag_frame* diag_frame:: + stack () noexcept + { + return diag_frame_stack; + } + + const diag_frame* diag_frame:: + stack (const diag_frame* f) noexcept + { + const diag_frame* r (diag_frame_stack); + diag_frame_stack = f; + return r; + } // Diagnostic facility, project specifics. // diff --git a/build2/diagnostics.hxx b/libbuild2/diagnostics.hxx index 992e741..9ad18ff 100644 --- a/build2/diagnostics.hxx +++ b/libbuild2/diagnostics.hxx @@ -1,14 +1,16 @@ -// file : build2/diagnostics.hxx -*- C++ -*- +// file : libbuild2/diagnostics.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_DIAGNOSTICS_HXX -#define BUILD2_DIAGNOSTICS_HXX +#ifndef LIBBUILD2_DIAGNOSTICS_HXX +#define LIBBUILD2_DIAGNOSTICS_HXX #include <libbutl/diagnostics.mxx> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -29,10 +31,10 @@ namespace build2 // ... // nameN arg arg ... nullptr nullptr // - void + LIBBUILD2_SYMEXPORT void print_process (diag_record&, const char* const* args, size_t n = 0); - void + LIBBUILD2_SYMEXPORT void print_process (const char* const* args, size_t n = 0); inline void @@ -126,7 +128,7 @@ namespace build2 /* */ stream_verbosity (0, 1); } - extern const int stream_verb_index; + LIBBUILD2_SYMEXPORT extern const int stream_verb_index; inline stream_verbosity stream_verb (ostream& os) @@ -173,17 +175,14 @@ namespace build2 // object optimization of std::function. So we have to complicate things // a bit here. // - struct diag_frame + struct LIBBUILD2_SYMEXPORT diag_frame { explicit diag_frame (void (*f) (const diag_frame&, const diag_record&)) : func_ (f) { if (func_ != nullptr) - { - prev_ = stack; - stack = this; - } + prev_ = stack (this); } diag_frame (diag_frame&& x) @@ -192,7 +191,7 @@ namespace build2 if (func_ != nullptr) { prev_ = x.prev_; - stack = this; + stack (this); x.func_ = nullptr; } @@ -206,28 +205,30 @@ namespace build2 ~diag_frame () { if (func_ != nullptr ) - stack = prev_; + stack (prev_); } static void apply (const diag_record& r) { - for (const diag_frame* f (stack); f != nullptr; f = f->prev_) + for (const diag_frame* f (stack ()); f != nullptr; f = f->prev_) f->func_ (*f, r); } - static -#ifdef __cpp_thread_local - thread_local -#else - __thread -#endif - const diag_frame* stack; // Tip of the stack. + // Tip of the stack. + // + static const diag_frame* + stack () noexcept; + + // Set the new and return the previous tip of the stack. + // + static const diag_frame* + stack (const diag_frame*) noexcept; struct stack_guard { - explicit stack_guard (const diag_frame* s): s_ (stack) {stack = s;} - ~stack_guard () {stack = s_;} + explicit stack_guard (const diag_frame* s): s_ (stack (s)) {} + ~stack_guard () {stack (s_);} const diag_frame* s_; }; @@ -261,7 +262,7 @@ namespace build2 // Diagnostic facility, project specifics. // - struct simple_prologue_base + struct LIBBUILD2_SYMEXPORT simple_prologue_base { explicit simple_prologue_base (const char* type, @@ -280,7 +281,7 @@ namespace build2 const stream_verbosity sverb_; }; - struct location_prologue_base + struct LIBBUILD2_SYMEXPORT location_prologue_base { location_prologue_base (const char* type, const char* mod, @@ -367,10 +368,10 @@ namespace build2 }; using basic_mark = butl::diag_mark<basic_mark_base>; - extern const basic_mark error; - extern const basic_mark warn; - extern const basic_mark info; - extern const basic_mark text; + LIBBUILD2_SYMEXPORT extern const basic_mark error; + LIBBUILD2_SYMEXPORT extern const basic_mark warn; + LIBBUILD2_SYMEXPORT extern const basic_mark info; + LIBBUILD2_SYMEXPORT extern const basic_mark text; // trace // @@ -428,8 +429,8 @@ namespace build2 }; using fail_end = butl::diag_noreturn_end<fail_end_base>; - extern const fail_mark fail; - extern const fail_end endf; + LIBBUILD2_SYMEXPORT extern const fail_mark fail; + LIBBUILD2_SYMEXPORT extern const fail_end endf; } -#endif // BUILD2_DIAGNOSTICS_HXX +#endif // LIBBUILD2_DIAGNOSTICS_HXX diff --git a/build2/dump.cxx b/libbuild2/dump.cxx index 3b5d205..a866fe3 100644 --- a/build2/dump.cxx +++ b/libbuild2/dump.cxx @@ -1,14 +1,14 @@ -// file : build2/dump.cxx -*- C++ -*- +// file : libbuild2/dump.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/dump.hxx> +#include <libbuild2/dump.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/variable.hxx> -#include <build2/context.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; diff --git a/build2/dump.hxx b/libbuild2/dump.hxx index f8e3d03..fd1886b 100644 --- a/build2/dump.hxx +++ b/libbuild2/dump.hxx @@ -1,14 +1,16 @@ -// file : build2/dump.hxx -*- C++ -*- +// file : libbuild2/dump.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_DUMP_HXX -#define BUILD2_DUMP_HXX +#ifndef LIBBUILD2_DUMP_HXX +#define LIBBUILD2_DUMP_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/action.hxx> +#include <libbuild2/action.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -19,14 +21,14 @@ namespace build2 // rules have been matched for this action and dump action-specific // information (like rule-specific variables). // - void + LIBBUILD2_SYMEXPORT void dump (optional<action> = nullopt); - void + LIBBUILD2_SYMEXPORT void dump (const scope&, const char* ind = ""); - void + LIBBUILD2_SYMEXPORT void dump (const target&, const char* ind = ""); } -#endif // BUILD2_DUMP_HXX +#endif // LIBBUILD2_DUMP_HXX diff --git a/libbuild2/export.hxx b/libbuild2/export.hxx new file mode 100644 index 0000000..514c845 --- /dev/null +++ b/libbuild2/export.hxx @@ -0,0 +1,58 @@ +#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. +// +// Exportation of explicit template instantiations is even hairier: MinGW GCC +// requires __declspec(dllexport) on the extern template declaration while VC +// wants it on the definition. Use LIBBUILD2_{DEC,DEF}EXPORT for that. +// + +#if defined(LIBBUILD2_STATIC) // Using static. +# define LIBBUILD2_SYMEXPORT +# define LIBBUILD2_DECEXPORT +#elif defined(LIBBUILD2_STATIC_BUILD) // Building static. +# define LIBBUILD2_SYMEXPORT +# define LIBBUILD2_DECEXPORT +# define LIBBUILD2_DEFEXPORT +#elif defined(LIBBUILD2_SHARED) // Using shared. +# ifdef _WIN32 +# define LIBBUILD2_SYMEXPORT __declspec(dllimport) +# define LIBBUILD2_DECEXPORT __declspec(dllimport) +# else +# define LIBBUILD2_SYMEXPORT +# define LIBBUILD2_DECEXPORT +# endif +#elif defined(LIBBUILD2_SHARED_BUILD) // Building shared. +# ifdef _WIN32 +# define LIBBUILD2_SYMEXPORT __declspec(dllexport) +# if defined(_MSC_VER) +# define LIBBUILD2_DECEXPORT +# define LIBBUILD2_DEFEXPORT __declspec(dllexport) +# else +# define LIBBUILD2_DECEXPORT __declspec(dllexport) +# define LIBBUILD2_DEFEXPORT +# endif +# else +# define LIBBUILD2_SYMEXPORT +# define LIBBUILD2_DECEXPORT +# define LIBBUILD2_DEFEXPORT +# 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. Also note that +// bootstrap ends up here as well. +// +// Using static or shared. +// +# define LIBBUILD2_SYMEXPORT +# define LIBBUILD2_DECEXPORT +# define LIBBUILD2_DEFEXPORT +#endif diff --git a/build2/file.cxx b/libbuild2/file.cxx index 8c7c74c..5966168 100644 --- a/build2/file.cxx +++ b/libbuild2/file.cxx @@ -1,23 +1,21 @@ -// file : build2/file.cxx -*- C++ -*- +// file : libbuild2/file.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/file.hxx> +#include <libbuild2/file.hxx> #include <iostream> // cin -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/filesystem.hxx> // exists() -#include <build2/prerequisite.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/filesystem.hxx> // exists() +#include <libbuild2/prerequisite.hxx> +#include <libbuild2/diagnostics.hxx> -#include <build2/token.hxx> -#include <build2/lexer.hxx> -#include <build2/parser.hxx> - -#include <build2/config/utility.hxx> +#include <libbuild2/token.hxx> +#include <libbuild2/lexer.hxx> +#include <libbuild2/parser.hxx> using namespace std; using namespace butl; @@ -1292,7 +1290,11 @@ namespace build2 if (auto l = iroot[var]) { out_root = cast<dir_path> (l); // Normalized and actualized. - config::save_variable (iroot, var); // Mark as part of config. + + // Mark as part of config. + // + if (config_save_variable != nullptr) + config_save_variable (iroot, var, 0 /* flags */); // Empty config.import.* value means don't look in subprojects or // amalgamations and go straight to the rule-specific import (e.g., @@ -1331,7 +1333,8 @@ namespace build2 if (r.empty ()) fail (loc) << "empty path in " << var.name; - config::save_variable (iroot, var); + if (config_save_variable != nullptr) + config_save_variable (iroot, var, 0 /* flags */); } return r; diff --git a/build2/file.hxx b/libbuild2/file.hxx index c46d2d5..e2e8aaa 100644 --- a/build2/file.hxx +++ b/libbuild2/file.hxx @@ -1,17 +1,19 @@ -// file : build2/file.hxx -*- C++ -*- +// file : libbuild2/file.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_FILE_HXX -#define BUILD2_FILE_HXX +#ifndef LIBBUILD2_FILE_HXX +#define LIBBUILD2_FILE_HXX #include <map> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/scope.hxx> -#include <build2/variable.hxx> // list_value +#include <libbuild2/scope.hxx> +#include <libbuild2/variable.hxx> // list_value + +#include <libbuild2/export.hxx> namespace build2 { @@ -21,15 +23,21 @@ namespace build2 using subprojects = std::map<project_name, dir_path>; - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, const subprojects&); // Print as name@dir sequence. - extern const dir_path std_build_dir; // build/ - extern const path std_root_file; // build/root.build - extern const path std_bootstrap_file; // build/bootstrap.build + LIBBUILD2_SYMEXPORT extern const dir_path std_build_dir; // build/ + + // build/root.build + // + LIBBUILD2_SYMEXPORT extern const path std_root_file; + + // build/bootstrap.build + // + LIBBUILD2_SYMEXPORT extern const path std_bootstrap_file; - extern const path std_buildfile_file; // buildfile - extern const path alt_buildfile_file; // build2file + LIBBUILD2_SYMEXPORT extern const path std_buildfile_file; // buildfile + LIBBUILD2_SYMEXPORT extern const path alt_buildfile_file; // build2file // If the altn argument value is present, then it indicates whether we are // using the standard or the alternative build file/directory naming. @@ -39,10 +47,10 @@ namespace build2 // naming scheme (by setting altn) and from then on all the remaining tests // only look for things in this scheme. // - bool + LIBBUILD2_SYMEXPORT bool is_src_root (const dir_path&, optional<bool>& altn); - bool + LIBBUILD2_SYMEXPORT bool is_out_root (const dir_path&, optional<bool>& altn); // Given an src_base directory, look for a project's src_root based on the @@ -50,7 +58,7 @@ namespace build2 // that if the input is normalized/actualized, then the output will be as // well. // - dir_path + LIBBUILD2_SYMEXPORT dir_path find_src_root (const dir_path&, optional<bool>& altn); // The same as above but for project's out. Note that we also check whether @@ -58,17 +66,17 @@ namespace build2 // the result returned as the second half of the pair. Note also that if the // input is normalized/actualized, then the output will be as well. // - pair<dir_path, bool> + LIBBUILD2_SYMEXPORT pair<dir_path, bool> find_out_root (const dir_path&, optional<bool>& altn); // The old/new src_root paths. See main() (where they are set) for details. // - extern dir_path old_src_root; - extern dir_path new_src_root; + LIBBUILD2_SYMEXPORT extern dir_path old_src_root; + LIBBUILD2_SYMEXPORT extern dir_path new_src_root; // If buildfile is '-', then read from STDIN. // - void + LIBBUILD2_SYMEXPORT void source (scope& root, scope& base, const path&); // As above but first check if this buildfile has already been sourced for @@ -79,25 +87,25 @@ namespace build2 // As above but checks against the specified scope rather than base. // - bool + LIBBUILD2_SYMEXPORT bool source_once (scope& root, scope& base, const path&, scope& once); // Create project's root scope. Only set the src_root variable if the passed // src_root value is not empty. The scope argument is only used as proof of // lock. // - scope_map::iterator + LIBBUILD2_SYMEXPORT scope_map::iterator create_root (scope&, const dir_path& out_root, const dir_path& src_root); // Setup root scope. Note that it assumes the src_root variable has already // been set. // - void + LIBBUILD2_SYMEXPORT void setup_root (scope&, bool forwarded); // Setup the base scope (set *_base variables, etc). // - scope& + LIBBUILD2_SYMEXPORT scope& setup_base (scope_map::iterator, const dir_path& out_base, const dir_path& src_base); @@ -107,7 +115,7 @@ namespace build2 // the new scope is in another project. If the new scope is not in any // project, then NULL is returned in second. // - pair<scope&, scope*> + LIBBUILD2_SYMEXPORT pair<scope&, scope*> switch_scope (scope& root, const dir_path&); // Bootstrap and optionally load an ad hoc (sub)project (i.e., the kind that @@ -120,7 +128,7 @@ namespace build2 // // The scope argument is only used as proof of lock. // - scope& + LIBBUILD2_SYMEXPORT scope& load_project (scope&, const dir_path& out_root, const dir_path& src_root, @@ -131,18 +139,18 @@ namespace build2 // src_root if there is no forward. See is_{src,out}_root() for the altn // argument semantics. // - dir_path + LIBBUILD2_SYMEXPORT dir_path bootstrap_fwd (const dir_path& src_root, optional<bool>& altn); // Bootstrap the project's root scope, the out part. // - void + LIBBUILD2_SYMEXPORT void bootstrap_out (scope& root, optional<bool>& altn); // Bootstrap the project's root scope, the src part. Return true if we // loaded anything (which confirms the src_root is not bogus). // - bool + LIBBUILD2_SYMEXPORT bool bootstrap_src (scope& root, optional<bool>& altn); // Return true if this scope has already been bootstrapped, that is, the @@ -152,22 +160,22 @@ namespace build2 // setup_root() // bootstrap_src() // - bool + LIBBUILD2_SYMEXPORT bool bootstrapped (scope& root); // Execute pre/post-bootstrap hooks. Similar to bootstrap_out/sr(), should // only be called once per project bootstrap. // - void + LIBBUILD2_SYMEXPORT void bootstrap_pre (scope& root, optional<bool>& altn); - void + LIBBUILD2_SYMEXPORT void bootstrap_post (scope& root); // Create and bootstrap outer root scopes, if any. Loading is done by // load_root(). // - void + LIBBUILD2_SYMEXPORT void create_bootstrap_outer (scope& root); // Create and bootstrap inner root scopes, if any, recursively. @@ -177,14 +185,14 @@ namespace build2 // // Note that loading is done by load_root(). // - scope& + LIBBUILD2_SYMEXPORT scope& create_bootstrap_inner (scope& root, const dir_path& out_base = dir_path ()); // Load project's root.build (and root pre/post hooks) unless already // loaded. Also make sure all outer root scopes are loaded prior to loading // this root scope. // - void + LIBBUILD2_SYMEXPORT void load_root (scope& root); // Extract the specified variable value from a buildfile. It is expected to @@ -192,7 +200,7 @@ namespace build2 // other than those from the global scope or any variable overrides. Return // an indication of whether the variable was found. // - pair<value, bool> + LIBBUILD2_SYMEXPORT pair<value, bool> extract_variable (const path&, const variable&); // Import has two phases: the first is triggered by the import @@ -215,7 +223,7 @@ namespace build2 // there is a package foo available in repository bar. Wanna // download and use it?" // - names + LIBBUILD2_SYMEXPORT names import (scope& base, name, const location&); const target& @@ -230,6 +238,6 @@ namespace build2 import_existing (const prerequisite_key&); } -#include <build2/file.ixx> +#include <libbuild2/file.ixx> -#endif // BUILD2_FILE_HXX +#endif // LIBBUILD2_FILE_HXX diff --git a/build2/file.ixx b/libbuild2/file.ixx index a94d605..f8a79be 100644 --- a/build2/file.ixx +++ b/libbuild2/file.ixx @@ -1,7 +1,9 @@ -// file : build2/file.ixx -*- C++ -*- +// file : libbuild2/file.ixx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file +#include <libbuild2/export.hxx> + namespace build2 { inline bool @@ -10,7 +12,7 @@ namespace build2 return source_once (root, base, bf, base); } - const target* + LIBBUILD2_SYMEXPORT const target* import (const prerequisite_key&, bool existing); inline const target& diff --git a/build2/filesystem.cxx b/libbuild2/filesystem.cxx index 7242347..83408fa 100644 --- a/build2/filesystem.cxx +++ b/libbuild2/filesystem.cxx @@ -1,11 +1,11 @@ -// file : build2/filesystem.cxx -*- C++ -*- +// file : libbuild2/filesystem.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/filesystem.hxx> +#include <libbuild2/filesystem.hxx> -#include <build2/context.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; using namespace butl; diff --git a/build2/filesystem.hxx b/libbuild2/filesystem.hxx index 2ba928c..6dca528 100644 --- a/build2/filesystem.hxx +++ b/libbuild2/filesystem.hxx @@ -1,14 +1,16 @@ -// file : build2/filesystem.hxx -*- C++ -*- +// file : libbuild2/filesystem.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_FILESYSTEM_HXX -#define BUILD2_FILESYSTEM_HXX +#ifndef LIBBUILD2_FILESYSTEM_HXX +#define LIBBUILD2_FILESYSTEM_HXX #include <libbutl/filesystem.mxx> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> + +#include <libbuild2/export.hxx> // Higher-level filesystem utilities built on top of <libbutl/filesystem.mxx>. // @@ -40,14 +42,14 @@ namespace build2 // specified verbosity level. If the file does not exist and create is true, // create it and fail otherwise. // - void + LIBBUILD2_SYMEXPORT void touch (const path&, bool create, uint16_t verbosity = 1); // Return the modification time for an existing regular file and // timestamp_nonexistent otherwise. Print the diagnostics and fail on system // error. // - timestamp + LIBBUILD2_SYMEXPORT timestamp mtime (const char*); inline timestamp @@ -69,10 +71,10 @@ namespace build2 // using mkdir_status = butl::mkdir_status; - fs_status<mkdir_status> + LIBBUILD2_SYMEXPORT fs_status<mkdir_status> mkdir (const dir_path&, uint16_t verbosity = 1); - fs_status<mkdir_status> + LIBBUILD2_SYMEXPORT fs_status<mkdir_status> mkdir_p (const dir_path&, uint16_t verbosity = 1); // Remove the file (unless dry-run) and print the standard diagnostics @@ -100,7 +102,7 @@ namespace build2 // Similar to rmfile() but for symlinks. // - fs_status<rmfile_status> + LIBBUILD2_SYMEXPORT fs_status<rmfile_status> rmsymlink (const path&, bool dir, uint16_t verbosity); // Similar to rmfile() but for directories (note: not -r). @@ -130,19 +132,19 @@ namespace build2 // // @@ Collides (via ADL) with butl::rmdir_r(), which sucks. // - fs_status<rmdir_status> + LIBBUILD2_SYMEXPORT fs_status<rmdir_status> rmdir_r (const dir_path&, bool dir = true, uint16_t verbosity = 1); // Check for a file, directory or filesystem entry existence. Print the // diagnostics and fail on system error, unless ignore_error is true. // - bool + LIBBUILD2_SYMEXPORT bool exists (const path&, bool follow_symlinks = true, bool ignore_error = false); - bool + LIBBUILD2_SYMEXPORT bool exists (const dir_path&, bool ignore_error = false); - bool + LIBBUILD2_SYMEXPORT bool entry_exists (const path&, bool follow_symlinks = false, bool ignore_error = false); @@ -150,7 +152,7 @@ namespace build2 // Check for a directory emptiness. Print the diagnostics and fail on system // error. // - bool + LIBBUILD2_SYMEXPORT bool empty (const dir_path&); // Directories containing .buildignore (or .build2ignore in the alternative @@ -160,21 +162,21 @@ namespace build2 // Create a directory containing an empty .buildignore file. // - fs_status<mkdir_status> + LIBBUILD2_SYMEXPORT fs_status<mkdir_status> mkdir_buildignore (const dir_path&, const path&, uint16_t verbosity = 1); // Return true if the directory is empty or only contains the .buildignore // file. Fail if the directory doesn't exist. // - bool + LIBBUILD2_SYMEXPORT bool empty_buildignore (const dir_path&, const path&); // Remove a directory if it is empty or only contains the .buildignore file. // - fs_status<rmdir_status> + LIBBUILD2_SYMEXPORT fs_status<rmdir_status> rmdir_buildignore (const dir_path&, const path&, uint16_t verbosity = 1); } -#include <build2/filesystem.txx> +#include <libbuild2/filesystem.txx> -#endif // BUILD2_FILESYSTEM_HXX +#endif // LIBBUILD2_FILESYSTEM_HXX diff --git a/build2/filesystem.txx b/libbuild2/filesystem.txx index 919a26e..6166082 100644 --- a/build2/filesystem.txx +++ b/libbuild2/filesystem.txx @@ -1,11 +1,11 @@ -// file : build2/filesystem.txx -*- C++ -*- +// file : libbuild2/filesystem.txx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include <type_traits> // is_base_of -#include <build2/context.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/diagnostics.hxx> namespace build2 { diff --git a/build2/function+call.test.testscript b/libbuild2/function+call.test.testscript index 1678c28..755572e 100644 --- a/build2/function+call.test.testscript +++ b/libbuild2/function+call.test.testscript @@ -1,4 +1,4 @@ -# file : build2/function+call.test.testscript +# file : libbuild2/function+call.test.testscript # copyright : Copyright (c) 2014-2019 Code Synthesis Ltd # license : MIT; see accompanying LICENSE file diff --git a/build2/function+syntax.test.testscript b/libbuild2/function+syntax.test.testscript index bd86dd0..f8240f3 100644 --- a/build2/function+syntax.test.testscript +++ b/libbuild2/function+syntax.test.testscript @@ -1,4 +1,4 @@ -# file : build2/function+syntax.test.testscript +# file : libbuild2/function+syntax.test.testscript # copyright : Copyright (c) 2014-2019 Code Synthesis Ltd # license : MIT; see accompanying LICENSE file diff --git a/build2/function.cxx b/libbuild2/function.cxx index e78cade..2d4dce9 100644 --- a/build2/function.cxx +++ b/libbuild2/function.cxx @@ -1,8 +1,8 @@ -// file : build2/function.cxx -*- C++ -*- +// file : libbuild2/function.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/function.hxx> +#include <libbuild2/function.hxx> #include <cstring> // strchr() @@ -323,7 +323,7 @@ namespace build2 return d->thunk (base, move (args), d); } -#if !defined(_MSC_VER) || _MSC_VER > 1910 +#if !defined(_WIN32) constexpr const optional<const value_type*>* function_args<>::types; #else const optional<const value_type*>* const function_args<>::types = nullptr; diff --git a/build2/function.hxx b/libbuild2/function.hxx index 1b49f81..6b2bfe1 100644 --- a/build2/function.hxx +++ b/libbuild2/function.hxx @@ -1,19 +1,21 @@ -// file : build2/function.hxx -*- C++ -*- +// file : libbuild2/function.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_FUNCTION_HXX -#define BUILD2_FUNCTION_HXX +#ifndef LIBBUILD2_FUNCTION_HXX +#define LIBBUILD2_FUNCTION_HXX #include <map> #include <utility> // index_sequence #include <type_traits> // aligned_storage -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/variable.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/diagnostics.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -85,7 +87,7 @@ namespace build2 vector_view<value>, const function_overload&); - struct function_overload + struct LIBBUILD2_SYMEXPORT function_overload { const char* name; // Set to point to key by insert() below. const char* alt_name; // Alternative name, NULL if none. This is the @@ -145,10 +147,10 @@ namespace build2 } }; - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, const function_overload&); // Print signature. - class function_map + class LIBBUILD2_SYMEXPORT function_map { public: using map_type = std::multimap<string, function_overload>; @@ -214,9 +216,9 @@ namespace build2 map_type map_; }; - extern function_map functions; + LIBBUILD2_SYMEXPORT extern function_map functions; - class function_family + class LIBBUILD2_SYMEXPORT function_family { public: // The call() function above catches invalid_argument and issues @@ -282,7 +284,7 @@ namespace build2 }; template <> - struct function_arg<names> // Untyped. + struct LIBBUILD2_SYMEXPORT function_arg<names> // Untyped. { static const bool null = false; static const bool opt = false; @@ -301,7 +303,7 @@ namespace build2 }; template <> - struct function_arg<value> // Anytyped. + struct LIBBUILD2_SYMEXPORT function_arg<value> // Anytyped. { static const bool null = false; static const bool opt = false; @@ -341,7 +343,7 @@ namespace build2 }; template <> - struct function_arg<value*>: function_arg<value> + struct LIBBUILD2_SYMEXPORT function_arg<value*>: function_arg<value> { static const bool null = true; @@ -388,7 +390,13 @@ namespace build2 // VC15 doesn't realize that a pointer to static object (in our case it is // &value_trair<T>::value_type) is constexpr. // -#if !defined(_MSC_VER) || _MSC_VER > 1910 + // Note that during the library split we discovered that the constexpr + // variant causes compilation/linkage issues for both MinGW GCC and + // VC. Thus we now only use it for POSIX systems. + // + // #if !defined(_MSC_VER) || _MSC_VER > 1910 + // +#if !defined(_WIN32) static constexpr const optional<const value_type*> types[max] = { function_arg<A>::type ()...}; #else @@ -397,7 +405,7 @@ namespace build2 }; template <typename... A> -#if !defined(_MSC_VER) || _MSC_VER > 1910 +#if !defined(_WIN32) constexpr const optional<const value_type*> function_args<A...>::types[function_args<A...>::max]; #else @@ -409,12 +417,12 @@ namespace build2 // Specialization for no arguments. // template <> - struct function_args<> + struct LIBBUILD2_SYMEXPORT function_args<> { static const size_t max = 0; static const size_t min = 0; -#if !defined(_MSC_VER) || _MSC_VER > 1910 +#if !defined(_WIN32) static constexpr const optional<const value_type*>* types = nullptr; #else static const optional<const value_type*>* const types; @@ -734,7 +742,7 @@ namespace build2 } }; - struct function_family::entry + struct LIBBUILD2_SYMEXPORT function_family::entry { string name; const string& qual; @@ -894,4 +902,4 @@ namespace build2 } } -#endif // BUILD2_FUNCTION_HXX +#endif // LIBBUILD2_FUNCTION_HXX diff --git a/build2/function.test.cxx b/libbuild2/function.test.cxx index b890bcd..5e442a3 100644 --- a/build2/function.test.cxx +++ b/libbuild2/function.test.cxx @@ -1,17 +1,17 @@ -// file : build2/function.test.cxx -*- C++ -*- +// file : libbuild2/function.test.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include <iostream> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/parser.hxx> -#include <build2/context.hxx> -#include <build2/function.hxx> -#include <build2/variable.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/parser.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; diff --git a/build2/functions-builtin.cxx b/libbuild2/functions-builtin.cxx index 138a364..44ae534 100644 --- a/build2/functions-builtin.cxx +++ b/libbuild2/functions-builtin.cxx @@ -1,9 +1,9 @@ -// file : build2/functions-builtin.cxx -*- C++ -*- +// file : libbuild2/functions-builtin.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/function.hxx> -#include <build2/variable.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> namespace build2 { diff --git a/build2/functions-filesystem.cxx b/libbuild2/functions-filesystem.cxx index a3b2a40..d98c75d 100644 --- a/build2/functions-filesystem.cxx +++ b/libbuild2/functions-filesystem.cxx @@ -1,11 +1,11 @@ -// file : build2/functions-filesystem.cxx -*- C++ -*- +// file : libbuild2/functions-filesystem.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include <libbutl/filesystem.mxx> -#include <build2/function.hxx> -#include <build2/variable.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> using namespace std; diff --git a/build2/functions-name.cxx b/libbuild2/functions-name.cxx index ba1af5b..a8e08b6 100644 --- a/build2/functions-name.cxx +++ b/libbuild2/functions-name.cxx @@ -1,10 +1,10 @@ -// file : build2/functions-name.cxx -*- C++ -*- +// file : libbuild2/functions-name.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/scope.hxx> -#include <build2/function.hxx> -#include <build2/variable.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> using namespace std; diff --git a/build2/functions-path.cxx b/libbuild2/functions-path.cxx index 6b435f5..6e39812 100644 --- a/build2/functions-path.cxx +++ b/libbuild2/functions-path.cxx @@ -1,9 +1,9 @@ -// file : build2/functions-path.cxx -*- C++ -*- +// file : libbuild2/functions-path.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/function.hxx> -#include <build2/variable.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> using namespace std; diff --git a/build2/functions-process-path.cxx b/libbuild2/functions-process-path.cxx index bf9b417..65e426b 100644 --- a/build2/functions-process-path.cxx +++ b/libbuild2/functions-process-path.cxx @@ -1,9 +1,9 @@ -// file : build2/functions-process-path.cxx -*- C++ -*- +// file : libbuild2/functions-process-path.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/function.hxx> -#include <build2/variable.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> using namespace std; diff --git a/build2/functions-process.cxx b/libbuild2/functions-process.cxx index b302ae5..83188d3 100644 --- a/build2/functions-process.cxx +++ b/libbuild2/functions-process.cxx @@ -1,11 +1,11 @@ -// file : build2/functions-process.cxx -*- C++ -*- +// file : libbuild2/functions-process.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include <libbutl/regex.mxx> -#include <build2/function.hxx> -#include <build2/variable.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> using namespace std; using namespace butl; diff --git a/build2/functions-project-name.cxx b/libbuild2/functions-project-name.cxx index 65f263b..163e865 100644 --- a/build2/functions-project-name.cxx +++ b/libbuild2/functions-project-name.cxx @@ -1,9 +1,9 @@ -// file : build2/functions-project-name.cxx -*- C++ -*- +// file : libbuild2/functions-project-name.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/function.hxx> -#include <build2/variable.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> using namespace std; diff --git a/build2/functions-regex.cxx b/libbuild2/functions-regex.cxx index 3f44e8a..2c478fe 100644 --- a/build2/functions-regex.cxx +++ b/libbuild2/functions-regex.cxx @@ -1,4 +1,4 @@ -// file : build2/functions-regex.cxx -*- C++ -*- +// file : libbuild2/functions-regex.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file @@ -6,8 +6,8 @@ #include <libbutl/regex.mxx> -#include <build2/function.hxx> -#include <build2/variable.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> using namespace std; using namespace butl; diff --git a/build2/functions-string.cxx b/libbuild2/functions-string.cxx index 61fd536..22860cb 100644 --- a/build2/functions-string.cxx +++ b/libbuild2/functions-string.cxx @@ -1,9 +1,9 @@ -// file : build2/functions-string.cxx -*- C++ -*- +// file : libbuild2/functions-string.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/function.hxx> -#include <build2/variable.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> using namespace std; diff --git a/build2/functions-target-triplet.cxx b/libbuild2/functions-target-triplet.cxx index de0387a..4394c5a 100644 --- a/build2/functions-target-triplet.cxx +++ b/libbuild2/functions-target-triplet.cxx @@ -1,9 +1,9 @@ -// file : build2/functions-target-triplet.cxx -*- C++ -*- +// file : libbuild2/functions-target-triplet.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/function.hxx> -#include <build2/variable.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> using namespace std; diff --git a/build2/lexer+buildspec.test.testscript b/libbuild2/lexer+buildspec.test.testscript index 9083abe..a80b2d5 100644 --- a/build2/lexer+buildspec.test.testscript +++ b/libbuild2/lexer+buildspec.test.testscript @@ -1,4 +1,4 @@ -# file : build2/lexer+buildspec.test.testscript +# file : libbuild2/lexer+buildspec.test.testscript # copyright : Copyright (c) 2014-2019 Code Synthesis Ltd # license : MIT; see accompanying LICENSE file diff --git a/build2/lexer+comment.test.testscript b/libbuild2/lexer+comment.test.testscript index 4323c84..6ad1202 100644 --- a/build2/lexer+comment.test.testscript +++ b/libbuild2/lexer+comment.test.testscript @@ -1,4 +1,4 @@ -# file : build2/lexer+comment.test.testscript +# file : libbuild2/lexer+comment.test.testscript # copyright : Copyright (c) 2014-2019 Code Synthesis Ltd # license : MIT; see accompanying LICENSE file diff --git a/build2/lexer+eval.test.testscript b/libbuild2/lexer+eval.test.testscript index eccd029..86f804a 100644 --- a/build2/lexer+eval.test.testscript +++ b/libbuild2/lexer+eval.test.testscript @@ -1,4 +1,4 @@ -# file : build2/lexer+eval.test.testscript +# file : libbuild2/lexer+eval.test.testscript # copyright : Copyright (c) 2014-2019 Code Synthesis Ltd # license : MIT; see accompanying LICENSE file diff --git a/build2/lexer+quoting.test.testscript b/libbuild2/lexer+quoting.test.testscript index 21b9046..043737f 100644 --- a/build2/lexer+quoting.test.testscript +++ b/libbuild2/lexer+quoting.test.testscript @@ -1,4 +1,4 @@ -# file : build2/lexer+quoting.test.testscript +# file : libbuild2/lexer+quoting.test.testscript # copyright : Copyright (c) 2014-2019 Code Synthesis Ltd # license : MIT; see accompanying LICENSE file diff --git a/build2/lexer.cxx b/libbuild2/lexer.cxx index 8287640..fd13c31 100644 --- a/build2/lexer.cxx +++ b/libbuild2/lexer.cxx @@ -1,8 +1,8 @@ -// file : build2/lexer.cxx -*- C++ -*- +// file : libbuild2/lexer.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/lexer.hxx> +#include <libbuild2/lexer.hxx> #include <cstring> // strchr() diff --git a/build2/lexer.hxx b/libbuild2/lexer.hxx index b71167a..f987071 100644 --- a/build2/lexer.hxx +++ b/libbuild2/lexer.hxx @@ -1,19 +1,21 @@ -// file : build2/lexer.hxx -*- C++ -*- +// file : libbuild2/lexer.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_LEXER_HXX -#define BUILD2_LEXER_HXX +#ifndef LIBBUILD2_LEXER_HXX +#define LIBBUILD2_LEXER_HXX #include <stack> #include <libbutl/char-scanner.mxx> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/token.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/token.hxx> +#include <libbuild2/diagnostics.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -66,7 +68,7 @@ namespace build2 lexer_mode (base_type v): base_type (v) {} }; - class lexer: public butl::char_scanner + class LIBBUILD2_SYMEXPORT lexer: public butl::char_scanner { public: // If escape is not NULL then only escape sequences with characters from @@ -202,4 +204,4 @@ namespace butl // ADL } } -#endif // BUILD2_LEXER_HXX +#endif // LIBBUILD2_LEXER_HXX diff --git a/build2/lexer.test.cxx b/libbuild2/lexer.test.cxx index 8abd5f7..84520d1 100644 --- a/build2/lexer.test.cxx +++ b/libbuild2/lexer.test.cxx @@ -1,15 +1,15 @@ -// file : build2/lexer.test.cxx -*- C++ -*- +// file : libbuild2/lexer.test.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include <cassert> #include <iostream> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/token.hxx> -#include <build2/lexer.hxx> +#include <libbuild2/token.hxx> +#include <libbuild2/lexer.hxx> using namespace std; diff --git a/build2/module.cxx b/libbuild2/module.cxx index a4a0341..50530f2 100644 --- a/build2/module.cxx +++ b/libbuild2/module.cxx @@ -1,12 +1,12 @@ -// file : build2/module.cxx -*- C++ -*- +// file : libbuild2/module.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/module.hxx> +#include <libbuild2/module.hxx> -#include <build2/scope.hxx> -#include <build2/variable.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; diff --git a/build2/module.hxx b/libbuild2/module.hxx index 610b14f..5fbed9c 100644 --- a/build2/module.hxx +++ b/libbuild2/module.hxx @@ -1,17 +1,19 @@ -// file : build2/module.hxx -*- C++ -*- +// file : libbuild2/module.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_MODULE_HXX -#define BUILD2_MODULE_HXX +#ifndef LIBBUILD2_MODULE_HXX +#define LIBBUILD2_MODULE_HXX #include <map> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/variable.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/diagnostics.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -87,7 +89,7 @@ namespace build2 // Load and boot the specified module. // - void + LIBBUILD2_SYMEXPORT void boot_module (scope& root, const string& name, const location&); // Load (if not already loaded) and initialize the specified module. Used @@ -101,7 +103,7 @@ namespace build2 // module (which may not always be able to extract the same information from // its tools). // - bool + LIBBUILD2_SYMEXPORT bool load_module (scope& root, scope& base, const string& name, @@ -112,7 +114,7 @@ namespace build2 // Builtin modules. // using available_module_map = std::map<string, module_functions>; - extern available_module_map builtin_modules; + LIBBUILD2_SYMEXPORT extern available_module_map builtin_modules; } -#endif // BUILD2_MODULE_HXX +#endif // LIBBUILD2_MODULE_HXX diff --git a/build2/name.cxx b/libbuild2/name.cxx index 5aa7754..4aac32f 100644 --- a/build2/name.cxx +++ b/libbuild2/name.cxx @@ -1,12 +1,12 @@ -// file : build2/name.cxx -*- C++ -*- +// file : libbuild2/name.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/types.hxx> // Note: not <build2/names> +#include <libbuild2/types.hxx> // Note: not <libbuild2/name.hxx> #include <string.h> // strchr() -#include <build2/diagnostics.hxx> +#include <libbuild2/diagnostics.hxx> namespace build2 { diff --git a/build2/name.hxx b/libbuild2/name.hxx index ba6b7a6..1ce073a 100644 --- a/build2/name.hxx +++ b/libbuild2/name.hxx @@ -1,17 +1,20 @@ -// file : build2/name.hxx -*- C++ -*- +// file : libbuild2/name.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -// Note: include <build2/types.hxx> instead of this file directly. +// Note: include <libbuild2/types.hxx> instead of this file directly. // -#ifndef BUILD2_NAME_HXX -#define BUILD2_NAME_HXX +#ifndef LIBBUILD2_NAME_HXX +#define LIBBUILD2_NAME_HXX -// We cannot include <build2/utility.hxx> since it includes <build2/types>. +// We cannot include <libbuild2/utility.hxx> since it includes +// <libbuild2/types.hxx>. // #include <utility> // move() +#include <libbuild2/export.hxx> + namespace build2 { using std::move; @@ -91,7 +94,7 @@ namespace build2 compare (const name&) const; }; - extern const name empty_name; + LIBBUILD2_SYMEXPORT extern const name empty_name; inline bool operator== (const name& x, const name& y) {return x.compare (y) == 0;} @@ -104,7 +107,7 @@ namespace build2 // Return string representation of a name. // - string + LIBBUILD2_SYMEXPORT string to_string (const name&); // Store a string in a name in a reversible way. If the string ends with a @@ -129,7 +132,7 @@ namespace build2 // Note that in the quoted mode empty unqualified name is printed as '', // not {}. // - ostream& + LIBBUILD2_SYMEXPORT ostream& to_stream (ostream&, const name&, bool quote, char pair = '\0'); inline ostream& @@ -145,11 +148,11 @@ namespace build2 using names = small_vector<name, 1>; using names_view = vector_view<const name>; - extern const names empty_names; + LIBBUILD2_SYMEXPORT extern const names empty_names; // The same semantics as to_stream(name). // - ostream& + LIBBUILD2_SYMEXPORT ostream& to_stream (ostream&, const names_view&, bool quote, char pair = '\0'); inline ostream& @@ -164,6 +167,6 @@ namespace build2 using name_pair = pair<name, name>; } -#include <build2/name.ixx> +#include <libbuild2/name.ixx> -#endif // BUILD2_NAME_HXX +#endif // LIBBUILD2_NAME_HXX diff --git a/build2/name.ixx b/libbuild2/name.ixx index 79b3145..188126e 100644 --- a/build2/name.ixx +++ b/libbuild2/name.ixx @@ -1,4 +1,4 @@ -// file : build2/name.ixx -*- C++ -*- +// file : libbuild2/name.ixx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file diff --git a/build2/name.test.cxx b/libbuild2/name.test.cxx index 0434aac..09fb841 100644 --- a/build2/name.test.cxx +++ b/libbuild2/name.test.cxx @@ -1,4 +1,4 @@ -// file : build2/name.test.cxx -*- C++ -*- +// file : libbuild2/name.test.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file @@ -7,10 +7,10 @@ #include <cassert> #include <iostream> -#include <build2/types.hxx> // Includes name. -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> // Includes name. +#include <libbuild2/utility.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; diff --git a/build2/operation.cxx b/libbuild2/operation.cxx index 0144e51..9d84cc2 100644 --- a/build2/operation.cxx +++ b/libbuild2/operation.cxx @@ -1,16 +1,16 @@ -// file : build2/operation.cxx -*- C++ -*- +// file : libbuild2/operation.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/operation.hxx> +#include <libbuild2/operation.hxx> #include <iostream> // cout -#include <build2/file.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/algorithm.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/file.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; using namespace butl; diff --git a/build2/operation.hxx b/libbuild2/operation.hxx index 03026eb..86f93c6 100644 --- a/build2/operation.hxx +++ b/libbuild2/operation.hxx @@ -1,19 +1,21 @@ -// file : build2/operation.hxx -*- C++ -*- +// file : libbuild2/operation.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_OPERATION_HXX -#define BUILD2_OPERATION_HXX +#ifndef LIBBUILD2_OPERATION_HXX +#define LIBBUILD2_OPERATION_HXX #include <libbutl/string-table.mxx> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/action.hxx> -#include <build2/variable.hxx> -#include <build2/prerequisite.hxx> -#include <build2/target-state.hxx> +#include <libbuild2/action.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/prerequisite.hxx> +#include <libbuild2/target-state.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -152,7 +154,7 @@ namespace build2 // loads the buildfile unless it has already been loaded for the root // scope. // - void + LIBBUILD2_SYMEXPORT void load (const values&, scope&, const path&, @@ -163,7 +165,7 @@ namespace build2 // Search and match the target. This is the default implementation // that does just that and adds a pointer to the target to the list. // - void + LIBBUILD2_SYMEXPORT void search (const values&, const scope&, const scope&, @@ -172,7 +174,7 @@ namespace build2 const location&, action_targets&); - void + LIBBUILD2_SYMEXPORT void match (const values&, action, action_targets&, uint16_t diag, bool prog); @@ -180,13 +182,13 @@ namespace build2 // implementation that does just that while issuing appropriate // diagnostics (unless quiet). // - void + LIBBUILD2_SYMEXPORT void execute (const values&, action, const action_targets&, uint16_t diag, bool prog); - extern const meta_operation_info mo_noop; - extern const meta_operation_info mo_perform; - extern const meta_operation_info mo_info; + LIBBUILD2_SYMEXPORT extern const meta_operation_info mo_noop; + LIBBUILD2_SYMEXPORT extern const meta_operation_info mo_perform; + LIBBUILD2_SYMEXPORT extern const meta_operation_info mo_info; // Operation info. // @@ -236,9 +238,9 @@ namespace build2 // Built-in operations. // - extern const operation_info op_default; - extern const operation_info op_update; - extern const operation_info op_clean; + LIBBUILD2_SYMEXPORT extern const operation_info op_default; + LIBBUILD2_SYMEXPORT extern const operation_info op_update; + LIBBUILD2_SYMEXPORT extern const operation_info op_clean; // Global meta/operation tables. Each registered meta/operation // is assigned an id which is used as an index in the per-project @@ -293,9 +295,11 @@ namespace build2 return os << d.name; } - extern butl::string_table<meta_operation_id, - meta_operation_data> meta_operation_table; - extern butl::string_table<operation_id> operation_table; + LIBBUILD2_SYMEXPORT extern butl::string_table<meta_operation_id, + meta_operation_data> + meta_operation_table; + + LIBBUILD2_SYMEXPORT extern butl::string_table<operation_id> operation_table; // These are "sparse" in the sense that we may have "holes" that // are represented as NULL pointers. Also, lookup out of bounds @@ -354,4 +358,4 @@ namespace butl }; } -#endif // BUILD2_OPERATION_HXX +#endif // LIBBUILD2_OPERATION_HXX diff --git a/build2/parser.cxx b/libbuild2/parser.cxx index 1542cf6..4e8ad23 100644 --- a/build2/parser.cxx +++ b/libbuild2/parser.cxx @@ -1,25 +1,25 @@ -// file : build2/parser.cxx -*- C++ -*- +// file : libbuild2/parser.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/parser.hxx> +#include <libbuild2/parser.hxx> #include <sstream> #include <iostream> // cout #include <libbutl/filesystem.mxx> // path_search(), path_match() -#include <build2/dump.hxx> -#include <build2/file.hxx> -#include <build2/scope.hxx> -#include <build2/module.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/function.hxx> -#include <build2/variable.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> -#include <build2/prerequisite.hxx> +#include <libbuild2/dump.hxx> +#include <libbuild2/file.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/module.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/function.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> +#include <libbuild2/prerequisite.hxx> using namespace std; diff --git a/build2/parser.hxx b/libbuild2/parser.hxx index b4b7093..658f266 100644 --- a/build2/parser.hxx +++ b/libbuild2/parser.hxx @@ -1,20 +1,22 @@ -// file : build2/parser.hxx -*- C++ -*- +// file : libbuild2/parser.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_PARSER_HXX -#define BUILD2_PARSER_HXX +#ifndef LIBBUILD2_PARSER_HXX +#define LIBBUILD2_PARSER_HXX #include <stack> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/spec.hxx> -#include <build2/lexer.hxx> -#include <build2/token.hxx> -#include <build2/variable.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/spec.hxx> +#include <libbuild2/lexer.hxx> +#include <libbuild2/token.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/diagnostics.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -22,7 +24,7 @@ namespace build2 class target; class prerequisite; - class parser + class LIBBUILD2_SYMEXPORT parser { public: // If boot is true, then we are parsing bootstrap.build and modules @@ -668,4 +670,4 @@ namespace build2 }; } -#endif // BUILD2_PARSER_HXX +#endif // LIBBUILD2_PARSER_HXX diff --git a/build2/prerequisite.cxx b/libbuild2/prerequisite.cxx index 2eee32b..7355323 100644 --- a/build2/prerequisite.cxx +++ b/libbuild2/prerequisite.cxx @@ -1,13 +1,13 @@ -// file : build2/prerequisite.cxx -*- C++ -*- +// file : libbuild2/prerequisite.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/prerequisite.hxx> +#include <libbuild2/prerequisite.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; diff --git a/build2/prerequisite.hxx b/libbuild2/prerequisite.hxx index 258033d..f79ce04 100644 --- a/build2/prerequisite.hxx +++ b/libbuild2/prerequisite.hxx @@ -1,17 +1,19 @@ -// file : build2/prerequisite.hxx -*- C++ -*- +// file : libbuild2/prerequisite.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_PREREQUISITE_HXX -#define BUILD2_PREREQUISITE_HXX +#ifndef LIBBUILD2_PREREQUISITE_HXX +#define LIBBUILD2_PREREQUISITE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/action.hxx> -#include <build2/variable.hxx> -#include <build2/target-key.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/action.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/target-key.hxx> +#include <libbuild2/diagnostics.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -40,12 +42,12 @@ namespace build2 bool is_a (const target_type& tt) const {return tk.is_a (tt);} }; - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, const prerequisite_key&); // Note that every data member except for the target is immutable (const). // - class prerequisite + class LIBBUILD2_SYMEXPORT prerequisite { public: using scope_type = build2::scope; @@ -222,6 +224,6 @@ namespace build2 const target* = nullptr); } -#include <build2/prerequisite.ixx> +#include <libbuild2/prerequisite.ixx> -#endif // BUILD2_PREREQUISITE_HXX +#endif // LIBBUILD2_PREREQUISITE_HXX diff --git a/build2/prerequisite.ixx b/libbuild2/prerequisite.ixx index 3874011..d62af49 100644 --- a/build2/prerequisite.ixx +++ b/libbuild2/prerequisite.ixx @@ -1,16 +1,19 @@ -// file : build2/prerequisite.ixx -*- C++ -*- +// file : libbuild2/prerequisite.ixx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file + +#include <libbuild2/export.hxx> + namespace build2 { - include_type + LIBBUILD2_SYMEXPORT include_type include_impl (action, const target&, const string&, const prerequisite&, const target*); - extern const variable* var_include; // context.cxx + LIBBUILD2_SYMEXPORT extern const variable* var_include; // context.cxx inline include_type include (action a, const target& t, const prerequisite& p, const target* m) diff --git a/build2/rule-map.hxx b/libbuild2/rule-map.hxx index 52e4b9f..26f80a8 100644 --- a/build2/rule-map.hxx +++ b/libbuild2/rule-map.hxx @@ -1,18 +1,18 @@ -// file : build2/rule-map.hxx -*- C++ -*- +// file : libbuild2/rule-map.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_RULE_MAP_HXX -#define BUILD2_RULE_MAP_HXX +#ifndef LIBBUILD2_RULE_MAP_HXX +#define LIBBUILD2_RULE_MAP_HXX #include <map> #include <libbutl/prefix-map.mxx> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/action.hxx> +#include <libbuild2/action.hxx> namespace build2 { @@ -120,4 +120,4 @@ namespace build2 }; } -#endif // BUILD2_RULE_MAP_HXX +#endif // LIBBUILD2_RULE_MAP_HXX diff --git a/build2/rule.cxx b/libbuild2/rule.cxx index a09e28b..0ade8a3 100644 --- a/build2/rule.cxx +++ b/libbuild2/rule.cxx @@ -1,15 +1,15 @@ -// file : build2/rule.cxx -*- C++ -*- +// file : libbuild2/rule.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/rule.hxx> +#include <libbuild2/rule.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; using namespace butl; diff --git a/build2/rule.hxx b/libbuild2/rule.hxx index a9bc178..abd754e 100644 --- a/build2/rule.hxx +++ b/libbuild2/rule.hxx @@ -1,15 +1,17 @@ -// file : build2/rule.hxx -*- C++ -*- +// file : libbuild2/rule.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_RULE_HXX -#define BUILD2_RULE_HXX +#ifndef LIBBUILD2_RULE_HXX +#define LIBBUILD2_RULE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/action.hxx> -#include <build2/target.hxx> +#include <libbuild2/action.hxx> +#include <libbuild2/target.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -32,7 +34,7 @@ namespace build2 // Fallback rule that only matches if the file exists. It will also match // an mtime_target provided it has a set timestamp. // - class file_rule: public rule + class LIBBUILD2_SYMEXPORT file_rule: public rule { public: virtual bool @@ -45,7 +47,7 @@ namespace build2 static const file_rule instance; }; - class alias_rule: public rule + class LIBBUILD2_SYMEXPORT alias_rule: public rule { public: virtual bool @@ -61,7 +63,7 @@ namespace build2 // Note that this rule ignores the dry_run flag; see mkdir() in filesystem // for the rationale. // - class fsdir_rule: public rule + class LIBBUILD2_SYMEXPORT fsdir_rule: public rule { public: virtual bool @@ -88,7 +90,7 @@ namespace build2 // Fallback rule that always matches and does nothing. // - class noop_rule: public rule + class LIBBUILD2_SYMEXPORT noop_rule: public rule { public: virtual bool @@ -102,4 +104,4 @@ namespace build2 }; } -#endif // BUILD2_RULE_HXX +#endif // LIBBUILD2_RULE_HXX diff --git a/build2/scheduler.cxx b/libbuild2/scheduler.cxx index ad3a640..8ac2b97 100644 --- a/build2/scheduler.cxx +++ b/libbuild2/scheduler.cxx @@ -1,8 +1,8 @@ -// file : build2/scheduler.cxx -*- C++ -*- +// file : libbuild2/scheduler.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/scheduler.hxx> +#include <libbuild2/scheduler.hxx> #if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) # include <pthread.h> @@ -22,12 +22,36 @@ #include <cerrno> #include <exception> // std::terminate() -#include <build2/diagnostics.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; namespace build2 { + // TLS cache of thread's task queue. + // + // Note that scheduler::task_queue struct is private. + // + static +#ifdef __cpp_thread_local + thread_local +#else + __thread +#endif + void* scheduler_queue = nullptr; + + scheduler::task_queue* scheduler:: + queue () noexcept + { + return static_cast<scheduler::task_queue*> (scheduler_queue); + } + + void scheduler:: + queue (scheduler::task_queue* q) noexcept + { + scheduler_queue = q; + } + size_t scheduler:: wait (size_t start_count, const atomic_count& task_count, work_queue wq) { @@ -47,7 +71,7 @@ namespace build2 // If we are waiting on someone else's task count then there migh still // be no queue (set by async()). // - if (task_queue* tq = task_queue_) + if (task_queue* tq = queue ()) { for (lock ql (tq->mutex); !tq->shutdown && !empty_back (*tq); ) { @@ -571,12 +595,13 @@ namespace build2 // MinGW : 2048 / 2048 // VC : 1024 / 1024 // - // Provided the main thread size is less-equal than BUILD2_SANE_STACK_SIZE - // (default: sizeof(void*) * BUILD2_DEFAULT_STACK_SIZE), we make sure that - // the new thread stack is the same as for the main thread. Otherwise, we - // cap it at BUILD2_DEFAULT_STACK_SIZE (default: 8MB). This can also be - // overridden at runtime with the --max-stack option (remember to update - // its documentation of changing anything here). + // Provided the main thread size is less-equal than + // LIBBUILD2_SANE_STACK_SIZE (which defaults to + // sizeof(void*)*LIBBUILD2_DEFAULT_STACK_SIZE), we make sure that the new + // thread stack is the same as for the main thread. Otherwise, we cap it + // at LIBBUILD2_DEFAULT_STACK_SIZE (default: 8MB). This can also be + // overridden at runtime with the --max-stack build2 driver option + // (remember to update its documentation of changing anything here). // // On Windows the stack size is the same for all threads and is customized // at the linking stage (see build2/buildfile). Thus neither *_STACK_SIZE @@ -596,12 +621,12 @@ namespace build2 // #if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) -#ifndef BUILD2_DEFAULT_STACK_SIZE -# define BUILD2_DEFAULT_STACK_SIZE 8388608 // 8MB +#ifndef LIBBUILD2_DEFAULT_STACK_SIZE +# define LIBBUILD2_DEFAULT_STACK_SIZE 8388608 // 8MB #endif -#ifndef BUILD2_SANE_STACK_SIZE -# define BUILD2_SANE_STACK_SIZE (sizeof(void*) * BUILD2_DEFAULT_STACK_SIZE) +#ifndef LIBBUILD2_SANE_STACK_SIZE +# define LIBBUILD2_SANE_STACK_SIZE (sizeof(void*) * LIBBUILD2_DEFAULT_STACK_SIZE) #endif // Auto-deleter. @@ -671,8 +696,8 @@ namespace build2 if (*max_stack_ != 0 && stack_size > *max_stack_) stack_size = *max_stack_; } - else if (stack_size > BUILD2_SANE_STACK_SIZE) - stack_size = BUILD2_DEFAULT_STACK_SIZE; + else if (stack_size > LIBBUILD2_SANE_STACK_SIZE) + stack_size = LIBBUILD2_DEFAULT_STACK_SIZE; pthread_attr_t attr; int r (pthread_attr_init (&attr)); @@ -775,13 +800,6 @@ namespace build2 return nullptr; } -#ifdef __cpp_thread_local - thread_local -#else - __thread -#endif - scheduler::task_queue* scheduler::task_queue_ = nullptr; - auto scheduler:: create_queue () -> task_queue& { @@ -796,7 +814,7 @@ namespace build2 tq->shutdown = shutdown_; } - task_queue_ = tq; + queue (tq); return *tq; } } diff --git a/build2/scheduler.hxx b/libbuild2/scheduler.hxx index 3aa1dc5..09c9e02 100644 --- a/build2/scheduler.hxx +++ b/libbuild2/scheduler.hxx @@ -1,9 +1,9 @@ -// file : build2/scheduler.hxx -*- C++ -*- +// file : libbuild2/scheduler.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_SCHEDULER_HXX -#define BUILD2_SCHEDULER_HXX +#ifndef LIBBUILD2_SCHEDULER_HXX +#define LIBBUILD2_SCHEDULER_HXX #include <list> #include <mutex> @@ -12,8 +12,10 @@ #include <type_traits> // aligned_storage, etc #include <condition_variable> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -51,7 +53,7 @@ namespace build2 // stack. All this means that the number of threads created by the scheduler // will normally exceed the maximum active allowed. // - class scheduler + class LIBBUILD2_SYMEXPORT scheduler { public: using atomic_count = std::atomic<size_t>; @@ -289,7 +291,7 @@ namespace build2 void join () { - assert (task_queue_ = nullptr); + assert (queue () == nullptr); // Lock the mutex to make sure the values set in startup() are visible // in this thread. @@ -306,7 +308,7 @@ namespace build2 void leave () { - task_queue_ = nullptr; + queue (nullptr); } // Return the number of hardware threads or 0 if unable to determine. @@ -691,21 +693,17 @@ namespace build2 // std::list<task_queue> task_queues_; - // TLS cache of thread's task queue. - // - static -#ifdef __cpp_thread_local - thread_local -#else - __thread -#endif - task_queue* task_queue_; - task_queue& create_queue (); + + static task_queue* + queue () noexcept; + + static void + queue (task_queue*) noexcept; }; } -#include <build2/scheduler.txx> +#include <libbuild2/scheduler.txx> -#endif // BUILD2_SCHEDULER_HXX +#endif // LIBBUILD2_SCHEDULER_HXX diff --git a/build2/scheduler.test.cxx b/libbuild2/scheduler.test.cxx index b088c1d..1252575 100644 --- a/build2/scheduler.test.cxx +++ b/libbuild2/scheduler.test.cxx @@ -1,4 +1,4 @@ -// file : build2/scheduler.test.cxx -*- C++ -*- +// file : libbuild2/scheduler.test.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file @@ -8,10 +8,10 @@ #include <cassert> #include <iostream> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/scheduler.hxx> +#include <libbuild2/scheduler.hxx> using namespace std; diff --git a/build2/scheduler.txx b/libbuild2/scheduler.txx index 97eae62..805a072 100644 --- a/build2/scheduler.txx +++ b/libbuild2/scheduler.txx @@ -1,4 +1,4 @@ -// file : build2/scheduler.txx -*- C++ -*- +// file : libbuild2/scheduler.txx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file @@ -45,7 +45,7 @@ namespace build2 // Try to push the task into the queue falling back to running serially // if the queue is full. // - task_queue* tq (task_queue_); // Single load. + task_queue* tq (queue ()); // Single load. if (tq == nullptr) tq = &create_queue (); diff --git a/build2/scope.cxx b/libbuild2/scope.cxx index a6ebe1f..1ad7455 100644 --- a/build2/scope.cxx +++ b/libbuild2/scope.cxx @@ -1,11 +1,11 @@ -// file : build2/scope.cxx -*- C++ -*- +// file : libbuild2/scope.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/scope.hxx> +#include <libbuild2/scope.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> using namespace std; diff --git a/build2/scope.hxx b/libbuild2/scope.hxx index afd294e..7b4fec5 100644 --- a/build2/scope.hxx +++ b/libbuild2/scope.hxx @@ -1,29 +1,31 @@ -// file : build2/scope.hxx -*- C++ -*- +// file : libbuild2/scope.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_SCOPE_HXX -#define BUILD2_SCOPE_HXX +#ifndef LIBBUILD2_SCOPE_HXX +#define LIBBUILD2_SCOPE_HXX #include <map> #include <unordered_set> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/module.hxx> -#include <build2/variable.hxx> -#include <build2/target-key.hxx> -#include <build2/target-type.hxx> -#include <build2/target-state.hxx> -#include <build2/rule-map.hxx> -#include <build2/operation.hxx> +#include <libbuild2/module.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/target-key.hxx> +#include <libbuild2/target-type.hxx> +#include <libbuild2/target-state.hxx> +#include <libbuild2/rule-map.hxx> +#include <libbuild2/operation.hxx> + +#include <libbuild2/export.hxx> namespace build2 { class dir; - class scope + class LIBBUILD2_SYMEXPORT scope { public: // Absolute and normalized. @@ -347,10 +349,11 @@ namespace build2 friend class scope_map; friend class temp_scope; - // These two from <build2/file.hxx> set strong_. + // These two from <libbuild2/file.hxx> set strong_. // - friend void create_bootstrap_outer (scope&); - friend scope& create_bootstrap_inner (scope&, const dir_path&); + friend LIBBUILD2_SYMEXPORT void create_bootstrap_outer (scope&); + friend LIBBUILD2_SYMEXPORT scope& create_bootstrap_inner (scope&, + const dir_path&); explicit scope (bool global): vars (global), target_vars (global) {} @@ -402,7 +405,7 @@ namespace build2 // Note that we assume the first insertion into the map is always the // global scope with empty key. // - iterator + LIBBUILD2_SYMEXPORT iterator insert (const dir_path&, bool root = false); // Find the most qualified scope that encompasses this path. @@ -443,24 +446,26 @@ namespace build2 rw (scope&) const {return const_cast<scope_map&> (*this);} private: - static scope_map instance; + LIBBUILD2_SYMEXPORT static scope_map instance; // Entities that can access bypassing the lock proof. // friend int main (int, char*[]); - friend variable_overrides reset (const strings&); + friend LIBBUILD2_SYMEXPORT variable_overrides reset (const strings&); - scope& + LIBBUILD2_SYMEXPORT scope& find (const dir_path&); public: - static const scope_map& cinstance; // For var_pool initialization. + // For var_pool initialization. + // + LIBBUILD2_SYMEXPORT static const scope_map& cinstance; }; - extern const scope_map& scopes; - extern const scope* global_scope; + LIBBUILD2_SYMEXPORT extern const scope_map& scopes; + LIBBUILD2_SYMEXPORT extern const scope* global_scope; } -#include <build2/scope.ixx> +#include <libbuild2/scope.ixx> -#endif // BUILD2_SCOPE_HXX +#endif // LIBBUILD2_SCOPE_HXX diff --git a/build2/scope.ixx b/libbuild2/scope.ixx index 171ab25..3498ae0 100644 --- a/build2/scope.ixx +++ b/libbuild2/scope.ixx @@ -1,4 +1,4 @@ -// file : build2/scope.ixx -*- C++ -*- +// file : libbuild2/scope.ixx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file diff --git a/build2/search.cxx b/libbuild2/search.cxx index 68fd5a5..1ff9c73 100644 --- a/build2/search.cxx +++ b/libbuild2/search.cxx @@ -1,15 +1,15 @@ -// file : build2/search.cxx -*- C++ -*- +// file : libbuild2/search.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/search.hxx> +#include <libbuild2/search.hxx> -#include <build2/scope.hxx> -#include <build2/target.hxx> -#include <build2/context.hxx> -#include <build2/filesystem.hxx> // mtime() -#include <build2/prerequisite.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/filesystem.hxx> // mtime() +#include <libbuild2/prerequisite.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; using namespace butl; diff --git a/build2/search.hxx b/libbuild2/search.hxx index 3e08bf8..b281b12 100644 --- a/build2/search.hxx +++ b/libbuild2/search.hxx @@ -1,12 +1,14 @@ -// file : build2/search.hxx -*- C++ -*- +// file : libbuild2/search.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_SEARCH_HXX -#define BUILD2_SEARCH_HXX +#ifndef LIBBUILD2_SEARCH_HXX +#define LIBBUILD2_SEARCH_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -15,7 +17,7 @@ namespace build2 // Search for an existing target in this prerequisite's scope. // - const target* + LIBBUILD2_SYMEXPORT const target* search_existing_target (const prerequisite_key&); // Search for an existing file. If the prerequisite directory is relative, @@ -27,13 +29,13 @@ namespace build2 // Originally the plan was to have a target-type specific variable that // contains the search paths. But there wasn't any need for this yet. // - const target* + LIBBUILD2_SYMEXPORT const target* search_existing_file (const prerequisite_key&); // Create a new target in this prerequisite's scope. // - const target& + LIBBUILD2_SYMEXPORT const target& create_new_target (const prerequisite_key&); } -#endif // BUILD2_SEARCH_HXX +#endif // LIBBUILD2_SEARCH_HXX diff --git a/build2/spec.cxx b/libbuild2/spec.cxx index eb85c68..3ad6b7d 100644 --- a/build2/spec.cxx +++ b/libbuild2/spec.cxx @@ -1,11 +1,11 @@ -// file : build2/spec.cxx -*- C++ -*- +// file : libbuild2/spec.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/spec.hxx> +#include <libbuild2/spec.hxx> -#include <build2/context.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; diff --git a/build2/spec.hxx b/libbuild2/spec.hxx index 9b429da..b18f665 100644 --- a/build2/spec.hxx +++ b/libbuild2/spec.hxx @@ -1,14 +1,16 @@ -// file : build2/spec.hxx -*- C++ -*- +// file : libbuild2/spec.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_SPEC_HXX -#define BUILD2_SPEC_HXX +#ifndef LIBBUILD2_SPEC_HXX +#define LIBBUILD2_SPEC_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/variable.hxx> +#include <libbuild2/variable.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -54,17 +56,17 @@ namespace build2 typedef vector<metaopspec> buildspec; - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, const targetspec&); - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, const opspec&); - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, const metaopspec&); - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, const buildspec&); } -#endif // BUILD2_SPEC_HXX +#endif // LIBBUILD2_SPEC_HXX diff --git a/build2/target-key.hxx b/libbuild2/target-key.hxx index ed9a0ed..e23991d 100644 --- a/build2/target-key.hxx +++ b/libbuild2/target-key.hxx @@ -1,19 +1,21 @@ -// file : build2/target-key.hxx -*- C++ -*- +// file : libbuild2/target-key.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_TARGET_KEY_HXX -#define BUILD2_TARGET_KEY_HXX +#ifndef LIBBUILD2_TARGET_KEY_HXX +#define LIBBUILD2_TARGET_KEY_HXX #include <map> #include <cstring> // strcmp() #include <libbutl/utility.mxx> // compare_c_string -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target-type.hxx> +#include <libbuild2/target-type.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -71,10 +73,10 @@ namespace build2 // If the target type has a custom print function, call that. Otherwise, // call to_stream(). Both are defined in target.cxx. // - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, const target_key&); - ostream& + LIBBUILD2_SYMEXPORT ostream& to_stream (ostream&, const target_key&, optional<stream_verbosity> = nullopt); } @@ -101,4 +103,4 @@ namespace std }; } -#endif // BUILD2_TARGET_KEY_HXX +#endif // LIBBUILD2_TARGET_KEY_HXX diff --git a/build2/target-state.hxx b/libbuild2/target-state.hxx index ff44edc..5bc6895 100644 --- a/build2/target-state.hxx +++ b/libbuild2/target-state.hxx @@ -1,12 +1,14 @@ -// file : build2/target-state.hxx -*- C++ -*- +// file : libbuild2/target-state.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_TARGET_STATE_HXX -#define BUILD2_TARGET_STATE_HXX +#ifndef LIBBUILD2_TARGET_STATE_HXX +#define LIBBUILD2_TARGET_STATE_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -37,8 +39,8 @@ namespace build2 return l; } - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, target_state); // target.cxx } -#endif // BUILD2_TARGET_STATE_HXX +#endif // LIBBUILD2_TARGET_STATE_HXX diff --git a/build2/target-type.hxx b/libbuild2/target-type.hxx index aec1bcf..3537c90 100644 --- a/build2/target-type.hxx +++ b/libbuild2/target-type.hxx @@ -1,14 +1,16 @@ -// file : build2/target-type.hxx -*- C++ -*- +// file : libbuild2/target-type.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_TARGET_TYPE_HXX -#define BUILD2_TARGET_TYPE_HXX +#ifndef LIBBUILD2_TARGET_TYPE_HXX +#define LIBBUILD2_TARGET_TYPE_HXX #include <map> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -55,7 +57,7 @@ namespace build2 // non-directory target must first call target::split_name() if reverse is // false. // - struct target_type + struct LIBBUILD2_SYMEXPORT target_type { const char* name; const target_type* base; @@ -203,4 +205,4 @@ namespace build2 }; } -#endif // BUILD2_TARGET_TYPE_HXX +#endif // LIBBUILD2_TARGET_TYPE_HXX diff --git a/build2/target.cxx b/libbuild2/target.cxx index fee77b4..c823e85 100644 --- a/build2/target.cxx +++ b/libbuild2/target.cxx @@ -1,15 +1,15 @@ -// file : build2/target.cxx -*- C++ -*- +// file : libbuild2/target.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/target.hxx> +#include <libbuild2/target.hxx> -#include <build2/file.hxx> -#include <build2/scope.hxx> -#include <build2/search.hxx> -#include <build2/algorithm.hxx> -#include <build2/filesystem.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/file.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/search.hxx> +#include <libbuild2/algorithm.hxx> +#include <libbuild2/filesystem.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; using namespace butl; diff --git a/build2/target.hxx b/libbuild2/target.hxx index b389ea5..cfbd9bc 100644 --- a/build2/target.hxx +++ b/libbuild2/target.hxx @@ -1,9 +1,9 @@ -// file : build2/target.hxx -*- C++ -*- +// file : libbuild2/target.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_TARGET_HXX -#define BUILD2_TARGET_HXX +#ifndef LIBBUILD2_TARGET_HXX +#define LIBBUILD2_TARGET_HXX #include <iterator> // tags, etc. #include <type_traits> // aligned_storage @@ -11,16 +11,18 @@ #include <libbutl/multi-index.mxx> // map_iterator_adapter -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/scope.hxx> -#include <build2/action.hxx> -#include <build2/variable.hxx> -#include <build2/target-key.hxx> -#include <build2/target-type.hxx> -#include <build2/target-state.hxx> -#include <build2/prerequisite.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/action.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/target-key.hxx> +#include <libbuild2/target-type.hxx> +#include <libbuild2/target-state.hxx> +#include <libbuild2/prerequisite.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -28,9 +30,11 @@ namespace build2 class scope; class target; - extern size_t current_on; // From <build/context>. + // From <libbuild2/context.hxx>. + // + LIBBUILD2_SYMEXPORT extern size_t current_on; - // From <build2/algorithm.hxx>. + // From <libbuild2/algorithm.hxx>. // const target& search (const target&, const prerequisite&); const target* search_existing (const prerequisite&); @@ -61,20 +65,24 @@ namespace build2 // all the prerequisites in a loop, skipping ignored. Specifically, // for actions with the "first" execution mode, it calls // execute_prerequisites() while for those with the "last" mode -- - // reverse_execute_prerequisites(); see <build2/operation.hxx>, - // <build2/algorithm.hxx> for details. The group recipe call's the group's - // recipe. + // reverse_execute_prerequisites(); see <libbuild2/operation.hxx>, + // <libbuild2/algorithm.hxx> for details. The group recipe call's the + // group's recipe. // - extern const recipe empty_recipe; - extern const recipe noop_recipe; - extern const recipe default_recipe; - extern const recipe group_recipe; + LIBBUILD2_SYMEXPORT extern const recipe empty_recipe; + LIBBUILD2_SYMEXPORT extern const recipe noop_recipe; + LIBBUILD2_SYMEXPORT extern const recipe default_recipe; + LIBBUILD2_SYMEXPORT extern const recipe group_recipe; - target_state - noop_action (action, const target&); // Defined in <build2/algorithm.hxx>. + // Defined in <libbuild2/algorithm.hxx>. + // + LIBBUILD2_SYMEXPORT target_state + noop_action (action, const target&); - target_state - group_action (action, const target&); // Defined in <build2/algorithm.hxx>. + // Defined in <libbuild2/algorithm.hxx>. + // + LIBBUILD2_SYMEXPORT target_state + group_action (action, const target&); // A view of target group members. // @@ -114,7 +122,7 @@ namespace build2 // Target. // - class target + class LIBBUILD2_SYMEXPORT target { optional<string>* ext_; // Reference to value in target_key. @@ -337,17 +345,10 @@ namespace build2 // be racy (see target::group). // bool - has_prerequisites () const - { - return !prerequisites ().empty (); - } + has_prerequisites () const; bool - has_group_prerequisites () const - { - return has_prerequisites () || - (group != nullptr && !group->has_prerequisites ()); - } + has_group_prerequisites () const; private: friend class parser; @@ -470,7 +471,7 @@ namespace build2 // Inner/outer operation state. See operation.hxx for details. // - class opstate + class LIBBUILD2_SYMEXPORT opstate { public: mutable atomic_count task_count {0}; // Start offset_touched - 1. @@ -592,10 +593,7 @@ namespace build2 // is known to be unchanged. Used for optimizations during search & match. // bool - unchanged (action a) const - { - return matched_state_impl (a).second == target_state::unchanged; - } + unchanged (action) const; // This function should only be called during execution if we have // observed (synchronization-wise) that this target has been executed. @@ -783,8 +781,8 @@ namespace build2 inline bool operator!= (const target& x, const target& y) {return !(x == y);} - inline ostream& - operator<< (ostream& os, const target& t) {return os << t.key ();} + ostream& + operator<< (ostream&, const target&); // Sometimes it is handy to "mark" a pointer to a target (for example, in // prerequisite_targets). We use the last 2 bits in a pointer for that (aka @@ -822,19 +820,9 @@ namespace build2 { public: explicit - group_prerequisites (const target& t) - : t_ (t), - g_ (t_.group == nullptr || - t_.group->member != nullptr || // Ad hoc group member. - t_.group->prerequisites ().empty () - ? nullptr : t_.group) {} + group_prerequisites (const target& t); - explicit - group_prerequisites (const target& t, const target* g) - : t_ (t), - g_ (g == nullptr || - g->prerequisites ().empty () - ? nullptr : g) {} + group_prerequisites (const target& t, const target* g); using prerequisites_type = target::prerequisites_type; using base_iterator = prerequisites_type::const_iterator; @@ -854,31 +842,13 @@ namespace build2 base_iterator i): t_ (t), g_ (g), c_ (c), i_ (i) {} iterator& - operator++ () - { - if (++i_ == c_->end () && c_ != &t_->prerequisites ()) - { - c_ = &t_->prerequisites (); - i_ = c_->begin (); - } - return *this; - } + operator++ (); iterator operator++ (int) {iterator r (*this); operator++ (); return r;} iterator& - operator-- () - { - if (i_ == c_->begin () && c_ == &t_->prerequisites ()) - { - c_ = &g_->prerequisites (); - i_ = c_->end (); - } - - --i_; - return *this; - } + operator-- (); iterator operator-- (int) {iterator r (*this); operator-- (); return r;} @@ -905,18 +875,10 @@ namespace build2 using reverse_iterator = std::reverse_iterator<iterator>; iterator - begin () const - { - auto& c ((g_ != nullptr ? *g_ : t_).prerequisites ()); - return iterator (&t_, g_, &c, c.begin ()); - } + begin () const; iterator - end () const - { - auto& c (t_.prerequisites ()); - return iterator (&t_, g_, &c, c.end ()); - } + end () const; reverse_iterator rbegin () const {return reverse_iterator (end ());} @@ -925,11 +887,7 @@ namespace build2 rend () const {return reverse_iterator (begin ());} size_t - size () const - { - return t_.prerequisites ().size () + - (g_ != nullptr ? g_->prerequisites ().size () : 0); - } + size () const; private: const target& t_; @@ -968,12 +926,7 @@ namespace build2 } prerequisite_key - key () const - { - return member != nullptr - ? prerequisite_key {prerequisite.proj, member->key (), nullptr} - : prerequisite.key (); - } + key () const; const target_type_type& type () const @@ -1230,37 +1183,17 @@ namespace build2 base_iterator e_; }; - // prerequisite_members(t.prerequisites) + // prerequisite_members(t.prerequisites ()) // - inline auto - prerequisite_members (action a, target& t, - members_mode m = members_mode::always) - { - return prerequisite_members (a, t, t.prerequisites (), m); - } - - inline auto + auto prerequisite_members (action a, const target& t, - members_mode m = members_mode::always) - { - return prerequisite_members (a, t, t.prerequisites (), m); - } + members_mode m = members_mode::always); - // prerequisite_members(reverse_iterate(t.prerequisites)) + // prerequisite_members(reverse_iterate(t.prerequisites ())) // - inline auto - reverse_prerequisite_members (action a, target& t, - members_mode m = members_mode::always) - { - return prerequisite_members (a, t, reverse_iterate (t.prerequisites ()), m); - } - - inline auto + auto reverse_prerequisite_members (action a, const target& t, - members_mode m = members_mode::always) - { - return prerequisite_members (a, t, reverse_iterate (t.prerequisites ()), m); - } + members_mode m = members_mode::always); // prerequisite_members(group_prerequisites (t)) // @@ -1305,7 +1238,7 @@ namespace build2 // // Note also that once the extension is specified, it becomes immutable. // - class target_set + class LIBBUILD2_SYMEXPORT target_set { public: using map_type = std::unordered_map<target_key, unique_ptr<target>>; @@ -1450,11 +1383,11 @@ namespace build2 map_type map_; }; - extern target_set targets; + LIBBUILD2_SYMEXPORT extern target_set targets; // Modification time-based target. // - class mtime_target: public target + class LIBBUILD2_SYMEXPORT mtime_target: public target { public: using target::target; @@ -1510,7 +1443,7 @@ namespace build2 // Complain if timestamp is not lock-free unless we were told non-lock- // free is ok. // -#ifndef BUILD2_ATOMIC_NON_LOCK_FREE +#ifndef LIBBUILD2_ATOMIC_NON_LOCK_FREE // C++17: // // static_assert (atomic<timestamp::rep>::is_always_lock_free, @@ -1533,7 +1466,7 @@ namespace build2 // Filesystem path-based target. // - class path_target: public mtime_target + class LIBBUILD2_SYMEXPORT path_target: public mtime_target { public: using mtime_target::mtime_target; @@ -1565,7 +1498,7 @@ namespace build2 path (path_type) const; timestamp - load_mtime () const {return mtime_target::load_mtime (path ());} + load_mtime () const; // Derive a path from target's dir, name, and, if set, ext. If ext is not // set, try to derive it using the target type extension function and @@ -1642,7 +1575,7 @@ namespace build2 // File target. // - class file: public path_target + class LIBBUILD2_SYMEXPORT file: public path_target { public: using path_target::path_target; @@ -1655,7 +1588,7 @@ namespace build2 // Alias target. It represents a list of targets (its prerequisites) // as a single "name". // - class alias: public target + class LIBBUILD2_SYMEXPORT alias: public target { public: using target::target; @@ -1669,7 +1602,7 @@ namespace build2 // but rather an alias target with the directory name. For actual // filesystem directory (creation), see fsdir. // - class dir: public alias + class LIBBUILD2_SYMEXPORT dir: public alias { public: using alias::alias; @@ -1702,7 +1635,7 @@ namespace build2 // already exist. In particular, we don't want to update the target just // because some unrelated entry was created in that directory. // - class fsdir: public target + class LIBBUILD2_SYMEXPORT fsdir: public target { public: using target::target; @@ -1714,7 +1647,7 @@ namespace build2 // Executable file. // - class exe: public file + class LIBBUILD2_SYMEXPORT exe: public file { public: using file::file; @@ -1724,7 +1657,7 @@ namespace build2 virtual const target_type& dynamic_type () const {return static_type;} }; - class buildfile: public file + class LIBBUILD2_SYMEXPORT buildfile: public file { public: using file::file; @@ -1736,7 +1669,7 @@ namespace build2 // Common documentation file targets. // - class doc: public file + class LIBBUILD2_SYMEXPORT doc: public file { public: using file::file; @@ -1780,7 +1713,7 @@ namespace build2 // Note that handling subsections with man1..9{} is easy, we // simply specify the extension explicitly, e.g., man{foo.1p}. // - class man: public doc + class LIBBUILD2_SYMEXPORT man: public doc { public: using doc::doc; @@ -1790,7 +1723,7 @@ namespace build2 virtual const target_type& dynamic_type () const {return static_type;} }; - class man1: public man + class LIBBUILD2_SYMEXPORT man1: public man { public: using man::man; @@ -1805,7 +1738,7 @@ namespace build2 // If you think about it, it's kind of a documentation, similar to (but // better than) the version file that many projects come with. // - class manifest: public doc + class LIBBUILD2_SYMEXPORT manifest: public doc { public: using doc::doc; @@ -1856,29 +1789,29 @@ namespace build2 // Target type uses the extension but it is fixed and there is no use // printing it (e.g., man1{}). // - void + LIBBUILD2_SYMEXPORT void target_print_0_ext_verb (ostream&, const target_key&); // Target type uses the extension and there is normally no default so it // should be printed (e.g., file{}). // - void + LIBBUILD2_SYMEXPORT void target_print_1_ext_verb (ostream&, const target_key&); // The default behavior, that is, look for an existing target in the // prerequisite's directory scope. // - const target* + LIBBUILD2_SYMEXPORT const target* target_search (const target&, const prerequisite_key&); // First look for an existing target as above. If not found, then look // for an existing file in the target-type-specific list of paths. // - const target* + LIBBUILD2_SYMEXPORT const target* file_search (const target&, const prerequisite_key&); } -#include <build2/target.ixx> -#include <build2/target.txx> +#include <libbuild2/target.ixx> +#include <libbuild2/target.txx> -#endif // BUILD2_TARGET_HXX +#endif // LIBBUILD2_TARGET_HXX diff --git a/build2/target.ixx b/libbuild2/target.ixx index 30be02f..4570558 100644 --- a/build2/target.ixx +++ b/libbuild2/target.ixx @@ -1,10 +1,10 @@ -// file : build2/target.ixx -*- C++ -*- +// file : libbuild2/target.ixx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include <cstring> // memcpy() -#include <build2/filesystem.hxx> // mtime() +#include <libbuild2/filesystem.hxx> // mtime() namespace build2 { @@ -64,6 +64,27 @@ namespace build2 } } + inline bool target:: + group_state (action a) const + { + // We go an extra step and short-circuit to the target state even if the + // raw state is not group provided the recipe is group_recipe and the + // state is unknown (see mtime() for a discussion on why we do it). + // + const opstate& s (state[a]); + + if (s.state == target_state::group) + return true; + + if (s.state == target_state::unknown && group != nullptr) + { + if (recipe_function* const* f = s.recipe.target<recipe_function*> ()) + return *f == &group_action; + } + + return false; + } + inline pair<bool, target_state> target:: matched_state_impl (action a) const { @@ -93,27 +114,6 @@ namespace build2 return (group_state (a) ? group->state : state)[a].state; } - inline bool target:: - group_state (action a) const - { - // We go an extra step and short-circuit to the target state even if the - // raw state is not group provided the recipe is group_recipe and the - // state is unknown (see mtime() for a discussion on why we do it). - // - const opstate& s (state[a]); - - if (s.state == target_state::group) - return true; - - if (s.state == target_state::unknown && group != nullptr) - { - if (recipe_function* const* f = s.recipe.target<recipe_function*> ()) - return *f == &group_action; - } - - return false; - } - inline target_state target:: matched_state (action a, bool fail) const { @@ -149,6 +149,31 @@ namespace build2 return r; } + inline bool target:: + has_prerequisites () const + { + return !prerequisites ().empty (); + } + + inline bool target:: + has_group_prerequisites () const + { + return has_prerequisites () || + (group != nullptr && !group->has_prerequisites ()); + } + + inline bool target:: + unchanged (action a) const + { + return matched_state_impl (a).second == target_state::unchanged; + } + + inline ostream& + operator<< (ostream& os, const target& t) + { + return os << t.key (); + } + // mark()/unmark() // @@ -186,6 +211,75 @@ namespace build2 return m; } + // group_prerequisites + // + inline group_prerequisites:: + group_prerequisites (const target& t) + : t_ (t), + g_ (t_.group == nullptr || + t_.group->member != nullptr || // Ad hoc group member. + t_.group->prerequisites ().empty () + ? nullptr : t_.group) + { + } + + inline group_prerequisites:: + group_prerequisites (const target& t, const target* g) + : t_ (t), + g_ (g == nullptr || + g->prerequisites ().empty () + ? nullptr : g) + { + } + + inline auto group_prerequisites:: + begin () const -> iterator + { + auto& c ((g_ != nullptr ? *g_ : t_).prerequisites ()); + return iterator (&t_, g_, &c, c.begin ()); + } + + inline auto group_prerequisites:: + end () const -> iterator + { + auto& c (t_.prerequisites ()); + return iterator (&t_, g_, &c, c.end ()); + } + + inline size_t group_prerequisites:: + size () const + { + return t_.prerequisites ().size () + + (g_ != nullptr ? g_->prerequisites ().size () : 0); + } + + // group_prerequisites::iterator + // + inline auto group_prerequisites::iterator:: + operator++ () -> iterator& + { + if (++i_ == c_->end () && c_ != &t_->prerequisites ()) + { + c_ = &t_->prerequisites (); + i_ = c_->begin (); + } + return *this; + } + + + inline auto group_prerequisites::iterator:: + operator-- () -> iterator& + { + if (i_ == c_->begin () && c_ == &t_->prerequisites ()) + { + c_ = &g_->prerequisites (); + i_ = c_->end (); + } + + --i_; + return *this; + } + // prerequisite_member // inline prerequisite prerequisite_member:: @@ -202,6 +296,14 @@ namespace build2 return prerequisite_type (*member); } + inline prerequisite_key prerequisite_member:: + key () const + { + return member != nullptr + ? prerequisite_key {prerequisite.proj, member->key (), nullptr} + : prerequisite.key (); + } + // prerequisite_members // group_view @@ -297,6 +399,18 @@ namespace build2 false; } + inline auto + prerequisite_members (action a, const target& t, members_mode m) + { + return prerequisite_members (a, t, t.prerequisites (), m); + } + + inline auto + reverse_prerequisite_members (action a, const target& t, members_mode m) + { + return prerequisite_members (a, t, reverse_iterate (t.prerequisites ()), m); + } + // mtime_target // inline void mtime_target:: @@ -373,4 +487,10 @@ namespace build2 return path_; } + + inline timestamp path_target:: + load_mtime () const + { + return mtime_target::load_mtime (path ()); + } } diff --git a/build2/target.txx b/libbuild2/target.txx index 3cc249b..b93a403 100644 --- a/build2/target.txx +++ b/libbuild2/target.txx @@ -1,12 +1,12 @@ -// file : build2/target.txx -*- C++ -*- +// file : libbuild2/target.txx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include <libbutl/filesystem.mxx> // dir_iterator -#include <build2/scope.hxx> -#include <build2/diagnostics.hxx> -#include <build2/prerequisite.hxx> +#include <libbuild2/scope.hxx> +#include <libbuild2/diagnostics.hxx> +#include <libbuild2/prerequisite.hxx> namespace build2 { diff --git a/build2/token.cxx b/libbuild2/token.cxx index 8b62b46..7455e26 100644 --- a/build2/token.cxx +++ b/libbuild2/token.cxx @@ -1,8 +1,8 @@ -// file : build2/token.cxx -*- C++ -*- +// file : libbuild2/token.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/token.hxx> +#include <libbuild2/token.hxx> using namespace std; diff --git a/build2/token.hxx b/libbuild2/token.hxx index 50d1396..a9b9a11 100644 --- a/build2/token.hxx +++ b/libbuild2/token.hxx @@ -1,14 +1,16 @@ -// file : build2/token.hxx -*- C++ -*- +// file : libbuild2/token.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_TOKEN_HXX -#define BUILD2_TOKEN_HXX +#ifndef LIBBUILD2_TOKEN_HXX +#define LIBBUILD2_TOKEN_HXX -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/diagnostics.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -78,7 +80,7 @@ namespace build2 class token; - void + LIBBUILD2_SYMEXPORT void token_printer (ostream&, const token&, bool); class token @@ -186,4 +188,4 @@ namespace build2 } } -#endif // BUILD2_TOKEN_HXX +#endif // LIBBUILD2_TOKEN_HXX diff --git a/build2/types.hxx b/libbuild2/types.hxx index 15b7df6..cbaf89a 100644 --- a/build2/types.hxx +++ b/libbuild2/types.hxx @@ -1,16 +1,16 @@ -// file : build2/types.hxx -*- C++ -*- +// file : libbuild2/types.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_TYPES_HXX -#define BUILD2_TYPES_HXX +#ifndef LIBBUILD2_TYPES_HXX +#define LIBBUILD2_TYPES_HXX // Include unprocessed file during bootstrap. See config.hxx.in for details. // #ifdef BUILD2_BOOTSTRAP -# include <build2/config.hxx.in> +# include <libbuild2/config.hxx.in> #else -# include <build2/config.hxx> +# include <libbuild2/config.hxx> #endif #include <array> @@ -56,6 +56,8 @@ #include <libbutl/semantic-version.mxx> #include <libbutl/standard-version.mxx> +#include <libbuild2/export.hxx> + namespace build2 { // Commonly-used types. @@ -328,10 +330,10 @@ namespace build2 // enum class run_phase {load, match, execute}; - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, run_phase); // utility.cxx - extern run_phase phase; + LIBBUILD2_SYMEXPORT extern run_phase phase; } // In order to be found (via ADL) these have to be either in std:: or in @@ -342,17 +344,17 @@ namespace std { // Path printing with trailing slash for directories. // - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, const ::butl::path&); // Print as recall[@effect]. // - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, const ::butl::process_path&); } -// <build2/name.hxx> +// <libbuild2/name.hxx> // -#include <build2/name.hxx> +#include <libbuild2/name.hxx> -#endif // BUILD2_TYPES_HXX +#endif // LIBBUILD2_TYPES_HXX diff --git a/build2/utility.cxx b/libbuild2/utility.cxx index 9448c03..396ce82 100644 --- a/build2/utility.cxx +++ b/libbuild2/utility.cxx @@ -1,23 +1,23 @@ -// file : build2/utility.cxx -*- C++ -*- +// file : libbuild2/utility.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/utility.hxx> +#include <libbuild2/utility.hxx> #include <time.h> // tzset() (POSIX), _tzset() (Windows) #include <cstring> // strlen(), str[n]cmp() #include <iostream> // cerr -#include <build2/target.hxx> -#include <build2/variable.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/target.hxx> +#include <libbuild2/variable.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; using namespace butl; // -// <build2/types.hxx> +// <libbuild2/types.hxx> // namespace build2 { @@ -67,11 +67,11 @@ namespace std namespace build2 { // - // <build2/utility.hxx> + // <libbuild2/utility.hxx> // process_path argv0; - const standard_version build_version (BUILD2_VERSION_STR); + const standard_version build_version (LIBBUILD2_VERSION_STR); bool dry_run_option; optional<bool> mtime_check_option; diff --git a/build2/utility.hxx b/libbuild2/utility.hxx index 0aa5537..af72c58 100644 --- a/build2/utility.hxx +++ b/libbuild2/utility.hxx @@ -1,9 +1,9 @@ -// file : build2/utility.hxx -*- C++ -*- +// file : libbuild2/utility.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_UTILITY_HXX -#define BUILD2_UTILITY_HXX +#ifndef LIBBUILD2_UTILITY_HXX +#define LIBBUILD2_UTILITY_HXX #include <tuple> // make_tuple() #include <memory> // make_shared() @@ -20,20 +20,22 @@ #include <unordered_set> -#include <build2/types.hxx> +#include <libbuild2/types.hxx> // "Fake" version values used during bootstrap. // #ifdef BUILD2_BOOTSTRAP -# define BUILD2_VERSION 9999999999999990000ULL -# define BUILD2_VERSION_STR "99999.99999.99999" -# define BUILD2_VERSION_ID "99999.99999.99999" -# define LIBBUTL_VERSION_STR "99999.99999.99999" -# define LIBBUTL_VERSION_ID "99999.99999.99999" +# define LIBBUILD2_VERSION 9999999999999990000ULL +# define LIBBUILD2_VERSION_STR "99999.99999.99999" +# define LIBBUILD2_VERSION_ID "99999.99999.99999" +# define LIBBUTL_VERSION_STR "99999.99999.99999" +# define LIBBUTL_VERSION_ID "99999.99999.99999" #else -# include <build2/version.hxx> +# include <libbuild2/version.hxx> #endif +#include <libbuild2/export.hxx> + namespace build2 { using std::move; @@ -92,29 +94,31 @@ namespace build2 // Initialize the diagnostics state. Should be called once early in main(). // Default values are for unit tests. // - void + LIBBUILD2_SYMEXPORT void init_diag (uint16_t verbosity, optional<bool> progress = nullopt, bool no_lines = false, bool no_columns = false, bool stderr_term = false); - extern uint16_t verb; - const uint16_t verb_never = 7; + LIBBUILD2_SYMEXPORT extern uint16_t verb; + const uint16_t verb_never = 7; - extern optional<bool> diag_progress_option; // --[no-]progress + // --[no-]progress + // + LIBBUILD2_SYMEXPORT extern optional<bool> diag_progress_option; - extern bool diag_no_line; // --no-line - extern bool diag_no_column; // --no-column + LIBBUILD2_SYMEXPORT extern bool diag_no_line; // --no-line + LIBBUILD2_SYMEXPORT extern bool diag_no_column; // --no-column - extern bool stderr_term; // True if stderr is a terminal. + LIBBUILD2_SYMEXPORT extern bool stderr_term; // True if stderr is a terminal. // Global state (verbosity, home/work directories, etc). // Initialize the global state. Should be called once early in main(). // Default values are for unit tests. // - void + LIBBUILD2_SYMEXPORT void init (const char* argv0, bool keep_going = false, bool dry_run = false, @@ -124,35 +128,38 @@ namespace build2 // Build system driver process path (argv0.initial is argv[0]). // - extern process_path argv0; + LIBBUILD2_SYMEXPORT extern process_path argv0; // Build system driver version and check. // - extern const standard_version build_version; + LIBBUILD2_SYMEXPORT extern const standard_version build_version; + + LIBBUILD2_SYMEXPORT extern bool dry_run_option; // --dry-run - extern bool dry_run_option; // --dry-run - extern optional<bool> mtime_check_option; // --[no-]mtime-check + // --[no-]mtime-check + // + LIBBUILD2_SYMEXPORT extern optional<bool> mtime_check_option; - extern optional<path> config_sub; // --config-sub - extern optional<path> config_guess; // --config-guess + LIBBUILD2_SYMEXPORT extern optional<path> config_sub; // --config-sub + LIBBUILD2_SYMEXPORT extern optional<path> config_guess; // --config-guess class location; - void + LIBBUILD2_SYMEXPORT void check_build_version (const standard_version_constraint&, const location&); // Work/home directories (must be initialized in main()) and relative path // calculation. // - extern dir_path work; - extern dir_path home; + LIBBUILD2_SYMEXPORT extern dir_path work; + LIBBUILD2_SYMEXPORT extern dir_path home; // By default this points to work. Setting this to something else should // only be done in tightly controlled, non-concurrent situations (e.g., // state dump). If it is empty, then relative() below returns the original // path. // - extern const dir_path* relative_base; + LIBBUILD2_SYMEXPORT extern const dir_path* relative_base; // If possible and beneficial, translate an absolute, normalized path into // relative to the relative_base directory, which is normally work. Note @@ -165,7 +172,7 @@ namespace build2 class path_target; - path + LIBBUILD2_SYMEXPORT path relative (const path_target&); // In addition to calling relative(), this function also uses shorter @@ -173,7 +180,7 @@ namespace build2 // slash. If the path is the same as base, returns "./" if current is true // and empty string otherwise. // - string + LIBBUILD2_SYMEXPORT string diag_relative (const path&, bool current = true); // Basic process utilities. @@ -184,7 +191,7 @@ namespace build2 // Search for a process executable. Issue diagnostics and throw failed in // case of an error. // - process_path + LIBBUILD2_SYMEXPORT process_path run_search (const char*& args0, bool path_only, const location& = location ()); @@ -195,14 +202,14 @@ namespace build2 return run_search (args0, false, l); } - process_path + LIBBUILD2_SYMEXPORT process_path run_search (const path&, bool init = false, const dir_path& fallback = dir_path (), bool path_only = false, const location& = location ()); - process_path + LIBBUILD2_SYMEXPORT process_path try_run_search (const path&, bool init = false, const dir_path& fallback = dir_path (), @@ -215,7 +222,7 @@ namespace build2 // false), return false. The last argument is used in cooperation with // run_start() in case STDERR is redirected to STDOUT. // - bool + LIBBUILD2_SYMEXPORT bool run_finish (const char* args[], process&, bool error = true, @@ -235,7 +242,7 @@ namespace build2 // from the child process). Issue diagnostics and throw failed in case of an // error. // - process + LIBBUILD2_SYMEXPORT process run_start (uint16_t verbosity, const process_env&, // Implicit-constructible from process_path. const char* args[], @@ -442,15 +449,15 @@ namespace build2 // Empty/nullopt string, path, and project name. // - extern const string empty_string; - extern const path empty_path; - extern const dir_path empty_dir_path; - extern const project_name empty_project_name; + LIBBUILD2_SYMEXPORT extern const string empty_string; + LIBBUILD2_SYMEXPORT extern const path empty_path; + LIBBUILD2_SYMEXPORT extern const dir_path empty_dir_path; + LIBBUILD2_SYMEXPORT extern const project_name empty_project_name; - extern const optional<string> nullopt_string; - extern const optional<path> nullopt_path; - extern const optional<dir_path> nullopt_dir_path; - extern const optional<project_name> nullopt_project_name; + LIBBUILD2_SYMEXPORT extern const optional<string> nullopt_string; + LIBBUILD2_SYMEXPORT extern const optional<path> nullopt_path; + LIBBUILD2_SYMEXPORT extern const optional<dir_path> nullopt_dir_path; + LIBBUILD2_SYMEXPORT extern const optional<project_name> nullopt_project_name; // Hash a path potentially without the specific directory prefix. // @@ -502,13 +509,13 @@ namespace build2 class value; struct lookup; - void + LIBBUILD2_SYMEXPORT void append_options (cstrings&, const lookup&, const char* excl = nullptr); - void + LIBBUILD2_SYMEXPORT void append_options (strings&, const lookup&, const char* excl = nullptr); - void + LIBBUILD2_SYMEXPORT void hash_options (sha256&, const lookup&); void @@ -520,17 +527,17 @@ namespace build2 void hash_options (sha256&, const strings&); - void + LIBBUILD2_SYMEXPORT void append_options (cstrings&, const strings&, size_t, const char* excl = nullptr); - void + LIBBUILD2_SYMEXPORT void append_options (strings&, const strings&, size_t, const char* excl = nullptr); - void + LIBBUILD2_SYMEXPORT void hash_options (sha256&, const strings&, size_t); // As above but append/hash option values for the specified option (e.g., @@ -567,13 +574,13 @@ namespace build2 const char* variable, bool ignore_case = false); - bool + LIBBUILD2_SYMEXPORT bool find_option (const char* option, const lookup&, bool ignore_case = false); - bool + LIBBUILD2_SYMEXPORT bool find_option (const char* option, const strings&, bool ignore_case = false); - bool + LIBBUILD2_SYMEXPORT bool find_option (const char* option, const cstrings&, bool ignore_case = false); // As above but look for several options returning true if any is present. @@ -589,13 +596,13 @@ namespace build2 bool find_options (initializer_list<const char*>, T&, const char*, bool = false); - bool + LIBBUILD2_SYMEXPORT bool find_options (initializer_list<const char*>, const lookup&, bool = false); - bool + LIBBUILD2_SYMEXPORT bool find_options (initializer_list<const char*>, const strings&, bool = false); - bool + LIBBUILD2_SYMEXPORT bool find_options (initializer_list<const char*>, const cstrings&, bool = false); // As above but look for an option that has the specified prefix. Return the @@ -611,13 +618,13 @@ namespace build2 const string* find_option_prefix (const char* prefix, T&, const char*, bool = false); - const string* + LIBBUILD2_SYMEXPORT const string* find_option_prefix (const char* prefix, const lookup&, bool = false); - const string* + LIBBUILD2_SYMEXPORT const string* find_option_prefix (const char* prefix, const strings&, bool = false); - const char* + LIBBUILD2_SYMEXPORT const char* find_option_prefix (const char* prefix, const cstrings&, bool = false); // As above but look for several option prefixes. @@ -636,16 +643,16 @@ namespace build2 const char*, bool = false); - const string* + LIBBUILD2_SYMEXPORT const string* find_option_prefixes (initializer_list<const char*>, const lookup&, bool = false); - const string* + LIBBUILD2_SYMEXPORT const string* find_option_prefixes (initializer_list<const char*>, const strings&, bool = false); - const char* + LIBBUILD2_SYMEXPORT const char* find_option_prefixes (initializer_list<const char*>, const cstrings&, bool = false); @@ -654,11 +661,11 @@ namespace build2 // NULL or empty, then return the stem itself. Assume the pattern is valid, // i.e., contains a single '*' character. // - string + LIBBUILD2_SYMEXPORT string apply_pattern (const char* stem, const string* pattern); } -#include <build2/utility.ixx> -#include <build2/utility.txx> +#include <libbuild2/utility.ixx> +#include <libbuild2/utility.txx> -#endif // BUILD2_UTILITY_HXX +#endif // LIBBUILD2_UTILITY_HXX diff --git a/build2/utility.ixx b/libbuild2/utility.ixx index 1b1fe79..8d3f6ba 100644 --- a/build2/utility.ixx +++ b/libbuild2/utility.ixx @@ -1,4 +1,4 @@ -// file : build2/utility.ixx -*- C++ -*- +// file : libbuild2/utility.ixx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file diff --git a/build2/utility.txx b/libbuild2/utility.txx index 0bbdfad..a91cb15 100644 --- a/build2/utility.txx +++ b/libbuild2/utility.txx @@ -1,4 +1,4 @@ -// file : build2/utility.txx -*- C++ -*- +// file : libbuild2/utility.txx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file diff --git a/build2/variable.cxx b/libbuild2/variable.cxx index 173efe5..beb169e 100644 --- a/build2/variable.cxx +++ b/libbuild2/variable.cxx @@ -1,15 +1,15 @@ -// file : build2/variable.cxx -*- C++ -*- +// file : libbuild2/variable.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/variable.hxx> +#include <libbuild2/variable.hxx> #include <cstring> // memcmp() #include <libbutl/filesystem.mxx> // path_match() -#include <build2/context.hxx> -#include <build2/diagnostics.hxx> +#include <libbuild2/context.hxx> +#include <libbuild2/diagnostics.hxx> using namespace std; @@ -1519,4 +1519,15 @@ namespace build2 size_t variable_cache_mutex_shard_size; unique_ptr<shared_mutex[]> variable_cache_mutex_shard; + + template struct LIBBUILD2_DEFEXPORT value_traits<strings>; + template struct LIBBUILD2_DEFEXPORT value_traits<vector<name>>; + template struct LIBBUILD2_DEFEXPORT value_traits<paths>; + template struct LIBBUILD2_DEFEXPORT value_traits<dir_paths>; + template struct LIBBUILD2_DEFEXPORT value_traits<uint64s>; + + template struct LIBBUILD2_DEFEXPORT value_traits<std::map<string, string>>; + + template struct LIBBUILD2_DEFEXPORT + value_traits<std::map<project_name, dir_path>>; } diff --git a/build2/variable.hxx b/libbuild2/variable.hxx index 782cc2b..9a106b5 100644 --- a/build2/variable.hxx +++ b/libbuild2/variable.hxx @@ -1,9 +1,9 @@ -// file : build2/variable.hxx -*- C++ -*- +// file : libbuild2/variable.hxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_VARIABLE_HXX -#define BUILD2_VARIABLE_HXX +#ifndef LIBBUILD2_VARIABLE_HXX +#define LIBBUILD2_VARIABLE_HXX #include <map> #include <set> @@ -13,10 +13,12 @@ #include <libbutl/prefix-map.mxx> #include <libbutl/multi-index.mxx> // map_key -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/target-type.hxx> +#include <libbuild2/target-type.hxx> + +#include <libbuild2/export.hxx> namespace build2 { @@ -137,7 +139,7 @@ namespace build2 } #endif - ostream& + LIBBUILD2_SYMEXPORT ostream& operator<< (ostream&, variable_visibility); // variable @@ -253,7 +255,7 @@ namespace build2 // // - class value + class LIBBUILD2_SYMEXPORT value { public: // NULL means this value is not (yet) typed. @@ -397,12 +399,12 @@ namespace build2 // values can also be untyped. NULL values compare equal and a NULL value // is always less than a non-NULL. // - bool operator== (const value&, const value&); - bool operator!= (const value&, const value&); - bool operator< (const value&, const value&); - bool operator<= (const value&, const value&); - bool operator> (const value&, const value&); - bool operator>= (const value&, const value&); + LIBBUILD2_SYMEXPORT bool operator== (const value&, const value&); + bool operator!= (const value&, const value&); + LIBBUILD2_SYMEXPORT bool operator< (const value&, const value&); + bool operator<= (const value&, const value&); + LIBBUILD2_SYMEXPORT bool operator> (const value&, const value&); + bool operator>= (const value&, const value&); // Value cast. The first three expect the value to be not NULL. The cast // from lookup expects the value to also be defined. @@ -455,12 +457,14 @@ namespace build2 template <typename T> void typify (value&, const variable*); void typify (value&, const value_type&, const variable*); - void typify_atomic (value&, const value_type&, const variable*); + + LIBBUILD2_SYMEXPORT void + typify_atomic (value&, const value_type&, const variable*); // Remove value type from the value reversing it to names. This is similar // to reverse() below except that it modifies the value itself. // - void untypify (value&); + LIBBUILD2_SYMEXPORT void untypify (value&); // Reverse the value back to names. The value should not be NULL and storage // should be empty. @@ -678,7 +682,7 @@ namespace build2 // names // template <> - struct value_traits<names> + struct LIBBUILD2_SYMEXPORT value_traits<names> { static const names& empty_instance; }; @@ -686,7 +690,7 @@ namespace build2 // bool // template <> - struct value_traits<bool> + struct LIBBUILD2_SYMEXPORT value_traits<bool> { static_assert (sizeof (bool) <= value::size_, "insufficient space"); @@ -703,7 +707,7 @@ namespace build2 }; template <> - struct value_traits<uint64_t> + struct LIBBUILD2_SYMEXPORT value_traits<uint64_t> { static_assert (sizeof (uint64_t) <= value::size_, "insufficient space"); @@ -732,7 +736,7 @@ namespace build2 // string // template <> - struct value_traits<string> + struct LIBBUILD2_SYMEXPORT value_traits<string> { static_assert (sizeof (string) <= value::size_, "insufficient space"); @@ -758,7 +762,7 @@ namespace build2 // path // template <> - struct value_traits<path> + struct LIBBUILD2_SYMEXPORT value_traits<path> { static_assert (sizeof (path) <= value::size_, "insufficient space"); @@ -783,7 +787,7 @@ namespace build2 // dir_path // template <> - struct value_traits<dir_path> + struct LIBBUILD2_SYMEXPORT value_traits<dir_path> { static_assert (sizeof (dir_path) <= value::size_, "insufficient space"); @@ -804,7 +808,7 @@ namespace build2 // abs_dir_path // template <> - struct value_traits<abs_dir_path> + struct LIBBUILD2_SYMEXPORT value_traits<abs_dir_path> { static_assert (sizeof (abs_dir_path) <= value::size_, "insufficient space"); @@ -824,7 +828,7 @@ namespace build2 // name // template <> - struct value_traits<name> + struct LIBBUILD2_SYMEXPORT value_traits<name> { static_assert (sizeof (name) <= value::size_, "insufficient space"); @@ -847,7 +851,7 @@ namespace build2 // pair of two empties). // template <> - struct value_traits<name_pair> + struct LIBBUILD2_SYMEXPORT value_traits<name_pair> { static_assert (sizeof (name_pair) <= value::size_, "insufficient space"); @@ -868,7 +872,7 @@ namespace build2 // initial is its shallow copy. // template <> - struct value_traits<process_path> + struct LIBBUILD2_SYMEXPORT value_traits<process_path> { static_assert (sizeof (process_path) <= value::size_, "insufficient space"); @@ -889,7 +893,7 @@ namespace build2 // target_triplet // template <> - struct value_traits<target_triplet> + struct LIBBUILD2_SYMEXPORT value_traits<target_triplet> { static_assert (sizeof (target_triplet) <= value::size_, "insufficient space"); @@ -909,7 +913,7 @@ namespace build2 // project_name // template <> - struct value_traits<project_name> + struct LIBBUILD2_SYMEXPORT value_traits<project_name> { static_assert (sizeof (project_name) <= value::size_, "insufficient space"); @@ -981,6 +985,24 @@ namespace build2 static const value_type_ex value_type; }; + // Explicitly pre-instantiate and export value_traits templates for + // vector/map value types used in the build2 project. Note that this is not + // merely an optimization since not doing so we may end up with multiple + // value type objects for the same traits type (and we use their addressed + // as identity; see cast(const value&) for an example). + // + extern template struct LIBBUILD2_DECEXPORT value_traits<strings>; + extern template struct LIBBUILD2_DECEXPORT value_traits<vector<name>>; + extern template struct LIBBUILD2_DECEXPORT value_traits<paths>; + extern template struct LIBBUILD2_DECEXPORT value_traits<dir_paths>; + extern template struct LIBBUILD2_DECEXPORT value_traits<uint64s>; + + extern template struct LIBBUILD2_DECEXPORT + value_traits<std::map<string, string>>; + + extern template struct LIBBUILD2_DECEXPORT + value_traits<std::map<project_name, dir_path>>; + // Project-wide (as opposed to global) variable overrides. Returned by // context.cxx:reset(). // @@ -1085,7 +1107,7 @@ namespace build2 // names (i.e., there would be no cross-alias overriding). So for now we // don't allow this (use the common variable mechanism instead). // - const variable& + LIBBUILD2_SYMEXPORT const variable& insert_alias (const variable& var, string name); // Insert a variable pattern. Any variable that matches this pattern @@ -1115,7 +1137,7 @@ namespace build2 // for the insertion order (you probably want more specific first). // public: - void + LIBBUILD2_SYMEXPORT void insert_pattern (const string& pattern, optional<const value_type*> type, optional<bool> overridable, @@ -1154,16 +1176,16 @@ namespace build2 rw (scope&) const {return const_cast<variable_pool&> (*this);} private: - static variable_pool instance; + LIBBUILD2_SYMEXPORT static variable_pool instance; - variable& + LIBBUILD2_SYMEXPORT variable& insert (string name, const value_type*, const variable_visibility* = nullptr, const bool* overridable = nullptr, bool pattern = true); - void + LIBBUILD2_SYMEXPORT void update (variable&, const value_type*, const variable_visibility* = nullptr, @@ -1173,10 +1195,12 @@ namespace build2 // friend class parser; friend class scope; - friend variable_overrides reset (const strings&); + friend LIBBUILD2_SYMEXPORT variable_overrides reset (const strings&); public: - static const variable_pool& cinstance; // For var_pool initialization. + // For var_pool initialization. + // + LIBBUILD2_SYMEXPORT static const variable_pool& cinstance; // Variable map. // @@ -1243,7 +1267,7 @@ namespace build2 bool global_; }; - extern const variable_pool& var_pool; + LIBBUILD2_SYMEXPORT extern const variable_pool& var_pool; } // variable_map @@ -1275,7 +1299,7 @@ namespace butl namespace build2 { - class variable_map + class LIBBUILD2_SYMEXPORT variable_map { public: struct value_data: value @@ -1442,8 +1466,10 @@ namespace build2 // main()). This shard is also used for value typification (which is kind of // like caching) during concurrent execution phases. // - extern size_t variable_cache_mutex_shard_size; - extern unique_ptr<shared_mutex[]> variable_cache_mutex_shard; + LIBBUILD2_SYMEXPORT extern size_t variable_cache_mutex_shard_size; + + LIBBUILD2_SYMEXPORT extern unique_ptr<shared_mutex[]> + variable_cache_mutex_shard; template <typename K> class variable_cache @@ -1522,7 +1548,7 @@ namespace build2 map_type map_; }; - class variable_type_map + class LIBBUILD2_SYMEXPORT variable_type_map { public: using map_type = std::map<reference_wrapper<const target_type>, @@ -1564,7 +1590,7 @@ namespace build2 }; } -#include <build2/variable.ixx> -#include <build2/variable.txx> +#include <libbuild2/variable.ixx> +#include <libbuild2/variable.txx> -#endif // BUILD2_VARIABLE_HXX +#endif // LIBBUILD2_VARIABLE_HXX diff --git a/build2/variable.ixx b/libbuild2/variable.ixx index 559151b..f0bde09 100644 --- a/build2/variable.ixx +++ b/libbuild2/variable.ixx @@ -1,9 +1,11 @@ -// file : build2/variable.ixx -*- C++ -*- +// file : libbuild2/variable.ixx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include <type_traits> // is_same +#include <libbuild2/export.hxx> + namespace build2 { // value @@ -150,6 +152,8 @@ namespace build2 // Find base if any. // + // Note that here we use the value type address as type identity. + // const value_type* b (v.type); for (; b != nullptr && b != &value_traits<T>::value_type; @@ -271,7 +275,7 @@ namespace build2 typify (v, t, var); } - void + LIBBUILD2_SYMEXPORT void typify (value&, const value_type&, const variable*, memory_order); inline void @@ -729,8 +733,7 @@ namespace build2 // Note that this will only move values. Keys (being const) are still // copied. // - m.insert (m.end (), - make_move_iterator (x.begin ()), + m.insert (make_move_iterator (x.begin ()), make_move_iterator (x.end ())); } else diff --git a/build2/variable.txx b/libbuild2/variable.txx index 1aba99d..9b7490a 100644 --- a/build2/variable.txx +++ b/libbuild2/variable.txx @@ -1,8 +1,8 @@ -// file : build2/variable.txx -*- C++ -*- +// file : libbuild2/variable.txx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#include <build2/diagnostics.hxx> +#include <libbuild2/diagnostics.hxx> namespace build2 { diff --git a/libbuild2/version.hxx b/libbuild2/version.hxx new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/libbuild2/version.hxx diff --git a/build2/version.hxx.in b/libbuild2/version.hxx.in index d6be346..1e448d8 100644 --- a/build2/version.hxx.in +++ b/libbuild2/version.hxx.in @@ -1,8 +1,8 @@ -// file : build2/version.hxx.in -*- C++ -*- +// file : libbuild2/version.hxx.in -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file -#ifndef BUILD2_VERSION // Note: using the version macro itself. +#ifndef LIBBUILD2_VERSION // Note: using the version macro itself. // The numeric version format is AAAAABBBBBCCCCCDDDE where: // @@ -26,21 +26,21 @@ // NOTE: remember to also update "fake" bootstrap values in utility.hxx if // changing anything here. -#define BUILD2_VERSION $build2.version.project_number$ULL -#define BUILD2_VERSION_STR "$build2.version.project$" -#define BUILD2_VERSION_ID "$build2.version.project_id$" +#define LIBBUILD2_VERSION $build2.version.project_number$ULL +#define LIBBUILD2_VERSION_STR "$build2.version.project$" +#define LIBBUILD2_VERSION_ID "$build2.version.project_id$" -#define BUILD2_VERSION_MAJOR $build2.version.major$ -#define BUILD2_VERSION_MINOR $build2.version.minor$ -#define BUILD2_VERSION_PATCH $build2.version.patch$ +#define LIBBUILD2_VERSION_MAJOR $build2.version.major$ +#define LIBBUILD2_VERSION_MINOR $build2.version.minor$ +#define LIBBUILD2_VERSION_PATCH $build2.version.patch$ -#define BUILD2_PRE_RELEASE $build2.version.pre_release$ +#define LIBBUILD2_PRE_RELEASE $build2.version.pre_release$ -#define BUILD2_SNAPSHOT $build2.version.snapshot_sn$ULL -#define BUILD2_SNAPSHOT_ID "$build2.version.snapshot_id$" +#define LIBBUILD2_SNAPSHOT $build2.version.snapshot_sn$ULL +#define LIBBUILD2_SNAPSHOT_ID "$build2.version.snapshot_id$" #include <libbutl/version.hxx> $libbutl.check(LIBBUTL_VERSION, LIBBUTL_SNAPSHOT)$ -#endif // BUILD2_VERSION +#endif // LIBBUILD2_VERSION diff --git a/old-tests/depdb/driver.cxx b/old-tests/depdb/driver.cxx index b95d299..64668a1 100644 --- a/old-tests/depdb/driver.cxx +++ b/old-tests/depdb/driver.cxx @@ -6,10 +6,10 @@ #include <libbutl/filesystem.mxx> -#include <build2/types.hxx> -#include <build2/utility.hxx> +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> -#include <build2/depdb.hxx> +#include <libbuild2/depdb.hxx> using namespace std; using namespace build2; diff --git a/tests/libbuild2/buildfile b/tests/libbuild2/buildfile new file mode 100644 index 0000000..4d3a42f --- /dev/null +++ b/tests/libbuild2/buildfile @@ -0,0 +1,12 @@ +# file : tests/libbuild2/buildfile +# copyright : Copyright (c) 2014-2019 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +import libs = build2%lib{build2} + +exe{driver}: {hxx cxx}{*} $libs testscript + +# Setup the test driver. Note that by default we test the build2 driver (see +# build/root.build for details). +# +testscript@./: test = exe{driver} diff --git a/tests/libbuild2/driver.cxx b/tests/libbuild2/driver.cxx new file mode 100644 index 0000000..3df2fbe --- /dev/null +++ b/tests/libbuild2/driver.cxx @@ -0,0 +1,24 @@ +// file : tests/libbuild2/driver.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include <libbuild2/types.hxx> +#include <libbuild2/utility.hxx> + +#include <libbuild2/context.hxx> // sched, reset() +#include <libbuild2/scheduler.hxx> + +using namespace build2; + +int +main (int, char* argv[]) +{ + // Fake build system driver, default verbosity. + // + init_diag (1); + init (argv[0]); + sched.startup (1); // Serial execution. + reset (strings ()); // No command line variables. + + return 0; +} diff --git a/tests/libbuild2/testscript b/tests/libbuild2/testscript new file mode 100644 index 0000000..35c2c5f --- /dev/null +++ b/tests/libbuild2/testscript @@ -0,0 +1,7 @@ +# file : tests/libbuild2/testscript +# copyright : Copyright (c) 2014-2019 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +: basic +: +$* diff --git a/tests/test/script/builtin/cp.testscript b/tests/test/script/builtin/cp.testscript index 5f69f05..aa16465 100644 --- a/tests/test/script/builtin/cp.testscript +++ b/tests/test/script/builtin/cp.testscript @@ -358,6 +358,18 @@ if ($cxx.target.class != 'windows') EOE } + # @@ Temporary disable the test as it may fail if the package is fetched + # from the git repository location. Note that the used `ls -l` command + # displays the filesystem entry modification time with the minute + # resolution and the build2 dist meta-operation doesn't preserve the + # directory modification time. That's why the test command may + # unexpectedly succeed. + # + # One way to fix it is to instruct ls to show time with at least the + # second resolution. There is no portable way for that across different + # OSes but all of them seems to provide some option to achieve that. + # +#\ : dir : { @@ -372,5 +384,6 @@ if ($cxx.target.class != 'windows') %.+ EOE } +#\ } } |