From 60e054bbac499cf9258df04ca0f8cc25e6981839 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 6 Sep 2023 12:47:59 +0200 Subject: Make GCC plugin directory, g++ executable name customizable Specifically, there are now two new optional configuration variables: config [dir_path] config.odb.plugin_dir ?= [null] config [string] config.odb.gxx_name ?= [null] --- build/root.build | 60 ++++++++++++++++++++++++++++++++++++++++++++++---------- odb/buildfile | 21 ++++---------------- 2 files changed, 54 insertions(+), 27 deletions(-) diff --git a/build/root.build b/build/root.build index a07e058..4a28331 100644 --- a/build/root.build +++ b/build/root.build @@ -1,6 +1,20 @@ # file : build/root.build # license : GNU GPL v3; see accompanying LICENSE file +# This configuration variable can be used to specify the GCC plugin directory +# instead of auto-discovering it with -print-file-name=plugin. Primarily +# useful when dealing with cross-compilation. +# +config [dir_path, config.report.variable=plugin_dir] \ + config.odb.plugin_dir ?= [null] + +# This configuration variable can be used to specify the GCC g++ executable +# name that will be called by the ODB compiler instead of auto-deriving it +# from config.cxx. Primarily useful when dealing with cross-compilation. +# +config [string, config.report.variable=gxx_name] \ + config.odb.gxx_name ?= [null] + config [bool] config.odb.develop ?= false develop = $config.odb.develop @@ -36,22 +50,48 @@ if ($build.mode != 'skeleton') if ($cxx.id != 'gcc') fail 'ODB compiler can only be built with GCC' - # Determine the GCC plugin directory. - # - # If plugin support is disabled, then -print-file-name will print the name - # we have passed (the real plugin directory will always be absolute). + # Determine the GCC plugin directory unless specified explicitly. # + if ($config.odb.plugin_dir != [null]) + plugin_dir = $config.odb.plugin_dir + else + { + # If plugin support is disabled, then -print-file-name will print the name + # we have passed (the real plugin directory will always be absolute). + # + plugin_dir = [dir_path] $process.run($cxx.path -print-file-name=plugin) + + if ("$plugin_dir" == plugin) + fail "$recall($cxx.path) does not support plugins" + } + # It can also include '..' components (e.g., on Windows) so normalize it for # good measure. # - plugin_dir = [dir_path] $process.run($cxx.path -print-file-name=plugin) - - if ("$plugin_dir" == plugin) - fail "$recall($cxx.path) does not support plugins" - plugin_dir = $normalize($plugin_dir) - config [config.report] plugin_dir + # Determine the g++ executable name unless specified explicitly. + # + if ($config.odb.gxx_name != [null]) + gxx_name = $config.odb.gxx_name + else + { + # Unless cross-compiling, pass the C++ compiler's recall path as the g++ + # name. + # + # Note that we used to compare complete target triplets but that prooved + # too strict. For example, we may be running on x86_64-apple-darwin17.7.0 + # while the compiler is targeting x86_64-apple-darwin17.3.0. + # + if ($cxx.target.cpu == $build.host.cpu && \ + $cxx.target.system == $build.host.system) + { + gxx_name = $recall($cxx.path) + } + else + fail "g++ executable name must be specified explicitly with \ +config.odb.gxx_name when cross-compiling" + } # Extract the copyright notice from the LICENSE file. # diff --git a/odb/buildfile b/odb/buildfile index 20f8718..34a6329 100644 --- a/odb/buildfile +++ b/odb/buildfile @@ -32,22 +32,6 @@ if ($cxx.target.class != 'windows') # plugin{*}: install = bin/ -# Unless cross-compiling, pass the C++ compiler's recall path as the g++ -# name. At some point we should also make it configurable. -# -# Note that we used to compare complete target triplets but that prooved too -# strict. For example, we may be running on x86_64-apple-darwin17.7.0 while -# the compiler is targeting x86_64-apple-darwin17.3.0. -# -if ($cxx.target.cpu == $build.host.cpu && \ - $cxx.target.system == $build.host.system) -{ - gxx_name = $recall($cxx.path) - gxx_name = $regex.replace($gxx_name, '\\', '\\\\') # Escape back slashes. -} -else - gxx_name = g++ - import libs = libcutl%lib{cutl} import libs += libstudxml%lib{studxml} @@ -98,7 +82,10 @@ libus{odb}: {hxx ixx txx cxx}{** -odb -options -pregenerated/**} $libs # Build options. # -cxx.poptions += "-I$plugin_dir/include" "-DODB_GXX_NAME=\"$gxx_name\"" +# Note: escape backslashes in gxx_name. +# +cxx.poptions += "-I$plugin_dir/include" +cxx.poptions += "-DODB_GXX_NAME=\"$regex.replace($gxx_name, '\\', '\\\\')\"" cxx.poptions += -DODB_BUILD2 # @@ TMP while supporting other build systems. ## Consumption build ($develop == false). -- cgit v1.1