WinRel/
GccDebug/
GccRel/
+TccDebug/
+TccRel/
# Test artifacts
makeerror-*
OBJECTS = $(patsubst %.c,$(OUTDIR)%.$(OBJEXT),$(prog_SOURCES))
+RESOURCE_OBJECTS =
+
OBJDIRS = $(addsuffix .,$(sort $(dir $(OBJECTS))))
# Use the default value of CC
# $(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)))
all: $(PROG)
-$(PROG): $(OBJECTS)
+$(PROG): $(OBJECTS) $(RESOURCE_OBJECTS)
$(call LINK.cmd,$^)
$(OBJECTS): $(OUTDIR)%.$(OBJEXT): %.c
src/w32/subproc/misc.c src/w32/subproc/proc.h \
src/w32/subproc/sub_proc.c src/w32/subproc/w32err.c
+w32_utf8_SRCS = src/w32/utf8.rc src/w32/utf8.manifest
+
vms_SRCS = src/vms_exit.c src/vms_export_symbol.c src/vms_progname.c \
src/vmsdir.h src/vmsfunctions.c src/vmsify.c
make_SOURCES += src/posixos.c
endif
+UTF8OBJ = src/w32/utf8.$(OBJEXT)
+
+if HAVE_WINDRES
+ make_LDADD += $(UTF8OBJ)
+endif
+
+$(UTF8OBJ) : $(w32_utf8_SRCS)
+ $(WINDRES) -o $@ -i $<
+
if USE_CUSTOMS
make_SOURCES += src/remote-cstms.c
else
README.VMS makefile.com src/config.h-vms src/vmsjobs.c \
vms_export_symbol_test.com \
src/gmk-default.scm src/gmk-default.h \
- $(mk_FILES) $(m4_FILES) $(test_FILES)
+ $(mk_FILES) $(m4_FILES) $(test_FILES) $(w32_utf8_SRCS)
# --------------- Generate the Guile default module content
to build and test GNU Make.
NOTE! This method builds GNU Make in "maintainer mode". Make programs built
- in this mode it will be slower, possibly MUCH slower: there are various
+ in this mode will be slower, possibly MUCH slower: there are various
sanity checks enabled. Further this mode assumes a modern GCC, GNU
libc, and well-formed system headers and enables a high level of
warnings AND enables -Werror to turn warnings into failures.
set MAKE=gnumake\r
set GUILE=Y\r
set COMPILER=cl.exe\r
+set RC=rc.exe\r
set O=obj\r
set ARCH=x64\r
set DEBUG=N\r
\r
:SetCC\r
set COMPILER=gcc\r
+set RC=windres\r
set O=o\r
echo - Building with GCC\r
shift\r
\r
:SetTCC\r
set COMPILER=tcc\r
+set RC=windres\r
set O=o\r
echo - Building with TinyC\r
shift\r
call %COMPILER% >nul 2>&1\r
if not ERRORLEVEL 1 goto FoundMSVC\r
\r
-:: Visual Studio 17 and above provides the "vswhere" tool\r
+:: Visual Studio 15 2017 and above provides the "vswhere" tool\r
call :FindVswhere\r
if ERRORLEVEL 1 goto LegacyVS\r
\r
:: Unfortunately this also shows a "usage" note; I can't find anything better.\r
echo.\r
call %COMPILER%\r
-goto Build\r
+goto FindRC\r
\r
:FindGcc\r
set OUTDIR=.\GccRel\r
:: Show the compiler version that we found\r
echo.\r
call %COMPILER% --version\r
-if not ERRORLEVEL 1 goto Build\r
+if not ERRORLEVEL 1 goto FindRC\r
echo No %COMPILER% found.\r
exit 1\r
\r
:: Show the compiler version that we found\r
echo.\r
call %COMPILER% -v\r
-if not ERRORLEVEL 1 goto Build\r
+if not ERRORLEVEL 1 goto FindRC\r
echo No %COMPILER% found.\r
exit 1\r
\r
+:FindRC\r
+set HAVE_RC=Y\r
+call where %RC% >nul 2>&1\r
+if not ERRORLEVEL 1 goto Build\r
+echo.\r
+echo %RC% was not found. Building without UTF-8 resource.\r
+set HAVE_RC=N\r
+\r
:Build\r
+echo.\r
:: Clean the directory if it exists\r
if exist %OUTDIR%\nul rmdir /S /Q %OUTDIR%\r
\r
:: Compile dirent unless it is supported by compiler library (like with gcc).\r
if "%DIRENT%" == "Y" call :Compile src\w32\compat\dirent\r
\r
+:: Compile UTF-8 resource if a resource compiler is available.\r
+if "%HAVE_RC%" == "Y" call :ResourceCompile src/w32/utf8\r
+\r
call :Link\r
\r
echo.\r
@echo off\r
goto CompileDone\r
\r
+:ResourceCompile\r
+if "%VERBOSE%" == "N" echo - Compiling %1.rc\r
+echo %LNKOUT%/%1.%O% >>%OUTDIR%\link.sc\r
+if exist "%OUTDIR%\%1.%O%" del "%OUTDIR%\%1.%O%"\r
+if "%COMPILER%" == "gcc" goto GccResourceCompile\r
+if "%COMPILER%" == "tcc" goto TccResourceCompile\r
+\r
+:: MSVC Resource Compile\r
+if "%VERBOSE%" == "Y" echo on\r
+call %RC% /fo %OUTDIR%\%1.%O% %1.rc\r
+@echo off\r
+goto CompileDone\r
+\r
+:GccResourceCompile\r
+:: GCC Resource Compile\r
+if "%VERBOSE%" == "Y" echo on\r
+call %RC% -o %OUTDIR%/%1.%O% -i %1.rc\r
+@echo off\r
+goto CompileDone\r
+\r
+:TccResourceCompile\r
+:: TCC Resource Compile\r
+goto GccResourceCompile\r
+\r
:CompileDone\r
if not exist "%OUTDIR%\%1.%O%" exit 1\r
goto :EOF\r
w32_target_env=no
AM_CONDITIONAL([WINDOWSENV], [false])
+AM_CONDITIONAL([HAVE_WINDRES], [false])
AS_CASE([$host],
[*-*-mingw32],
w32_target_env=yes
AC_DEFINE([MK_OS_W32], [1], [Build for the Windows32 API.])
AC_DEFINE([HAVE_DOS_PATHS], [1], [Support DOS-style pathnames.])
+ # Windows host tools.
+ # If windres is available, make will use UTF-8.
+ AC_CHECK_TOOL([WINDRES], [windres], [:])
+ AM_CONDITIONAL([HAVE_WINDRES], [test "$WINDRES" != ':'])
])
AC_DEFINE_UNQUOTED([PATH_SEPARATOR_CHAR],['$PATH_SEPARATOR'],
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 \
# --- 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
msvc_LDLIBS = $(addsuffix .lib,$(w32_LIBS))
msvc_C_SOURCE = /c
+msvc_RC_SOURCE =
msvc_OUTPUT_OPTION = /Fo$@
msvc_LINK_OUTPUT = /OUT:$@
# --- GCC
gcc_CC = gcc
+gcc_RC = windres
gcc_LD = $(gcc_CC)
release_gcc_OUTDIR = ./GccRel/
gcc_LDLIBS = $(addprefix -l,$(w32_libs))
gcc_C_SOURCE = -c
+gcc_RC_SOURCE = -i
gcc_OUTPUT_OPTION = -o $@
gcc_LINK_OUTPUT = -o $@
# ---
+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)
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)
$(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
printf (_("%sBuilt for %s (%s)\n"),
precede, make_host, remote_description);
+#if MK_OS_W32
+ printf (_("%sANSI code page: %u\n"), precede, GetACP ());
+ printf (_("%sConsole code page: %u\n"), precede, GetConsoleOutputCP ());
+#endif
+
/* Print this untranslated. The coding standards recommend translating the
(C) to the copyright symbol, but this string is going to change every
year, and none of the rest of it should be translated (including the
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
+ <application>
+ <windowsSettings>
+ <activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>
+ </windowsSettings>
+ </application>
+</assembly>
--- /dev/null
+#include <winuser.h>
+
+CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "utf8.manifest"