From 2b0b06cbf4288746075a74c12ef233efc929a095 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 22 May 2015 15:23:54 +0200 Subject: Avoid relying on static initialization order --- build/bin/target.cxx | 14 +++++++------- build/cxx/target.cxx | 12 ++++++------ build/target | 29 ++++++++++++++++++++++------- build/target.cxx | 30 ++++++++++++++---------------- 4 files changed, 49 insertions(+), 36 deletions(-) (limited to 'build') diff --git a/build/bin/target.cxx b/build/bin/target.cxx index cb7959c..1d69063 100644 --- a/build/bin/target.cxx +++ b/build/bin/target.cxx @@ -28,7 +28,7 @@ namespace build "obja", &file::static_type, &obja_factory, - file::static_type.search + &search_file }; static target* @@ -49,7 +49,7 @@ namespace build "objso", &file::static_type, &objso_factory, - file::static_type.search + &search_file }; static target* @@ -74,7 +74,7 @@ namespace build "obj", &target::static_type, &obj_factory, - target::static_type.search + &search_target }; const target_type exe::static_type @@ -83,7 +83,7 @@ namespace build "exe", &file::static_type, &target_factory, - file::static_type.search + &search_file }; static target* @@ -104,7 +104,7 @@ namespace build "liba", &file::static_type, &liba_factory, - file::static_type.search + &search_file }; static target* @@ -125,7 +125,7 @@ namespace build "libso", &file::static_type, &libso_factory, - file::static_type.search + &search_file }; static target* @@ -150,7 +150,7 @@ namespace build "lib", &target::static_type, &lib_factory, - target::static_type.search + &search_target }; } } diff --git a/build/cxx/target.cxx b/build/cxx/target.cxx index ab75b4c..e02801b 100644 --- a/build/cxx/target.cxx +++ b/build/cxx/target.cxx @@ -16,7 +16,7 @@ namespace build "hxx", &file::static_type, &target_factory, - file::static_type.search + &search_file }; const target_type ixx::static_type @@ -25,7 +25,7 @@ namespace build "ixx", &file::static_type, &target_factory, - file::static_type.search + &search_file }; const target_type txx::static_type @@ -34,7 +34,7 @@ namespace build "txx", &file::static_type, &target_factory, - file::static_type.search + &search_file }; const target_type cxx::static_type @@ -43,7 +43,7 @@ namespace build "cxx", &file::static_type, &target_factory, - file::static_type.search + &search_file }; const target_type h::static_type @@ -52,7 +52,7 @@ namespace build "h", &file::static_type, &target_factory, - file::static_type.search + &search_file }; const target_type c::static_type @@ -61,7 +61,7 @@ namespace build "c", &file::static_type, &target_factory, - file::static_type.search + &search_file }; } } diff --git a/build/target b/build/target index d7bdd04..1770d9c 100644 --- a/build/target +++ b/build/target @@ -466,13 +466,6 @@ namespace build extern target_type_map target_types; - template - target* - target_factory (dir_path d, std::string n, const std::string* e) - { - return new T (std::move (d), std::move (n), e); - } - // Modification time-based target. // class mtime_target: public target @@ -582,6 +575,28 @@ namespace build virtual const target_type& type () const {return static_type;} static const target_type static_type; }; + + // Common implementation of the target factory and search functions. + // + template + target* + target_factory (dir_path d, std::string n, const std::string* e) + { + return new T (std::move (d), std::move (n), e); + } + + // The default behavior, that is, look for an existing target in the + // prerequisite's directory scope. + // + target* + search_target (const prerequisite_key&); + + // First lookfor an existing target as above. If not found, then look + // for an existing file in the target-type-specific list of paths. + // + target* + search_file (const prerequisite_key&); + } #include diff --git a/build/target.cxx b/build/target.cxx index 164a13f..3810092 100644 --- a/build/target.cxx +++ b/build/target.cxx @@ -72,15 +72,6 @@ namespace build return os << target_key {&t.type (), &t.dir, &t.name, &t.ext}; } - static target* - search_target (const prerequisite_key& pk) - { - // The default behavior is to look for an existing target in the - // prerequisite's directory scope. - // - return search_existing_target (pk); - } - // target_set // target_set targets; @@ -284,10 +275,19 @@ namespace build return path_mtime (path_); } - // file target + // Search functions. // - static target* + target* + search_target (const prerequisite_key& pk) + { + // The default behavior is to look for an existing target in the + // prerequisite's directory scope. + // + return search_existing_target (pk); + } + + target* search_file (const prerequisite_key& pk) { // First see if there is an existing target. @@ -308,8 +308,6 @@ namespace build return nullptr; } - // dir target - // static target* search_alias (const prerequisite_key& pk) { @@ -343,7 +341,7 @@ namespace build "mtime_target", &target::static_type, nullptr, - target::static_type.search + &search_target }; const target_type path_target::static_type @@ -352,7 +350,7 @@ namespace build "path_target", &mtime_target::static_type, nullptr, - mtime_target::static_type.search + &search_target }; const target_type file::static_type @@ -379,6 +377,6 @@ namespace build "fsdir", &target::static_type, &target_factory, - target::static_type.search + &search_target }; } -- cgit v1.1