diff options
| author | Carl Hetherington <cth@carlh.net> | 2024-02-25 19:50:41 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2024-03-19 09:30:42 +0100 |
| commit | d1d86684114447809c762a78e8e5cb821e1253fc (patch) | |
| tree | 7b0783816fadd24173e4fd6de3765f337f8ad958 | |
| parent | a0ca8f600cd5bbf3b942b276fc870083de4e1b0a (diff) | |
Optionally (with --c++17) use libxml++-4.0 and C++17.
| -rw-r--r-- | libcxml.pc.in | 2 | ||||
| -rw-r--r-- | src/cxml.cc | 16 | ||||
| -rw-r--r-- | src/cxml.h | 3 | ||||
| -rw-r--r-- | wscript | 20 |
4 files changed, 30 insertions, 11 deletions
diff --git a/libcxml.pc.in b/libcxml.pc.in index 8b7c15c..0632a14 100644 --- a/libcxml.pc.in +++ b/libcxml.pc.in @@ -5,6 +5,6 @@ includedir=@includedir@ Name: libcxml Description: Library to simplify XML parsing with libxml++ Version: @version@ -Requires: libxml++-2.6 glibmm-2.4 +Requires: libxml++-@xmlpp_api@ glibmm-@glibmm_api@ Libs: @libs@ Cflags: -I${includedir} diff --git a/src/cxml.cc b/src/cxml.cc index 75da11f..d5c3fdb 100644 --- a/src/cxml.cc +++ b/src/cxml.cc @@ -105,14 +105,16 @@ cxml::Node::node_children (string name) const throw cxml::Error("Node has no internal xmlpp node; did you forget to call a read method on cxml::Document?"); } + auto const glib_name = Glib::ustring(name); + vector<shared_ptr<cxml::Node>> n; for (auto i: _node->get_children()) { - if (i->get_name() == name) { + if (i->get_name() == glib_name) { n.push_back(make_shared<Node>(i)); } } - _taken.push_back (name); + _taken.push_back(glib_name); return n; } @@ -215,7 +217,7 @@ void cxml::Node::done () const { for (auto i: _node->get_children()) { - if (dynamic_cast<xmlpp::Element *> (i) && find (_taken.begin(), _taken.end(), i->get_name()) == _taken.end ()) { + if (dynamic_cast<xmlpp::Element*>(i) && find(_taken.begin(), _taken.end(), i->get_name()) == _taken.end()) { throw cxml::Error ("unexpected XML node " + i->get_name()); } } @@ -304,7 +306,7 @@ cxml::Document::take_root_node () } _node = _parser->get_document()->get_root_node (); - if (!_root_name.empty() && _node->get_name() != _root_name) { + if (!_root_name.empty() && _node->get_name() != Glib::ustring(_root_name)) { throw cxml::Error ("unrecognised root node " + _node->get_name() + " (expecting " + _root_name + ")"); } else if (_root_name.empty ()) { _root_name = _node->get_name (); @@ -475,12 +477,16 @@ cxml::raw_convert (string v) xmlpp::Element* cxml::add_child(xmlpp::Element* parent, string const& name, string const& ns_prefix) { +#if LIBXMLXX_MAJOR_VERSION == 2 return parent->add_child(name, ns_prefix); +#else + return parent->add_child_element(name, ns_prefix); +#endif } void cxml::add_text_child(xmlpp::Element* parent, string const& name, string const& text) { - parent->add_child(name)->add_child_text(text); + add_child(parent, name)->add_child_text(text); } @@ -21,6 +21,7 @@ #ifndef LIBCXML_CXML_H #define LIBCXML_CXML_H +#include <glibmm/ustring.h> #include <boost/optional.hpp> #include <boost/filesystem.hpp> #include <boost/algorithm/string/erase.hpp> @@ -238,7 +239,7 @@ protected: xmlpp::Node* _node; private: - mutable std::vector<std::string> _taken; + mutable std::vector<Glib::ustring> _taken; }; typedef std::shared_ptr<cxml::Node> NodePtr; @@ -41,12 +41,23 @@ def options(opt): opt.add_option('--enable-debug', action='store_true', default=False, help='build with debugging information and without optimisation') opt.add_option('--static', action='store_true', default=False, help='build statically') opt.add_option('--disable-tests', action='store_true', default=False, help='disable building of tests') + opt.add_option('--c++17', action='store_true', default=False, help='build with C++17 and libxml++-4.0') def configure(conf): conf.load('compiler_cxx') + + if vars(conf.options)['c++17']: + cpp_std = '17' + conf.env.XMLPP_API = '4.0' + conf.env.GLIBMM_API = '2.68' + else: + cpp_std = '11' + conf.env.XMLPP_API = '2.6' + conf.env.GLIBMM_API = '2.4' + if conf.options.enable_debug: conf.env.append_value('CXXFLAGS', '-g') - conf.env.append_value('CXXFLAGS', ['-Wall', '-Wextra', '-O2', '-Wno-deprecated-declarations', '-std=c++11', '-DBOOST_NO_CXX11_SCOPED_ENUMS']) + conf.env.append_value('CXXFLAGS', ['-Wall', '-Wextra', '-O2', '-Wno-deprecated-declarations', '-std=c++' + cpp_std, '-DBOOST_NO_CXX11_SCOPED_ENUMS']) conf.env.TARGET_WINDOWS = conf.options.target_windows_32 or conf.options.target_windows_64 conf.env.STATIC = conf.options.static @@ -60,7 +71,7 @@ def configure(conf): boost_lib_suffix = '' conf.env.append_value('CXXFLAGS', '-DLIBCXML_POSIX') - conf.check_cfg(package='libxml++-2.6', args='--cflags --libs', uselib_store='LIBXML++', mandatory=True) + conf.check_cfg(package='libxml++-' + conf.env.XMLPP_API, args='--cflags --libs', uselib_store='LIBXML++', mandatory=True) conf.check_cxx(fragment=""" #include <boost/filesystem.hpp>\n @@ -84,12 +95,13 @@ def configure(conf): conf.recurse('test') def build(bld): - bld(source='libcxml.pc.in', version=VERSION, includedir='%s/include' % bld.env.PREFIX, libs="-L${libdir} -lcxml", - install_path='${LIBDIR}/pkgconfig') + install_path='${LIBDIR}/pkgconfig', + xmlpp_api=bld.env.XMLPP_API, + glibmm_api=bld.env.GLIBMM_API) bld.recurse('src') if not bld.env.DISABLE_TESTS: |
