From ac55a7a0a89fe9a1f39e33ee3445b644c68fa0c1 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 14 Nov 2017 10:39:14 +0200 Subject: Further work on build2 build, support for non-static plugin on Windows --- odb/buildfile | 50 ++++++++++++++++++++++++++++++++ odb/generator.cxx | 5 ++++ odb/odb.cxx | 38 +++++++++++++++++++----- odb/plugin.cxx | 10 ++++++- odb/semantics/relational/changelog.cxx | 2 +- odb/semantics/relational/column.cxx | 4 +-- odb/semantics/relational/elements.hxx | 6 ++++ odb/semantics/relational/elements.txx | 2 +- odb/semantics/relational/foreign-key.cxx | 6 ++-- odb/semantics/relational/index.cxx | 2 +- odb/semantics/relational/key.cxx | 4 +-- odb/semantics/relational/table.cxx | 2 +- 12 files changed, 111 insertions(+), 20 deletions(-) create mode 100644 odb/buildfile (limited to 'odb') diff --git a/odb/buildfile b/odb/buildfile new file mode 100644 index 0000000..e7e3f45 --- /dev/null +++ b/odb/buildfile @@ -0,0 +1,50 @@ +# file : odb/buildfile +# copyright : Copyright (c) 2009-2017 Code Synthesis Tools CC +# license : GNU GPL v3; see accompanying LICENSE file + +define plugin: libs +plugin{*}: bin.lib.prefix = # No lib prefix. +plugin{*}: install = # @@ TODO + +import libs = libcutl%lib{cutl} +import libs += libstudxml%lib{studxml} + +plugin_dir = $config.odb.plugin_dir + +./: exe{odb} plugin{odb} + +exe{odb}: cxx{odb} +exe{odb}: libus{odb}: bin.whole = false + +plugin{odb}: libus{odb} + +if ($cxx.target.system == 'mingw32') + plugin{odb}: $plugin_dir/liba{cc1plus.exe.a} + +libus{odb}: {hxx ixx txx cxx}{** -odb -options} {hxx ixx cxx}{options} $libs + +cxx.poptions += -DODB_BUILD2 # @@ TMP while supporting other build systems. + + +# Don't install any of the plugin's headers. +# +{hxx ixx txx}{*}: install = false + +# Generated options parser. +# +if $cli.configured +{ + cli.cxx{options}: cli{options} + + cli.options += --include-with-brackets --include-prefix odb \ +--guard-prefix ODB --generate-file-scanner --generate-specifier \ +--generate-modifier --generate-description --suppress-undocumented \ +--cxx-prologue '#include ' + + # Include the generated cli files into the distribution and don't remove + # them when cleaning in src (so that clean results in a state identical to + # distributed). + # + cli.cxx{*}: dist = true + cli.cxx{*}: clean = ($src_root != $out_root) +} diff --git a/odb/generator.cxx b/odb/generator.cxx index bb8e12f..d1c88e9 100644 --- a/odb/generator.cxx +++ b/odb/generator.cxx @@ -16,8 +16,13 @@ #include #include +#ifdef ODB_BUILD2 +#include +#include +#else #include #include +#endif #include #include diff --git a/odb/odb.cxx b/odb/odb.cxx index bb4686f..d48e4d6 100644 --- a/odb/odb.cxx +++ b/odb/odb.cxx @@ -1471,12 +1471,27 @@ plugin_path (path const& drv, string const&) #endif { - // Figure out the plugin base name which is just the driver name. - // If the driver name starts with 'lt-', then we are running through - // the libtool script. Strip this prefix -- the shared object should - // be in the same directory. +#ifdef _WIN32 + char const plugin_ext[] = ".dll"; +//@@ BUILD2: not clear how it works currently with build/autotools. Also +// note that GCC currently uses the .so extension on Mac OS. +//#elif defined(__APPLE__) +// char const plugin_ext[] = ".dylib"; +#else + char const plugin_ext[] = ".so"; +#endif + + // Figure out the plugin base name which is just the driver name (but + // without the .exe extension on Windows). If the driver name starts with + // 'lt-', then we are running through the libtool script. Strip this prefix + // -- the shared object should be in the same directory. // +#ifdef _WIN32 + string b (drv.leaf ().base ().string ()); +#else string b (drv.leaf ().string ()); +#endif + bool lt (b.size () > 3 && b[0] == 'l' && b[1] == 't' && b[2] == '-'); if (lt) b = string (b, 3, string::npos); @@ -1496,6 +1511,8 @@ plugin_path (path const& drv, // the current directory for the .la file. This will make sure // running ODB from the build directory works as expected. // + // @@ BUILD2: not going to work for build2 build. + // path pp (dp / path (b + ".la")); if (stat (pp.string ().c_str (), &info) == 0) { @@ -1513,6 +1530,8 @@ plugin_path (path const& drv, // if (!lt) { + //@@ BUILD2: if/when dropping old GCC should just get rid of this. +#if 1 // First get the default GCC plugin directory. // path d; @@ -1547,7 +1566,7 @@ plugin_path (path const& drv, // See if the plugin is there. // - pp = d / path (b + ".so"); + pp = d / path (b + plugin_ext); if (stat (pp.string ().c_str (), &info) != 0) { cerr << drv << ": error: no ODB plugin in GCC plugin directory '" << @@ -1556,6 +1575,9 @@ plugin_path (path const& drv, } return pp; +#else + return path (b); +#endif } #elif defined (ODB_PLUGIN_PATH) // If we were given a plugin path, use that unless we are running @@ -1567,7 +1589,7 @@ plugin_path (path const& drv, if (!rp.empty ()) dp /= path (rp); - pp = dp / path (b + ".so"); + pp = dp / path (b + plugin_ext); if (stat (pp.string ().c_str (), &info) != 0) { @@ -1579,9 +1601,9 @@ plugin_path (path const& drv, } #endif - // Try .so in the current directory. + // Try in the current directory. // - pp = dp / path (b + ".so"); + pp = dp / path (b + plugin_ext); if (stat (pp.string ().c_str (), &info) != 0) { cerr << drv << ": error: unable to locate ODB plugin" << endl; diff --git a/odb/plugin.cxx b/odb/plugin.cxx index c046c2f..c0fee9f 100644 --- a/odb/plugin.cxx +++ b/odb/plugin.cxx @@ -38,7 +38,11 @@ using cutl::fs::invalid_path; typedef vector paths; +#if defined(_WIN32) && !defined(ODB_STATIC_PLUGIN) +__declspec(dllexport) +#endif int plugin_is_GPL_compatible; + unique_ptr options_; paths profile_paths_; path file_; // File being compiled. @@ -290,7 +294,11 @@ static char const* const odb_version = ODB_COMPILER_VERSION_STR; typedef vector strings; -extern "C" int +extern "C" +#if defined(_WIN32) && !defined(ODB_STATIC_PLUGIN) +__declspec(dllexport) +#endif +int plugin_init (plugin_name_args* plugin_info, plugin_gcc_version*) { int r (0); diff --git a/odb/semantics/relational/changelog.cxx b/odb/semantics/relational/changelog.cxx index 591a2db..0db9dab 100644 --- a/odb/semantics/relational/changelog.cxx +++ b/odb/semantics/relational/changelog.cxx @@ -24,7 +24,7 @@ namespace semantics using namespace xml; p.next_expect (parser::start_element, xmlns, "changelog"); - p.content (parser::complex); + p.content (content::complex); if (p.attribute ("version") != 1) throw parsing (p, "unsupported changelog format version"); diff --git a/odb/semantics/relational/column.cxx b/odb/semantics/relational/column.cxx index 875ec6d..04ca6c9 100644 --- a/odb/semantics/relational/column.cxx +++ b/odb/semantics/relational/column.cxx @@ -30,7 +30,7 @@ namespace semantics default__ (p.attribute ("default", string ())), options_ (p.attribute ("options", string ())) { - p.content (xml::parser::empty); + p.content (xml::content::empty); } column& column:: @@ -84,7 +84,7 @@ namespace semantics drop_column (xml::parser& p, uscope&, graph& g) : unameable (p, g) { - p.content (xml::parser::empty); + p.content (xml::content::empty); } drop_column& drop_column:: diff --git a/odb/semantics/relational/elements.hxx b/odb/semantics/relational/elements.hxx index 19cf6ff..b72bac0 100644 --- a/odb/semantics/relational/elements.hxx +++ b/odb/semantics/relational/elements.hxx @@ -15,8 +15,14 @@ #include #include +#ifdef ODB_BUILD2 +#include +#include +#else #include #include +namespace cutl {namespace xml {typedef parser content;}} +#endif #include diff --git a/odb/semantics/relational/elements.txx b/odb/semantics/relational/elements.txx index da8937e..f168b02 100644 --- a/odb/semantics/relational/elements.txx +++ b/odb/semantics/relational/elements.txx @@ -154,7 +154,7 @@ namespace semantics g.new_edge (*this, *base); using namespace xml; - p.content (parser::complex); + p.content (content::complex); for (parser::event_type e (p.peek ()); e == parser::start_element; diff --git a/odb/semantics/relational/foreign-key.cxx b/odb/semantics/relational/foreign-key.cxx index 472b18f..a75972a 100644 --- a/odb/semantics/relational/foreign-key.cxx +++ b/odb/semantics/relational/foreign-key.cxx @@ -67,7 +67,7 @@ namespace semantics p.next_expect (parser::start_element, xmlns, "references"); referenced_table_ = p.attribute ("table"); - p.content (parser::complex); + p.content (content::complex); for (parser::event_type e (p.peek ()); e == parser::start_element; @@ -78,7 +78,7 @@ namespace semantics p.next (); referenced_columns_.push_back (p.attribute ("name")); - p.content (parser::empty); + p.content (content::empty); p.next_expect (parser::end_element); } @@ -156,7 +156,7 @@ namespace semantics drop_foreign_key (xml::parser& p, uscope&, graph& g) : unameable (p, g) { - p.content (xml::parser::empty); + p.content (xml::content::empty); } drop_foreign_key& drop_foreign_key:: diff --git a/odb/semantics/relational/index.cxx b/odb/semantics/relational/index.cxx index f46459f..f479eee 100644 --- a/odb/semantics/relational/index.cxx +++ b/odb/semantics/relational/index.cxx @@ -83,7 +83,7 @@ namespace semantics drop_index (xml::parser& p, uscope&, graph& g) : unameable (p, g) { - p.content (xml::parser::empty); + p.content (xml::content::empty); } drop_index& drop_index:: diff --git a/odb/semantics/relational/key.cxx b/odb/semantics/relational/key.cxx index 0f49820..bf83ef4 100644 --- a/odb/semantics/relational/key.cxx +++ b/odb/semantics/relational/key.cxx @@ -29,7 +29,7 @@ namespace semantics : unameable (p, g) { using namespace xml; - p.content (parser::complex); + p.content (content::complex); for (parser::event_type e (p.peek ()); e == parser::start_element; @@ -39,7 +39,7 @@ namespace semantics break; // Not our elements. p.next (); - p.content (parser::empty); + p.content (content::empty); uname n (p.attribute ("name")); column* c (s.lookup (n)); diff --git a/odb/semantics/relational/table.cxx b/odb/semantics/relational/table.cxx index 9851751..6675227 100644 --- a/odb/semantics/relational/table.cxx +++ b/odb/semantics/relational/table.cxx @@ -94,7 +94,7 @@ namespace semantics drop_table (xml::parser& p, qscope&, graph& g) : qnameable (p, g) { - p.content (xml::parser::empty); + p.content (xml::content::empty); } drop_table& drop_table:: -- cgit v1.1