From bb3fd10e6309f017618a12b2c10d3bfb813bfc08 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 18 Feb 2023 16:59:22 +0100 Subject: [PATCH] configmake: Add support for $build_os != $host_os. * m4/build-to-host.m4: New file. * m4/configmake.m4 (gl_CONFIGMAKE_PREP): Provide a configure-time definition for pkgdatadir, pkgincludedir, pkglibdir. (gl_CONFIGMAKE): New macro. * modules/configmake (Files): Add m4/build-to-host.m4. (configure.ac): Invoke gl_CONFIGMAKE instead of gl_CONFIGMAKE_PREP. (Makefile.am): For creating configmake.h, use the various *prefix_c_make and *dir_c_make variables. --- ChangeLog | 12 ++++ m4/build-to-host.m4 | 73 ++++++++++++++++++++++ m4/configmake.m4 | 147 +++++++++++++++++++++++++++++++++++++++++++- modules/configmake | 57 ++++++++--------- 4 files changed, 258 insertions(+), 31 deletions(-) create mode 100644 m4/build-to-host.m4 diff --git a/ChangeLog b/ChangeLog index a9b58f9356..c1ca610548 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2023-02-18 Bruno Haible + + configmake: Add support for $build_os != $host_os. + * m4/build-to-host.m4: New file. + * m4/configmake.m4 (gl_CONFIGMAKE_PREP): Provide a configure-time + definition for pkgdatadir, pkgincludedir, pkglibdir. + (gl_CONFIGMAKE): New macro. + * modules/configmake (Files): Add m4/build-to-host.m4. + (configure.ac): Invoke gl_CONFIGMAKE instead of gl_CONFIGMAKE_PREP. + (Makefile.am): For creating configmake.h, use the various *prefix_c_make + and *dir_c_make variables. + 2023-02-18 Bruno Haible configmake: Prepare for using directory names with backslashes. diff --git a/m4/build-to-host.m4 b/m4/build-to-host.m4 new file mode 100644 index 0000000000..e3c72877f0 --- /dev/null +++ b/m4/build-to-host.m4 @@ -0,0 +1,73 @@ +# build-to-host.m4 serial 1 +dnl Copyright (C) 2023 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Written by Bruno Haible. + +dnl When the build environment ($build_os) is different from the target runtime +dnl environment ($host_os), file names may need to be converted from the build +dnl environment syntax to the target runtime environment syntax. This is +dnl because the Makefiles are executed (mostly) by build environment tools and +dnl therefore expect file names in build environment syntax, whereas the runtime +dnl expects file names in target runtime environment syntax. +dnl +dnl For example, if $build_os = cygwin and $host_os = mingw32, filenames need +dnl be converted from Cygwin syntax to native Windows syntax: +dnl /cygdrive/c/foo/bar -> C:\foo\bar +dnl /usr/local/share -> C:\cygwin64\usr\local\share +dnl +dnl gl_BUILD_TO_HOST([somedir]) +dnl This macro takes as input an AC_SUBSTed variable 'somedir', which must +dnl already have its final value assigned, and produces two additional +dnl AC_SUBSTed variables 'somedir_c' and 'somedir_c_make', that designate the +dnl same file name value, just in different syntax: +dnl - somedir_c is the file name in target runtime environment syntax, +dnl as a C string (starting and ending with a double-quote, +dnl and with escaped backslashes and double-quotes in +dnl between). +dnl - somedir_c_make is the same thing, escaped for use in a Makefile. + +AC_DEFUN([gl_BUILD_TO_HOST], +[ + AC_REQUIRE([AC_CANONICAL_BUILD]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([gl_BUILD_TO_HOST_INIT]) + + dnl Define somedir_c. + gl_final_[$1]="$[$1]" + dnl Translate it from build syntax to host syntax. + case "$build_os" in + cygwin*) + case "$host_os" in + mingw*) + gl_final_[$1]=`cygpath -w "$gl_final_[$1]"` ;; + esac + ;; + esac + dnl Convert it to C string syntax. + [$1]_c=`echo "$gl_final_[$1]" | sed -e "$gl_sed_double_backslashes" -e "$gl_sed_escape_doublequotes"` + [$1]_c='"'"$[$1]_c"'"' + AC_SUBST([$1_c]) + + dnl Define somedir_c_make. + [$1]_c_make=`echo "$[$1]_c" | sed -e "$gl_sed_escape_for_make_1" -e "$gl_sed_escape_for_make_2"` + dnl Use the substituted somedir variable, when possible, so that the user + dnl may adjust somedir a posteriori when there are no special characters. + if test "$[$1]_c_make" = '\"'"${gl_final_[$1]}"'\"'; then + [$1]_c_make='\"$([$1])\"' + fi + AC_SUBST([$1_c_make]) +]) + +dnl Some initializations for gl_BUILD_TO_HOST. +AC_DEFUN([gl_BUILD_TO_HOST_INIT], +[ + gl_sed_double_backslashes='s/\\/\\\\/g' + gl_sed_escape_doublequotes='s/"/\\"/g' +changequote(,)dnl + gl_sed_escape_for_make_1="s,\\([ \"&'();<>\\\\\`|]\\),\\\\\\1,g" +changequote([,])dnl + gl_sed_escape_for_make_2='s,\$,\\$$,g' +]) diff --git a/m4/configmake.m4 b/m4/configmake.m4 index 7cd7cf5fb8..94f8ae24b9 100644 --- a/m4/configmake.m4 +++ b/m4/configmake.m4 @@ -1,4 +1,4 @@ -# configmake.m4 serial 4 +# configmake.m4 serial 5 dnl Copyright (C) 2010-2023 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -21,7 +21,148 @@ AC_DEFUN([gl_CONFIGMAKE_PREP], AC_SUBST([runstatedir], ['${localstatedir}/run']) fi - dnl Automake 1.11 provides pkglibexecdir merely without AC_SUBST. - dnl This blind use of AC_SUBST is safe. + dnl Automake 1.11 provides the pkg*dir variables merely without AC_SUBST, + dnl that is, only at the Makefile.am level. AC_SUBST them, so that + dnl gl_CONFIGMAKE can compute the final values at configure time. + dnl Blindly assigning the value at configure time is OK, since configure + dnl does not have --pkg*dir=... options. + AC_SUBST([pkgdatadir], ['${datadir}/${PACKAGE}']) + AC_SUBST([pkgincludedir], ['${includedir}/${PACKAGE}']) + AC_SUBST([pkglibdir], ['${libdir}/${PACKAGE}']) AC_SUBST([pkglibexecdir], ['${libexecdir}/${PACKAGE}']) ]) + +# gl_CONFIGMAKE +# ------------- +# Find the final values of the standard directory variables, and create +# AC_SUBSTed *_c and *_c_make variables with the corresponding values in +# target runtime environment ($host_os) syntax. +AC_DEFUN([gl_CONFIGMAKE], +[ + AC_REQUIRE([gl_CONFIGMAKE_PREP]) + + dnl Save the values. + gl_save_prefix="${prefix}" + gl_save_exec_prefix="${exec_prefix}" + gl_save_bindir="${bindir}" + gl_save_sbindir="${sbindir}" + gl_save_libexecdir="${libexecdir}" + gl_save_datarootdir="${datarootdir}" + gl_save_datadir="${datadir}" + gl_save_sysconfdir="${sysconfdir}" + gl_save_sharedstatedir="${sharedstatedir}" + gl_save_localstatedir="${localstatedir}" + gl_save_runstatedir="${runstatedir}" + gl_save_includedir="${includedir}" + gl_save_oldincludedir="${oldincludedir}" + gl_save_docdir="${docdir}" + gl_save_infodir="${infodir}" + gl_save_htmldir="${htmldir}" + gl_save_dvidir="${dvidir}" + gl_save_pdfdir="${pdfdir}" + gl_save_psdir="${psdir}" + gl_save_libdir="${libdir}" + gl_save_lispdir="${lispdir}" + gl_save_localedir="${localedir}" + gl_save_mandir="${mandir}" + gl_save_pkgdatadir="${pkgdatadir}" + gl_save_pkgincludedir="${pkgincludedir}" + gl_save_pkglibdir="${pkglibdir}" + gl_save_pkglibexecdir="${pkglibexecdir}" + + dnl Find the final values. + dnl Unfortunately, prefix gets only finally determined at the end of + dnl configure. + if test "X$prefix" = "XNONE"; then + prefix="$ac_default_prefix" + fi + dnl Unfortunately, exec_prefix gets only finally determined at the end of + dnl configure. + if test "X$exec_prefix" = "XNONE"; then + exec_prefix='${prefix}' + fi + eval exec_prefix="$exec_prefix" + eval bindir="$bindir" + eval sbindir="$sbindir" + eval libexecdir="$libexecdir" + eval datarootdir="$datarootdir" + eval datadir="$datadir" + eval sysconfdir="$sysconfdir" + eval sharedstatedir="$sharedstatedir" + eval localstatedir="$localstatedir" + eval runstatedir="$runstatedir" + eval includedir="$includedir" + eval oldincludedir="$oldincludedir" + eval docdir="$docdir" + eval infodir="$infodir" + eval htmldir="$htmldir" + eval dvidir="$dvidir" + eval pdfdir="$pdfdir" + eval psdir="$psdir" + eval libdir="$libdir" + eval lispdir="$lispdir" + eval localedir="$localedir" + eval mandir="$mandir" + eval pkgdatadir="$pkgdatadir" + eval pkgincludedir="$pkgincludedir" + eval pkglibdir="$pkglibdir" + eval pkglibexecdir="$pkglibexecdir" + + dnl Transform the final values. + gl_BUILD_TO_HOST([prefix]) + gl_BUILD_TO_HOST([exec_prefix]) + gl_BUILD_TO_HOST([bindir]) + gl_BUILD_TO_HOST([sbindir]) + gl_BUILD_TO_HOST([libexecdir]) + gl_BUILD_TO_HOST([datarootdir]) + gl_BUILD_TO_HOST([datadir]) + gl_BUILD_TO_HOST([sysconfdir]) + gl_BUILD_TO_HOST([sharedstatedir]) + gl_BUILD_TO_HOST([localstatedir]) + gl_BUILD_TO_HOST([runstatedir]) + gl_BUILD_TO_HOST([includedir]) + gl_BUILD_TO_HOST([oldincludedir]) + gl_BUILD_TO_HOST([docdir]) + gl_BUILD_TO_HOST([infodir]) + gl_BUILD_TO_HOST([htmldir]) + gl_BUILD_TO_HOST([dvidir]) + gl_BUILD_TO_HOST([pdfdir]) + gl_BUILD_TO_HOST([psdir]) + gl_BUILD_TO_HOST([libdir]) + gl_BUILD_TO_HOST([lispdir]) + gl_BUILD_TO_HOST([localedir]) + gl_BUILD_TO_HOST([mandir]) + gl_BUILD_TO_HOST([pkgdatadir]) + gl_BUILD_TO_HOST([pkgincludedir]) + gl_BUILD_TO_HOST([pkglibdir]) + gl_BUILD_TO_HOST([pkglibexecdir]) + + dnl Restore the values. + pkglibexecdir="${gl_save_pkglibexecdir}" + pkglibdir="${gl_save_pkglibdir}" + pkgincludedir="${gl_save_pkgincludedir}" + pkgdatadir="${gl_save_pkgdatadir}" + mandir="${gl_save_mandir}" + localedir="${gl_save_localedir}" + lispdir="${gl_save_lispdir}" + libdir="${gl_save_libdir}" + psdir="${gl_save_psdir}" + pdfdir="${gl_save_pdfdir}" + dvidir="${gl_save_dvidir}" + htmldir="${gl_save_htmldir}" + infodir="${gl_save_infodir}" + docdir="${gl_save_docdir}" + oldincludedir="${gl_save_oldincludedir}" + includedir="${gl_save_includedir}" + runstatedir="${gl_save_runstatedir}" + localstatedir="${gl_save_localstatedir}" + sharedstatedir="${gl_save_sharedstatedir}" + sysconfdir="${gl_save_sysconfdir}" + datadir="${gl_save_datadir}" + datarootdir="${gl_save_datarootdir}" + libexecdir="${gl_save_libexecdir}" + sbindir="${gl_save_sbindir}" + bindir="${gl_save_bindir}" + exec_prefix="${gl_save_exec_prefix}" + prefix="${gl_save_prefix}" +]) diff --git a/modules/configmake b/modules/configmake index 0942a68542..7ca9c5c6ca 100644 --- a/modules/configmake +++ b/modules/configmake @@ -3,12 +3,13 @@ Access from source code to variables set by "configure" or "make". Files: m4/configmake.m4 +m4/build-to-host.m4 Depends-on: gen-header configure.ac: -gl_CONFIGMAKE_PREP +gl_CONFIGMAKE AC_PROG_MKDIR_P Makefile.am: @@ -22,34 +23,34 @@ configmake.h: Makefile echo '#if HAVE_WINSOCK2_H'; \ echo '# include /* avoid mingw pollution on DATADIR */'; \ echo '#endif'; \ - printf '#define PREFIX %s\n' \"$(prefix)\"; \ - printf '#define EXEC_PREFIX %s\n' \"$(exec_prefix)\"; \ - printf '#define BINDIR %s\n' \"$(bindir)\"; \ - printf '#define SBINDIR %s\n' \"$(sbindir)\"; \ - printf '#define LIBEXECDIR %s\n' \"$(libexecdir)\"; \ - printf '#define DATAROOTDIR %s\n' \"$(datarootdir)\"; \ - printf '#define DATADIR %s\n' \"$(datadir)\"; \ - printf '#define SYSCONFDIR %s\n' \"$(sysconfdir)\"; \ - printf '#define SHAREDSTATEDIR %s\n' \"$(sharedstatedir)\"; \ - printf '#define LOCALSTATEDIR %s\n' \"$(localstatedir)\"; \ - printf '#define RUNSTATEDIR %s\n' \"$(runstatedir)\"; \ - printf '#define INCLUDEDIR %s\n' \"$(includedir)\"; \ - printf '#define OLDINCLUDEDIR %s\n' \"$(oldincludedir)\"; \ - printf '#define DOCDIR %s\n' \"$(docdir)\"; \ - printf '#define INFODIR %s\n' \"$(infodir)\"; \ - printf '#define HTMLDIR %s\n' \"$(htmldir)\"; \ - printf '#define DVIDIR %s\n' \"$(dvidir)\"; \ - printf '#define PDFDIR %s\n' \"$(pdfdir)\"; \ - printf '#define PSDIR %s\n' \"$(psdir)\"; \ - printf '#define LIBDIR %s\n' \"$(libdir)\"; \ - printf '#define LISPDIR %s\n' \"$(lispdir)\"; \ - printf '#define LOCALEDIR %s\n' \"$(localedir)\"; \ - printf '#define MANDIR %s\n' \"$(mandir)\"; \ + printf '#define PREFIX %s\n' $(prefix_c_make); \ + printf '#define EXEC_PREFIX %s\n' $(exec_prefix_c_make); \ + printf '#define BINDIR %s\n' $(bindir_c_make); \ + printf '#define SBINDIR %s\n' $(sbindir_c_make); \ + printf '#define LIBEXECDIR %s\n' $(libexecdir_c_make); \ + printf '#define DATAROOTDIR %s\n' $(datarootdir_c_make); \ + printf '#define DATADIR %s\n' $(datadir_c_make); \ + printf '#define SYSCONFDIR %s\n' $(sysconfdir_c_make); \ + printf '#define SHAREDSTATEDIR %s\n' $(sharedstatedir_c_make); \ + printf '#define LOCALSTATEDIR %s\n' $(localstatedir_c_make); \ + printf '#define RUNSTATEDIR %s\n' $(runstatedir_c_make); \ + printf '#define INCLUDEDIR %s\n' $(includedir_c_make); \ + printf '#define OLDINCLUDEDIR %s\n' $(oldincludedir_c_make); \ + printf '#define DOCDIR %s\n' $(docdir_c_make); \ + printf '#define INFODIR %s\n' $(infodir_c_make); \ + printf '#define HTMLDIR %s\n' $(htmldir_c_make); \ + printf '#define DVIDIR %s\n' $(dvidir_c_make); \ + printf '#define PDFDIR %s\n' $(pdfdir_c_make); \ + printf '#define PSDIR %s\n' $(psdir_c_make); \ + printf '#define LIBDIR %s\n' $(libdir_c_make); \ + printf '#define LISPDIR %s\n' $(lispdir_c_make); \ + printf '#define LOCALEDIR %s\n' $(localedir_c_make); \ + printf '#define MANDIR %s\n' $(mandir_c_make); \ printf '#define MANEXT %s\n' \"$(manext)\"; \ - printf '#define PKGDATADIR %s\n' \"$(pkgdatadir)\"; \ - printf '#define PKGINCLUDEDIR %s\n' \"$(pkgincludedir)\"; \ - printf '#define PKGLIBDIR %s\n' \"$(pkglibdir)\"; \ - printf '#define PKGLIBEXECDIR %s\n' \"$(pkglibexecdir)\"; \ + printf '#define PKGDATADIR %s\n' $(pkgdatadir_c_make); \ + printf '#define PKGINCLUDEDIR %s\n' $(pkgincludedir_c_make); \ + printf '#define PKGLIBDIR %s\n' $(pkglibdir_c_make); \ + printf '#define PKGLIBEXECDIR %s\n' $(pkglibexecdir_c_make); \ } | sed '/""/d' > $@-t $(AM_V_at)mv $@-t $@ -- 2.39.5