Windows 10 SDK build fixes
authorLuke Howard <lukeh@padl.com>
Wed, 11 Aug 2021 08:53:36 +0000 (18:53 +1000)
committerNico Williams <nico@cryptonector.com>
Wed, 5 Jan 2022 18:58:48 +0000 (12:58 -0600)
Build without Win32.mak, and using Universal C Runtime (UCRT)

windows: Check for APPVER, not VCVER for UCRT

When deciding whether UCRT is used (and thus no CRT merge modules), check for
Windows 10 rather than the version of Visual Studio, as we may be building with
an older SDK.

appveyor.yml
include/config.h.w32
lib/roken/roken.h.in
lib/roken/strtoll.c
lib/roken/strtoull.c
packages/windows/installer/NTMakefile
packages/windows/installer/heimdal-installer.wxs
windows/NTMakefile.sdk [new file with mode: 0644]
windows/NTMakefile.w32

index bb1e12123e5bef646caea72eea2a61752d797671..11b0aebe2d3a2c7d0824444e79d748c3d8a2eaa3 100644 (file)
@@ -42,7 +42,7 @@ install:
 
 build_script:
   - set PSDKDir=C:\Program Files\Microsoft SDKs\Windows\v7.1
-  - call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /xp /x64 /Release
+  - call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /win7 /x64 /Release
   - set WIXDIR="c:\Program Files (x86)\Windows Installer XML v3.5"
   # We're not doing any codesigning in the Appveyor build yet.
   - SET CODESIGN_PKT=0000000000000000
index 8033476c38384c169bcf9695c6fae865846551c9..c3a06b2c674db4ecac2f7a7fa5169016167419f0 100644 (file)
@@ -905,6 +905,17 @@ static const char *const rcsid[] = { (const char *)rcsid, "@(#)" msg }
 /* Define if you have the function `strtok_r'. */
 /* #define HAVE_STRTOK_R 1 */
 
+#if defined(__has_include)
+# if __has_include(<corecrt.h>)
+#  define HAVE_UCRT 1
+# endif
+#endif
+
+#ifdef HAVE_UCRT
+#define HAVE_STRTOLL 1
+#define HAVE_STRTOULL 1
+#endif
+
 /* Define to 1 if the system has the type `struct addrinfo'. */
 #define HAVE_STRUCT_ADDRINFO 1
 
index e1aa6b7b60c0fc8d5074ea9e9e7c58b157503333..79bac4fece4ec417ed606c379b5b674b7a5d9522 100644 (file)
@@ -356,7 +356,16 @@ ROKEN_CPP_START
 
 #define fsync   _commit
 
-/* The MSVC implementation of snprintf is not C99 compliant.  */
+#define timezone    _timezone
+
+#define tzname  _tzname
+
+#define _PIPE_BUFFER_SZ 8192
+#define pipe(fds) _pipe((fds), _PIPE_BUFFER_SZ, O_BINARY);
+
+#define ftruncate(fd, sz) _chsize((fd), (sz))
+
+#if !defined(HAVE_UCRT)
 #define snprintf    rk_snprintf
 #define vsnprintf   rk_vsnprintf
 #define vasnprintf  rk_vasnprintf
@@ -364,11 +373,6 @@ ROKEN_CPP_START
 #define asnprintf   rk_asnprintf
 #define asprintf    rk_asprintf
 
-#define _PIPE_BUFFER_SZ 8192
-#define pipe(fds) _pipe((fds), _PIPE_BUFFER_SZ, O_BINARY);
-
-#define ftruncate(fd, sz) _chsize((fd), (sz))
-
 ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
 rk_snprintf (char *str, size_t sz, const char *format, ...);
 
@@ -386,6 +390,7 @@ rk_vasnprintf (char **ret, size_t max_sz, const char *format, va_list args);
 
 ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
 rk_vsnprintf (char *str, size_t sz, const char *format, va_list args);
+#endif /* !defined(HAVE_UCRT) */
 
 /* missing stat.h predicates */
 
index 0d895d54a255ea95d79e71d059610d1b5f74f0f6..96c1b250974d3406896256b3da8a2113929d7a28 100644 (file)
@@ -38,6 +38,8 @@
 
 #include "roken.h"
 
+#ifndef HAVE_STRTOLL
+
 /* #include <sys/cdefs.h> */
 
 #include <limits.h>
@@ -150,3 +152,4 @@ noconv:
        *endptr = (char *)(any ? s - 1 : nptr);
     return ret;
 }
+#endif /* !HAVE_STRTOLL */
index 94530e574d12557f5f1e1da7ab1e5b60fcddeb2f..0516e18f9135c2cb727befcc89c1c8d8ec7a1d30 100644 (file)
@@ -38,6 +38,8 @@
 
 #include "roken.h"
 
+#ifndef HAVE_STRTOULL
+
 /* #include <sys/cdefs.h> */
 
 #include <limits.h>
@@ -124,3 +126,4 @@ noconv:
        *endptr = (char *)(any ? s - 1 : nptr);
     return (acc);
 }
+#endif /* !HAVE_STRTOULL */
index ad63ae04f4c85149d08e3ee78aa104bb178d8206..2923e649b969273653a46e0ec27c7b9966a65739 100644 (file)
@@ -133,7 +133,13 @@ clean::
 ######################################################################
 # Runtime modules
 
-!if [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==16
+!if [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==19
+VCVER=VC2019
+!elseif [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==18
+VCVER=VC2018
+!elseif [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==17
+VCVER=VC2017
+!elseif [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==16
 VCVER=VC100
 !elseif [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==15
 VCVER=VC90
@@ -164,22 +170,27 @@ MMDIR=$(SystemDrive)\Program Files (x86)\Common Files\Merge Modules
 !endif
 !endif
 
-!if exist("$(MMDIR)")
-
-RUNTIMEMODULE32="$(MMDIR)\Microsoft_$(VCVER)_$(CRTNAME)_x86.msm"
-!if "$(VCVER)"=="VC100"
-RUNTIMEMODULE64="$(MMDIR)\Microsoft_$(VCVER)_$(CRTNAME)_x64.msm"
+#
+# Don't specify a runtime module when the Universal C Runtime
+# is available.
+#
+!if "$(APPVER)"=="10.0"
+RUNTIMEMODULE32=""
+RUNTIMEMODULE64=""
 !else
+! if exist("$(MMDIR)")
+RUNTIMEMODULE32="$(MMDIR)\Microsoft_$(VCVER)_$(CRTNAME)_x86.msm"
+!  if "$(VCVER)"=="VC90" || "$(VCVER)"=="VC80"
 RUNTIMEMODULE64="$(MMDIR)\Microsoft_$(VCVER)_$(CRTNAME)_x86_x64.msm"
-!endif
-
-!else
+!  else
+RUNTIMEMODULE64="$(MMDIR)\Microsoft_$(VCVER)_$(CRTNAME)_x64.msm"
+!  endif
+! else
 RUNTIMEMODULE32="$(MSSDK)\Redist\VC\microsoft.vcxx.crt.x86_msm.msm"
 RUNTIMEMODULE64="$(MSSDK)\Redist\VC\microsoft.vcxx.crt.x64_msm.msm"
-
+! endif
 !endif
 
-
 ######################################################################
 # Heimdal installer
 
index 0b6000d1bfa0700aa352d067de76aba498e4a418..8ac6cc665fdb6e344e5df6618e525d5f7dfbbfb3 100644 (file)
       <Merge Id='Heimdal.Policy.32' Language='0'
              SourceFile='$(var.InstDir32)\Heimdal.Policy.msm' />
 
-      <Merge Id='Runtime.32' Language='0'
-             SourceFile='$(var.RuntimeModule32)' />
-
+      <?if "$(var.RuntimeModule32)" != "" ?>
+       <Merge Id='Runtime.32' Language='0'
+              SourceFile='$(var.RuntimeModule32)' />
+      <?endif?>
     </DirectoryRef>
     <?endif?>
 
       <Merge Id='Heimdal.Policy.64' Language='0'
              SourceFile='$(var.InstDir64)\Heimdal.Policy.msm' />
 
-      <Merge Id='Runtime.64' Language='0'
-             SourceFile='$(var.RuntimeModule64)' />
-
+      <?if "$(var.RuntimeModule64)" != "" ?>
+       <Merge Id='Runtime.64' Language='0'
+              SourceFile='$(var.RuntimeModule64)' />
+      <?endif?>
     </DirectoryRef>
     <?endif?>
 
       <MergeRef Id='Heimdal.Assemblies.64' />
       <MergeRef Id='Heimdal.GSS.64' />
       <MergeRef Id='Heimdal.Policy.64' />
-      <MergeRef Id='Runtime.64' />
+      <?if "$(var.RuntimeModule64)" != "" ?><MergeRef Id='Runtime.64' /><?endif?>
       <?else?>
       <MergeRef Id='Heimdal.Assemblies.32' />
       <MergeRef Id='Heimdal.GSS.32' />
       <MergeRef Id='Heimdal.Policy.32' />
-      <MergeRef Id='Runtime.32' />
+      <?if "$(var.RuntimeModule32)" != "" ?><MergeRef Id='Runtime.32' /><?endif?>
       <?endif?>
 
       <?ifdef Target32?>
         <MergeRef Id='Heimdal.Assemblies.32' />
        <MergeRef Id='Heimdal.GSS.32' />
         <MergeRef Id='Heimdal.Policy.32' />
-        <MergeRef Id='Runtime.32' />
+       <?if "$(var.RuntimeModule32)" != "" ?><MergeRef Id='Runtime.32' /><?endif?>
       </Feature>
       <?endif?>
       <?endif?>
diff --git a/windows/NTMakefile.sdk b/windows/NTMakefile.sdk
new file mode 100644 (file)
index 0000000..bb06c08
--- /dev/null
@@ -0,0 +1,128 @@
+########################################################################
+#
+# Copyright (c) 2021, PADL Software Pty Ltd.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# - Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+#
+# - Redistributions in binary form must reproduce the above copyright
+#   notice, this list of conditions and the following disclaimer in
+#   the documentation and/or other materials provided with the
+#   distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN if ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+!if !defined(CPU) || "$(CPU)" == ""
+CPU         =AMD64
+!endif
+
+!if "$(CPU)" == "X86" || "$(CPU)" == "x86"
+CPU         =i386
+!endif
+
+!if !defined(APPVER)
+APPVER      =6.1
+!endif
+
+!if "$(APPVER)" == "5.0"
+NMAKE_WINVER=0x0500
+!elseif "$(APPVER)" == "5.01"
+NMAKE_WINVER=0x0501
+!elseif "$(APPVER)" == "5.02"
+NMAKE_WINVER=0x0502
+!elseif "$(APPVER)" == "6.0"
+NMAKE_WINVER=0x0600
+!elseif "$(APPVER)" == "6.1"
+NMAKE_WINVER=0x0601
+!elseif "$(APPVER)" == "10.0"
+NMAKE_WINVER=0x0A00
+!endif
+
+cc          = cl
+link        = link
+implib      = lib
+
+cflags      = -c -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo -GS -W4
+
+!if "$(CPU)" == "i386"
+cflags      = $(cflags) -D_X86_=1
+!endif
+!if "$(CPU)" == "AMD64"
+cflags      = $(cflags) -D_AMD64_=1
+!endif
+!if "$(CPU)" == "ARM"
+cflags      = $(cflags) -D_ARM_=1
+!endif
+!if "$(CPU)" == "ARM64"
+cflags      = $(cflags) -D_ARM64_=1
+!endif
+
+cflags      = $(cflags) -DWIN32 -D_WIN32
+!if "$(CPU)" == "AMD64" || "$(CPU)" == "ARM64"
+cflags      = $(cflags) -DWIN64 -D_WIN64
+!endif
+
+cflags      = $(cflags) -D_WINNT -D_WIN32_WINNT=$(NMAKE_WINVER)
+cflags      = $(cflags) -DNTDDI_VERSION=$(NMAKE_WINVER)0000
+cflags      = $(cflags) -D_WIN32_IE=$(NMAKE_WINVER) -DWINVER=$(NMAKE_WINVER)
+
+!ifdef NODEBUG
+cdebug      = -Ox -DNDEBUG
+!else
+cdebug      = -Zi -Od -DDEBUG
+!endif
+
+cvarsmt     = -D_MT
+cvarsdll    = -D_MT -D_DLL
+!ifdef NODEBUG
+cvarsmt     = $(cvarsmt) -MTd
+cvarsdll    = $(cvarsdll) -MDd
+!else
+cvarsmt     = $(cvarsmt) -MT
+cvarsdll    = $(cvarsdll) -MD
+!endif
+cvars       = $(cvarsmt)
+
+lflags      = $(lflags) /INCREMENTAL:NO /NOLOGO
+!ifdef NODEBUG
+ldebug      = /RELEASE
+!else
+ldebug      = /DEBUG /DEBUGTYPE:cv
+!endif
+
+!if "$(CPU)" == "i386"
+dllentry    = _DllMainCRTStartup@12
+!else
+dllentry    = _DllMainCRTStartup
+!endif
+
+conlflags   = $(lflags) -subsystem:console,$(APPVER)
+guilflags   = $(lflags) -subsystem:windows,$(APPVER)
+dlllflags   = $(lflags) -entry:$(dllentry) -dll
+
+baselibs    = kernel32.lib ws2_32.lib mswsock.lib advapi32.lib
+conlibs     = $(baselibs)
+conlibsmt   = $(baselibs)
+conlibsdll  = $(baselibs)
+
+winlibs     = $(baselibs) user32.lib gdi32.lib comdlg32.lib winspool.lib
+guilibs     = $(winlibs)
+guilibsmt   = $(winlibs)
+guilibsdll  = $(winlibs)
index 40e714d8c193757d70f97c66f977cbcfccbaabe5..929bcf5e43758c89e676770b3cfb4dd98c6e830d 100644 (file)
@@ -39,7 +39,7 @@ prep::
 
 all:: prep
 
-!include <Win32.Mak>
+!include "NTMakefile.sdk"
 
 !ifdef NODEBUG
 BUILD=rel