NMake: Add support to build pkg-config without existing GLib

This adds support to the NMake Makefiles to build the bundled GLib 2.38.2
sources for use with building pkg-config with Visual Studio, which is now
the default build variant.  Building against a pre-installed GLib installation
is now supported via passing in HAVE_GLIB=1 in the NMake command line.

Notice that gettext-runtime (intl.lib, the one provided by proxy-libintl also
works) is required for the build with the bundled GLib to work, and as in a
previous commit, this will build the bundled GLib as a DLL, which must also
be distributed with pkg-config.exe for things to run, with the gettext-runtime
or proxy-libintl DLL as well.
This commit is contained in:
Chun-wei Fan 2023-09-19 16:16:21 +08:00
parent 1356751c49
commit df33829d62
3 changed files with 139 additions and 20 deletions

View file

@ -26,10 +26,25 @@ LIBDIR = $(GLIB_PREFIX)\lib
!include detectenv-msvc.mak
!if "$(VALID_CFGSET)" == "TRUE"
CFLAGS = $(CFLAGS_ADD) /W3 /Zi /FImsvc_recommended_pragmas.h /I. \
/I.\vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config \
/I$(INCLUDEDIR)\glib-2.0 \
INCLUDES_GLIB = \
/I..\glib\glib /I..\glib \
/I.\vs$(VSVER)\$(CFG)\$(PLAT)\glib\glib /I.\vs$(VSVER)\$(CFG)\$(PLAT)\glib \
/I.\dirent
INCLUDES_PKGCONFIG = /I. /I.\vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config
CFLAGS = $(CFLAGS_ADD) /W3 /Zi
!ifdef HAVE_GLIB
CFLAGS = $(CFLAGS) /FImsvc_recommended_pragmas.h
INCLUDES_PKGCONFIG = \
$(INCLUDES_PKGCONFIG) \
/I$(INCLUDEDIR)\glib-2.0 \
/I$(LIBDIR)\glib-2.0\include
!else
CFLAGS = $(CFLAGS) /D_CRT_SECURE_NO_WARNIGS /D_CRT_NONSTDC_NO_WARNINGS /wd4244
INCLUDES_PKGCONFIG = $(INCLUDES_PKGCONFIG) $(INCLUDES_GLIB)
!endif
# PKG_CONFIG_SYSTEM_INCLUDE_PATH and PKG_CONFIG_SYSTEM_LIBRARY_PATH only
# work for GCC builds for now, so just set this to nothing for now
@ -40,19 +55,37 @@ pkg_config_CFLAGS = \
/DPKG_CONFIG_SYSTEM_INCLUDE_PATH="\"\"" \
/DPKG_CONFIG_SYSTEM_LIBRARY_PATH="\"\""
glib_CFLAGS = \
$(CFLAGS) \
/DHAVE_CONFIG_H \
/DG_LOG_DOMAIN=\"GLib\" \
/DGLIB_COMPILATION \
/DGLIB_DISABLE_DEPRECATIONS \
/DDLL_EXPORT \
/DPCRE_STATIC
LDFLAGS_BASE = $(LDFLAGS_ARCH) /libpath:$(LIBDIR) /DEBUG
NULL=
!if "$(CFG)" == "debug"
LDFLAGS = $(LDFLAGS_BASE)
ARFLAGS = $(LDFLAGS)
!else
LDFLAGS = $(LDFLAGS_BASE) /opt:ref /LTCG
ARFLAGS = $(LDFLAGS_BASE) /LTCG
!endif
!include ..\Makefile.sources
!include create-lists-msvc.mak
pkg_config_build_deps =
!ifdef HAVE_GLIB
pkg_config_LIBS = glib-2.0.lib
!else
pkg_config_build_deps = vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config-glib.lib
pkg_config_LIBS = $(pkg_config_build_deps)
glib_dep_libs = intl.lib winmm.lib ws2_32.lib ole32.lib advapi32.lib shell32.lib user32.lib
!endif
all: vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config.exe

View file

@ -1,27 +1,80 @@
# rules for building objects, libraries and executables
{..\}.c{vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config\}.obj::
@if not exist vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config\ md vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config
@if not exist vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config\config.h copy config.h.win32 vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config\config.h
$(CC) $(pkg_config_CFLAGS) /Fovs$(VSVER)\$(CFG)\$(PLAT)\pkg-config\ /Fdvs$(VSVER)\$(CFG)\$(PLAT)\pkg-config\ /c @<<
BASE_OBJDIR = vs$(VSVER)\$(CFG)\$(PLAT)
$(BASE_OBJDIR)\pkg-config\config.h: config.h.win32
$(BASE_OBJDIR)\glib\config.h: ..\glib\config.h.win32
$(BASE_OBJDIR)\glib\glib\glibconfig.h: ..\glib\glib\glibconfig.h.win32
$(BASE_OBJDIR)\pkg-config\config.h \
$(BASE_OBJDIR)\glib\config.h \
$(BASE_OBJDIR)\glib\glib\glibconfig.h:
@echo Copying $** to $@
@if not exist $(@D)\ md $(@D)
@-copy $** $@
!include objs-targets-vs$(VSVER)-$(PLAT)-$(CFG).mak
!if [del /f/q objs-targets-vs$(VSVER)-$(PLAT)-$(CFG).mak]
!endif
{..\}.c{$(BASE_OBJDIR)\pkg-config\}.obj::
$(CC) $(pkg_config_CFLAGS) $(INCLUDES_PKGCONFIG) /Fo$(BASE_OBJDIR)\pkg-config\ /Fd$(BASE_OBJDIR)\pkg-config\ /c @<<
$<
<<
vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config.exe: $(pkg_config_OBJS)
{..\glib\glib\}.c{$(BASE_OBJDIR)\glib\}.obj::
$(CC) $(glib_CFLAGS) $(INCLUDES_GLIB) /Fo$(BASE_OBJDIR)\glib\ /Fd$(BASE_OBJDIR)\glib\ /c @<<
$<
<<
{..\glib\glib\deprecated\}.c{$(BASE_OBJDIR)\glib\}.obj::
$(CC) $(glib_CFLAGS) $(INCLUDES_GLIB) /Fo$(BASE_OBJDIR)\glib\ /Fd$(BASE_OBJDIR)\glib\ /c @<<
$<
<<
{..\glib\glib\gnulib\}.c{$(BASE_OBJDIR)\glib\}.obj::
$(CC) $(glib_CFLAGS) $(INCLUDES_GLIB) /Fo$(BASE_OBJDIR)\glib\ /Fd$(BASE_OBJDIR)\glib\ /c @<<
$<
<<
{..\glib\glib\libcharset\}.c{$(BASE_OBJDIR)\glib\}.obj::
$(CC) /DLIBDIR=\"blah\" $(glib_CFLAGS) $(INCLUDES_GLIB) /Fo$(BASE_OBJDIR)\glib\ /Fd$(BASE_OBJDIR)\glib\ /c @<<
$<
<<
{.\dirent\}.c{$(BASE_OBJDIR)\glib\}.obj::
$(CC) $(CFLAGS) /Fo$(BASE_OBJDIR)\glib\ /Fd$(BASE_OBJDIR)\glib\ /c @<<
$<
<<
$(BASE_OBJDIR)\pkg-config-glib.lib: $(glib_OBJS)
link $(LDFLAGS) /DLL /out:$(@R).dll $(glib_dep_libs) @<<
$**
<<
$(BASE_OBJDIR)\pkg-config.exe: $(pkg_config_OBJS) $(pkg_config_build_deps)
link $(LDFLAGS) $(pkg_config_LIBS) -out:$@ @<<
$(pkg_config_OBJS)
<<
@-if exist $@.manifest mt /manifest $@.manifest /outputresource:$@;1
clean:
@-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\*.pdb
@-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\*.exe.manifest
@-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\*.exe
@-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\*.ilk
@-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config\*.obj
@-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config\vc$(PDBVER).pdb
@-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config\config.h
@-rd vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config
@-rd vs$(VSVER)\$(CFG)\$(PLAT)
@-rd vs$(VSVER)\$(CFG)
@-rd vs$(VSVER)
@-del /f /q $(BASE_OBJDIR)\*.exe.manifest
@-del /f /q $(BASE_OBJDIR)\*.exe
@-del /f /q $(BASE_OBJDIR)\*.dll.manifest
@-del /f /q $(BASE_OBJDIR)\*.dll
@-del /f /q $(BASE_OBJDIR)\*.exp
@-del /f /q $(BASE_OBJDIR)\*.pdb
@-del /f /q $(BASE_OBJDIR)\pkg-config-glib.lib
@-del /f /q $(BASE_OBJDIR)\*.ilk
@-del /f /q $(BASE_OBJDIR)\pkg-config\*.obj
@-del /f /q $(BASE_OBJDIR)\pkg-config\vc$(PDBVER).pdb
@-del /f /q $(BASE_OBJDIR)\pkg-config\config.h
@-del /f /q $(BASE_OBJDIR)\glib\*.obj
@-del /f /q $(BASE_OBJDIR)\glib\vc$(PDBVER).pdb
@-del /f /q $(BASE_OBJDIR)\glib\glib\glibconfig.h
@-del /f /q $(BASE_OBJDIR)\glib\config.h
@-rd $(BASE_OBJDIR)\pkg-config
@-rd $(BASE_OBJDIR)\glib\glib
@-rd $(BASE_OBJDIR)\glib

View file

@ -10,7 +10,40 @@
!if [echo. ^$(NULL)>> objs_vs$(VSVER)_$(PLAT)_$(CFG).mak]
!endif
!if [echo glib_OBJS = \>> objs_vs$(VSVER)_$(PLAT)_$(CFG).mak]
!endif
!if [for %c in (..\glib\glib\g*.c) do @if not "%~nxc" == "gspawn.c" if not "%~nxc" == "gthread-posix.c" if not "%~nxc" == "giounix.c" if not "%~nxc" == "glib-unix.c" echo. vs^$(VSVER)\^$(CFG)\^$(PLAT)\glib\%~nc.obj \>> objs_vs$(VSVER)_$(PLAT)_$(CFG).mak]
!endif
!if [for %c in (..\glib\glib\deprecated\*.c) do @echo. vs^$(VSVER)\^$(CFG)\^$(PLAT)\glib\%~nc.obj \>> objs_vs$(VSVER)_$(PLAT)_$(CFG).mak]
!endif
!if [for %c in (..\glib\glib\gnulib\*.c) do @echo. vs^$(VSVER)\^$(CFG)\^$(PLAT)\glib\%~nc.obj \>> objs_vs$(VSVER)_$(PLAT)_$(CFG).mak]
!endif
!if [for %c in (..\glib\glib\libcharset\*.c) do @echo. vs^$(VSVER)\^$(CFG)\^$(PLAT)\glib\%~nc.obj \>> objs_vs$(VSVER)_$(PLAT)_$(CFG).mak]
!endif
!if [echo. ^$(NULL)>> objs_vs$(VSVER)_$(PLAT)_$(CFG).mak]
!endif
!include objs_vs$(VSVER)_$(PLAT)_$(CFG).mak
!if [del /f /q objs_vs$(VSVER)_$(PLAT)_$(CFG).mak]
!endif
!endif
!if [for %c in (..\glib\glib\g*.c) do @if not "%~nxc" == "gspawn.c" if not "%~nxc" == "glib-unix.c" echo vs^$(VSVER)\^$(CFG)\^$(PLAT)\glib\%~nc.obj: %c vs$(VSVER)\$(CFG)\$(PLAT)\glib\config.h vs$(VSVER)\$(CFG)\$(PLAT)\glib\glib\glibconfig.h>> objs-targets-vs$(VSVER)-$(PLAT)-$(CFG).mak]
!endif
!if [for %c in (..\glib\glib\deprecated\g*.c) do @echo vs^$(VSVER)\^$(CFG)\^$(PLAT)\glib\%~nc.obj: %c vs$(VSVER)\$(CFG)\$(PLAT)\glib\config.h vs$(VSVER)\$(CFG)\$(PLAT)\glib\glib\glibconfig.h>> objs-targets-vs$(VSVER)-$(PLAT)-$(CFG).mak]
!endif
!if [for %c in (..\glib\glib\gnulib\*.c) do @echo vs^$(VSVER)\^$(CFG)\^$(PLAT)\glib\%~nc.obj: %c vs$(VSVER)\$(CFG)\$(PLAT)\glib\config.h vs$(VSVER)\$(CFG)\$(PLAT)\glib\glib\glibconfig.h>> objs-targets-vs$(VSVER)-$(PLAT)-$(CFG).mak]
!endif
!if [for %c in (..\glib\glib\libcharset\*.c) do @echo vs^$(VSVER)\^$(CFG)\^$(PLAT)\glib\%~nc.obj: %c vs$(VSVER)\$(CFG)\$(PLAT)\glib\config.h vs$(VSVER)\$(CFG)\$(PLAT)\glib\glib\glibconfig.h>> objs-targets-vs$(VSVER)-$(PLAT)-$(CFG).mak]
!endif
!if [for %c in ($(pkg_config_SOURCES)) do @if "%~xc" == ".c" echo vs^$(VSVER)\^$(CFG)\^$(PLAT)\pkg-config\%~nc.obj: ..\%c vs$(VSVER)\$(CFG)\$(PLAT)\pkg-config\config.h>> objs-targets-vs$(VSVER)-$(PLAT)-$(CFG).mak]
!endif