From df33829d6258eb30c4998c06bdb3a923813758cb Mon Sep 17 00:00:00 2001 From: Chun-wei Fan Date: Tue, 19 Sep 2023 16:16:21 +0800 Subject: [PATCH] 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. --- nmake/Makefile.vc | 39 +++++++++++++++-- nmake/build-rules-msvc.mak | 85 ++++++++++++++++++++++++++++++------- nmake/create-lists-msvc.mak | 35 ++++++++++++++- 3 files changed, 139 insertions(+), 20 deletions(-) diff --git a/nmake/Makefile.vc b/nmake/Makefile.vc index 0aa397f..5da6375 100644 --- a/nmake/Makefile.vc +++ b/nmake/Makefile.vc @@ -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 diff --git a/nmake/build-rules-msvc.mak b/nmake/build-rules-msvc.mak index 22243be..52325b3 100644 --- a/nmake/build-rules-msvc.mak +++ b/nmake/build-rules-msvc.mak @@ -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 diff --git a/nmake/create-lists-msvc.mak b/nmake/create-lists-msvc.mak index 8658465..af51561 100644 --- a/nmake/create-lists-msvc.mak +++ b/nmake/create-lists-msvc.mak @@ -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 \ No newline at end of file +!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