diff --git a/.gitignore b/.gitignore index 08195763..1ea8c55c 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,7 @@ configure stamp-* .dirstamp gnulib -convert.sed +*.sed # Build artifacts .deps/ diff --git a/Basic.mk.template b/Basic.mk.template index 07a45454..4216d1ec 100644 --- a/Basic.mk.template +++ b/Basic.mk.template @@ -2,7 +2,7 @@ # # NOTE: # If you have no 'make' program at all to process this makefile: -# * On Windows, run ".\buildw32.bat" to bootstrap one. +# * On Windows, run ".\build_w32.bat" to bootstrap one. # * On MS-DOS, run ".\builddos.bat" to bootstrap one. # # Once you have a GNU make program created, you can use it with this makefile diff --git a/bootstrap.bat b/bootstrap.bat index c1f6819a..f421ea7c 100644 --- a/bootstrap.bat +++ b/bootstrap.bat @@ -45,6 +45,13 @@ call :Download lib intprops-internal.h echo -- Configuring the workspace copy /Y gl\lib\*.* lib > nul +:: In general it's tricky to use special characters as arguments to a program +:: in Windows batch files; the quoting rules are obscure and have changed over +:: time which means older systems may behave differently. However, Windows +:: echo is a dumb program that just writes out its command line without much +:: interpreting: all we have to be careful of is ^ quoting. So, use echo +:: to create script files to use with sed -f rather than using sed -e. + :: Create a sed script to convert templates if exist convert.sed del /Q convert.sed echo s,@PACKAGE@,make,g > convert.sed @@ -56,9 +63,17 @@ if ERRORLEVEL 1 goto Failed echo s,@PACKAGE_TARNAME@,make,g >> convert.sed if ERRORLEVEL 1 goto Failed echo s,@PACKAGE_URL@,https://www.gnu.org/software/make/,g >> convert.sed -sed -n "s/^AC_INIT(\[GNU.Make\],\[\([0-9.]*\)\].*/s,@PACKAGE_VERSION@,\1,g/p" configure.ac >> convert.sed +echo s/^^AC_INIT^(\[GNU.Make\],\[\^([0-9.]*\^)\].*/s,@PACKAGE_VERSION@,\1,g/p > cac.sed +sed -n -f cac.sed configure.ac >> convert.sed if ERRORLEVEL 1 goto Failed -sed -z -e s/\\\n//g -e "s/[ \t][ \t]*/ /g" -e "s, [^ ]*\.h,,g" -e "s,src/,$(src),g" -e "s,lib/,$(lib),g" Makefile.am | sed -n "s/^\([A-Za-z0-9]*\)_SRCS *= *\(.*\)/s,%%\1_SOURCES%%,\2,/p" >> convert.sed +:: Get the list of sources from Makefile.am +echo s,\\\n,,g > mam.sed +echo s,[ \t][ \t]*, ,g >> mam.sed +echo s, [^^ ]*\.h,,g >> mam.sed +echo s,src/,$^(src^),g >> mam.sed +echo s,lib/,$^(lib^),g >> mam.sed +echo s/^^\^([A-Za-z0-9]*\^)_SRCS *= *\^(.*\^)/s,%%\1_SOURCES%%,\2,/p > mam2.sed +sed -z -f mam.sed Makefile.am | sed -n -f mam2.sed >> convert.sed if ERRORLEVEL 1 goto Failed echo - Creating Basic.mk @@ -70,10 +85,20 @@ if ERRORLEVEL 1 goto Failed echo - Creating src\gmk-default.h echo static const char *const GUILE_module_defn = ^" \ > src\gmk-default.h -sed -e "s/;.*//" -e "/^[ \t]*$/d" -e "s/\"/\\\\\"/g" -e "s/$/ \\\/" src\gmk-default.scm >> src\gmk-default.h +echo s/;.*// > gmk.sed +echo /^^[ \t]*$/d >> gmk.sed +echo s/"/\\"/g >> gmk.sed +echo s/$/ \\/ >> gmk.sed +sed -f gmk.sed src\gmk-default.scm >> src\gmk-default.h if ERRORLEVEL 1 goto Failed echo ^";>> src\gmk-default.h +:: These files would be created by bootstrap; they are not needed on Windows +:: but our makefile depends on them +echo >> lib\alloca.in.h + +del /Q convert.sed cac.sed mam.sed mam2.sed gmk.sed + echo. echo Done. Run build_w32.bat to build GNU make. goto :EOF