04 July 2022                                                         -*-text-*-

The gnulib project provides a fantastic array of modules that can support both
POSIX and also extended features for GNU software.

Unfortunately using it in GNU make is problematic: GNU make is a foundational
utility (if you don't have a "make" program you pretty much can't build any
software), one of our goals in GNU make is to provide scripts (e.g.,
"build.sh") that will build GNU make without needing an instance of make.

Instead of running "./configure && make", you should be able to run
"./configure && ./build.sh" and get a build of GNU make as a result.

However, more and more gnulib modules are relying not on M4 macros and
the configure script to manage their configuration, but in addition special
makefile recipes that perform various post-configure operations.  Since we
don't have an instance of "make", we cannot use these modules as-is.

There are various options we could choose for solving this:

- Avoid gnulib modules and write our own portability interfaces.
  I really am not too excited about this.

- Give up on "build.sh" and require users to already have "make".
  The argument here is that you must already have a compiler, and it couldn't
  have been built without "make", and/or if you build it with a cross-compiler
  then you should be able to use that cross-development environment to build
  GNU make as well.

- Provide a "mini-make" with just enough functionality to support the gnulib
  makefiles but no extra features, that didn't need any complex gnulib
  modules.  As with the first option, I'm not too excited about this.

Although arguably the second option is the sane one, I'm not really excited
about any of them for the time being.  So I elected to try something between
the first and second options:

The gnulib-port Git branch will contain unmodified copies of gnulib modules
that we want to use with GNU make.  From there, we merge them into the main
Git branch then modify / simplify them to avoid unnecessary extra modules and
allow "build.sh" to be used.

By keeping the unmodified versions on the gnulib-port branch, we enable Git
merge facilities to merge in new versions as follows:

* Check out the gnulib-port branch

* Update its content with any updates to gnulib modules.  Something like:
  (
    cd gl \
      && find */. -type f \
        | while read fn; do
            test -f "$GNULIB_SRCDIR/$fn" && cp "$GNULIB_SRCDIR/$fn" "$fn"
          done
  )

* Commit the changes _without modification_

* Check out the main branch

* Run "git merge --no-ff gnulib-port" to merge in the changes

* Resolve any conflicts and commit the merge.

-- pds
