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