I think this should be added to README.git. Without these explanations, the purpose of Basic.mk and its auxiliary files, and of their intended usage, is completely unclear.
I believe this was going to Paul. From my side, these explanations were really helpful. On to the Basic.mk patch, please see the latest one attached in this email. After regenerating Basic.mk from .\bootstrap.bat, I tried running it with both msvc and gcc values for TOOLCHAIN and they both worked fine. I also tried the 'no resource compiler' case by temporarily renaming 'rc.exe' (msvc) and 'windres.exe' (gcc) to something else so they are not found on the Windows path, and the build just went through with no errors and produced non-utf8 GNU Make binaries. As you will see, in mk/Windows32.mk I used: ifneq (, $(shell where $(RC) 2>nul)) to tell if a program is on the Windows path. It seems to be working fine in both cases of 'found' and 'not-found', but I am no GNU Make expert so please let me know if this is correct. A little inconsistency is that in build_w32.bat I didn't implement a check for 'rc.exe' because I assumed it's always going to be in the Windows path if the compiler 'cl.exe' is, but in mk/Windows32.mk I did implement the check even for 'rc.exe' - I can add the check in build_w32.bat to be consistent in a next update, it should be easy. Also just checking - the configury approach, when building for Windows host, can't be used with msvc or tcc, right? It needs to find gcc targeting Windows, and therefore checking for windres (already implemented) should be sufficient, right? On Thu, 18 May 2023 at 06:31, Eli Zaretskii <e...@gnu.org> wrote: > > From: Paul Smith <psm...@gnu.org> > > Cc: bug-make@gnu.org > > Date: Wed, 17 May 2023 18:04:55 -0400 > > > > To remind: the purpose of these is to provide a makefile-based way to > > _develop_ GNU Make itself, on platforms where we can't run ./configure > > to get an automake-generated makefile. > > > > If you need to build GNU Make from scratch there's not much benefit > > from using Basic.mk, because it will just rebuild everything every time > > just like the build_w32.bat etc. files. You don't save anything. > > > > But if you're doing ongoing development (edit/build/test cycle) and you > > don't want to have to recompile all files every time you change > > something, and you can't run ./configure, then you can use an already- > > built GNU Make and these makefiles to shorten your development cycle. > > I think this should be added to README.git. Without these > explanations, the purpose of Basic.mk and its auxiliary files, and of > their intended usage, is completely unclear. >
diff --git a/Basic.mk.template b/Basic.mk.template index e3a83a20..ce273a1f 100644 --- a/Basic.mk.template +++ b/Basic.mk.template @@ -59,6 +59,8 @@ BUILT_SOURCES = OBJECTS = $(patsubst %.c,$(OUTDIR)%.$(OBJEXT),$(prog_SOURCES)) +RESOURCE_OBJECTS = + OBJDIRS = $(addsuffix .,$(sort $(dir $(OBJECTS)))) # Use the default value of CC @@ -99,7 +101,7 @@ RM.cmd = rm -f $1 # $(call CP.cmd,<from>,<to>) CP.cmd = cp $1 $2 -CLEANSPACE = $(call RM.cmd,$(OBJECTS) $(PROG) $(BUILT_SOURCES)) +CLEANSPACE = $(call RM.cmd,$(OBJECTS) $(RESOURCE_OBJECTS) $(PROG) $(BUILT_SOURCES)) # Load overrides for the above variables. include $(firstword $(wildcard $(SRCDIR)/mk/$(lastword $(subst -, ,$(MAKE_HOST)).mk))) @@ -108,7 +110,7 @@ VPATH = $(SRCDIR) all: $(PROG) -$(PROG): $(OBJECTS) +$(PROG): $(OBJECTS) $(RESOURCE_OBJECTS) $(call LINK.cmd,$^) $(OBJECTS): $(OUTDIR)%.$(OBJEXT): %.c diff --git a/mk/Windows32.mk b/mk/Windows32.mk index 57226eb1..6e357ea7 100644 --- a/mk/Windows32.mk +++ b/mk/Windows32.mk @@ -30,6 +30,8 @@ P2W = $(subst /,\,$1) prog_SOURCES += $(loadavg_SOURCES) $(glob_SOURCES) $(w32_SOURCES) +utf8_SOURCES = $(src)w32/utf8.rc $(src)w32/utf8.manifest + BUILT_SOURCES += $(lib)alloca.h $(lib)fnmatch.h $(lib)glob.h w32_LIBS = kernel32 user32 gdi32 winspool comdlg32 advapi32 shell32 ole32 \ @@ -41,6 +43,7 @@ LDFLAGS = # --- Visual Studio msvc_CC = cl.exe +msvc_RC = rc.exe msvc_LD = link.exe msvc_CPPFLAGS = /DHAVE_CONFIG_H /DMK_OS_W32=1 /DWIN32 /D_CONSOLE @@ -54,6 +57,7 @@ msvc_LDFLAGS = /nologo /SUBSYSTEM:console /PDB:$(BASE_PROG).pdb msvc_LDLIBS = $(addsuffix .lib,$(w32_LIBS)) msvc_C_SOURCE = /c +msvc_RC_SOURCE = msvc_OUTPUT_OPTION = /Fo$@ msvc_LINK_OUTPUT = /OUT:$@ @@ -68,6 +72,7 @@ debug_msvc_LDFLAGS = /DEBUG # --- GCC gcc_CC = gcc +gcc_RC = windres gcc_LD = $(gcc_CC) release_gcc_OUTDIR = ./GccRel/ @@ -79,6 +84,7 @@ gcc_LDFLAGS = -mthreads -gdwarf-2 -g3 gcc_LDLIBS = $(addprefix -l,$(w32_libs)) gcc_C_SOURCE = -c +gcc_RC_SOURCE = -i gcc_OUTPUT_OPTION = -o $@ gcc_LINK_OUTPUT = -o $@ @@ -87,6 +93,7 @@ release_gcc_CFLAGS = -O2 # --- +RES_COMPILE.cmd = $(RC) $(OUTPUT_OPTION) $(RC_SOURCE) $1 LINK.cmd = $(LD) $(extra_LDFLAGS) $(LDFLAGS) $(TARGET_ARCH) $1 $(LDLIBS) $(LINK_OUTPUT) CHECK.cmd = cmd /c cd tests \& .\run_make_tests.bat -make ../$(PROG) @@ -96,9 +103,11 @@ RM.cmd = cmd /c del /F /Q $(call P2W,$1) CP.cmd = cmd /c copy /Y $(call P2W,$1 $2) CC = $($(TOOLCHAIN)_CC) +RC = $($(TOOLCHAIN)_RC) LD = $($(TOOLCHAIN)_LD) C_SOURCE = $($(TOOLCHAIN)_C_SOURCE) +RC_SOURCE = $($(TOOLCHAIN)_RC_SOURCE) OUTPUT_OPTION = $($(TOOLCHAIN)_OUTPUT_OPTION) LINK_OUTPUT = $($(TOOLCHAIN)_LINK_OUTPUT) @@ -120,3 +129,11 @@ LDLIBS = $(call _CUSTOM,LDLIBS) $(OUTDIR)src/config.h: $(SRCDIR)/src/config.h.W32 $(call CP.cmd,$<,$@) + +w32_UTF8OBJ = $(OUTDIR)src/w32/utf8.$(OBJEXT) +$(w32_UTF8OBJ): $(utf8_SOURCES) + $(call RES_COMPILE.cmd,$<) + +ifneq (, $(shell where $(RC) 2>nul)) +RESOURCE_OBJECTS = $(w32_UTF8OBJ) +endif