From 3cc7d6569990cfb4fae913e1ea0e56c1e80c2246 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 18 Feb 2011 15:54:04 +0200 Subject: Add support for default options file Now, if configured, the ODB compiler will load the default options file (../etc/odb/default.options by default). This file can be used for installation-wide customization, such as adding extra include search paths. --- configure.ac | 23 ++++++++++++++++++++++- odb/odb.cxx | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index a680089..7dc7e0b 100644 --- a/configure.ac +++ b/configure.ac @@ -31,7 +31,7 @@ AS_IF([test x$static_plugin = xyes], # AS_IF([test x$static_plugin = xno], GCC_PLUGIN) -# +# G++ name. # AC_ARG_WITH( [gxx-name], @@ -53,6 +53,27 @@ AS_IF( [test "x$gxx_name" != x], [AC_DEFINE_UNQUOTED([GXX_NAME], ["$gxx_name"], [g++ binary.])]) +# Default options file. +# +AC_ARG_WITH( + [options-file], + [AC_HELP_STRING([--with-options-file=PATH], [default options file path to embed in the driver])], + [case $withval in + no) + options_file= + ;; + yes) + options_file=../etc/odb/default.options + ;; + *) + options_file="$withval" + ;; + esac], + [options_file=]) + +AS_IF( + [test "x$options_file" != x], + [AC_DEFINE_UNQUOTED([DEFAULT_OPTIONS_FILE], ["$options_file"], [default options file path.])]) # Create the libtool executable so that we can use it in further tests. # diff --git a/odb/odb.cxx b/odb/odb.cxx index 196329b..707173e 100644 --- a/odb/odb.cxx +++ b/odb/odb.cxx @@ -213,6 +213,54 @@ main (int argc, char* argv[]) args.push_back ("g++"); #endif // GXX_NAME + // Parse the default options file if we have one. + // + strings def_inc_dirs; +#ifdef DEFAULT_OPTIONS_FILE + { + path file (DEFAULT_OPTIONS_FILE); + + // If the path is relative, then use the driver's path as a base. + // + if (file.relative ()) + { + path dp (driver_path (path (argv[0]))); + file = dp.directory () / file; + } + + int ac (3); + const char* av[4] = {argv[0], "--file", file.string ().c_str (), 0}; + cli::argv_file_scanner s (ac, const_cast (av), "--file"); + + while (s.more ()) + { + string a (s.next ()); + size_t n (a.size ()); + + // -I + // + if (n > 1 && a[0] == '-' && a[1] == 'I') + { + def_inc_dirs.push_back (a); + + if (n == 2) // -I /path + { + if (!s.more () || (a = s.next ()).empty ()) + { + e << file << ": error: expected argument for the -I option" + << endl; + return 1; + } + + def_inc_dirs.push_back (a); + } + } + else + plugin_args.push_back (a); + } + } +#endif + // Default options. // args.push_back ("-x"); @@ -326,6 +374,11 @@ main (int argc, char* argv[]) plugin_args.push_back (a); } + // Add the default include directories (-I) after the user-supplied + // ones. + // + args.insert (args.end (), def_inc_dirs.begin (), def_inc_dirs.end ()); + // Obtain profile (-I) search paths. // paths prof_paths (profile_paths (args, argv[0])); -- cgit v1.1