mirror of
https://github.com/mirror/make.git
synced 2025-02-23 02:00:24 +08:00
If a resource compiler is available, use it to add a UTF-8 resource to the GNU Make executable on Windows. As a result, GNU Make will use UTF-8 as its ANSI code page, enabling it to work with UTF-8 encoded Makefiles, understand UTF-8 paths passed to it, etc. These build process changes apply to all 3 ways that GNU Make can be built for Windows: 1) configure 2) Basic.mk 3) build_w32.bat When building with Visual Studio the resource compiler should always be available. When building with GCC or TCC, it depends on the availability of 'windres'. If a resource compiler is not available, don't fail the build but just proceed without the UTF-8 resource, effectively ignoring this feature. The UTF-8 resource only has an effect when GNU Make is running on a minimum target version of Windows Version 1903 (May 2019 Update). When the built GNU Make is running on an earlier version of Windows, the embedded UTF-8 resource has no effect. Code page information is added to --version output to tell users what code pages are being used by any combination of GNU Make build (with or without the UTF-8 resource) and Windows version that GNU Make is running on (earlier than 1903 or not). * README.git: Fix a typo. * configure.ac: Search for windres and set WINDRES / HAVE_WINDRES. * Makefile.am: Add manifest and resource files to EXTRA_DIST and add a windres invocation to build them. * build_w32.bat: Add support to build resource files. * src/main.c (print_version): Add codepage info to Windows output. * src/w32/utf8.manifest: Add a windres manifest file. * src/w32/utf8.rc: Add a windres resource file. * Basic.mk.template: Add support for building resource files. * mk/Windows32.mk: Support windres resource files. * .gitignore: Ignore TCC output directories.
140 lines
3.9 KiB
Makefile
140 lines
3.9 KiB
Makefile
# GNU -*-Makefile-*- to build GNU Make on Windows
|
|
#
|
|
# Windows overrides for use with Basic.mk.
|
|
#
|
|
# Copyright (C) 2017-2023 Free Software Foundation, Inc.
|
|
# This file is part of GNU Make.
|
|
#
|
|
# GNU Make is free software; you can redistribute it and/or modify it under
|
|
# the terms of the GNU General Public License as published by the Free Software
|
|
# Foundation; either version 3 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
# details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along with
|
|
# this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
# TARGET_TYPE can be either "release" or "debug"
|
|
TARGET_TYPE = release
|
|
|
|
# TOOLCHAIN can be either "msvc" or "gcc"
|
|
TOOLCHAIN = msvc
|
|
|
|
# Translate a POSIX path into a Windows path. Don't bother with drives.
|
|
# Used only inside recipes, with DOS/CMD tools that require it.
|
|
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 \
|
|
oleaut32 uuid odbc32 odbccp32
|
|
|
|
CPPFLAGS =
|
|
CFLAGS =
|
|
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
|
|
msvc_CPPFLAGS += /I$(OUTDIR)src /I$(SRCDIR)/src /I$(SRCDIR)/src/w32/include /I$(OUTDIR)lib /I$(SRCDIR)/lib
|
|
|
|
msvc_CFLAGS = /nologo /MT /W4 /EHsc
|
|
msvc_CFLAGS += /FR$(OUTDIR) /Fp$(BASE_PROG).pch /Fd$(BASE_PROG).pdb
|
|
|
|
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:$@
|
|
|
|
release_msvc_OUTDIR = ./WinRel/
|
|
release_msvc_CPPFLAGS = /D NDEBUG
|
|
release_msvc_CFLAGS = /O2
|
|
|
|
debug_msvc_OUTDIR = ./WinDebug/
|
|
debug_msvc_CPPFLAGS = /D _DEBUG
|
|
debug_msvc_CFLAGS = /Zi /Od
|
|
debug_msvc_LDFLAGS = /DEBUG
|
|
|
|
# --- GCC
|
|
gcc_CC = gcc
|
|
gcc_RC = windres
|
|
gcc_LD = $(gcc_CC)
|
|
|
|
release_gcc_OUTDIR = ./GccRel/
|
|
debug_gcc_OUTDIR = ./GccDebug/
|
|
|
|
gcc_CPPFLAGS = -DHAVE_CONFIG_H -I$(OUTDIR)src -I$(SRCDIR)/src -I$(SRCDIR)/src/w32/include -I$(OUTDIR)lib -I$(SRCDIR)/lib
|
|
gcc_CFLAGS = -mthreads -Wall -std=gnu99 -gdwarf-2 -g3
|
|
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 $@
|
|
|
|
debug_gcc_CFLAGS = -O0
|
|
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)
|
|
|
|
MKDIR.cmd = cmd /c mkdir $(call P2W,$1)
|
|
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)
|
|
|
|
OUTDIR = $($(TARGET_TYPE)_$(TOOLCHAIN)_OUTDIR)
|
|
|
|
OBJEXT = obj
|
|
EXEEXT = .exe
|
|
|
|
_CUSTOM = $($(TOOLCHAIN)_$1) $($(TARGET_TYPE)_$1) $($(TARGET_TYPE)_$(TOOLCHAIN)_$1)
|
|
|
|
# I'm not sure why this builds gnumake rather than make...?
|
|
PROG = $(OUTDIR)gnumake$(EXEEXT)
|
|
BASE_PROG = $(basename $(PROG))
|
|
|
|
extra_CPPFLAGS = $(call _CUSTOM,CPPFLAGS)
|
|
extra_CFLAGS = $(call _CUSTOM,CFLAGS)
|
|
extra_LDFLAGS = $(call _CUSTOM,LDFLAGS)
|
|
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
|