spiegel-keyman/windows/src/Defines.mak
Marc Durdin eeb755f76a fix(windows): re-enable signature check
Fixes #9692.

Signature checking was skipped because we missed a ".virtual" to force
nmake to build the test and test_i3633 targets. This opened up a small
cascade of related formatting issues on Makefiles, and the fact that the
test_i3633 (has there ever been a more poorly named project?) Makefile
did not even work.

Refactored significantly, added same tests to Developer Makefile, and
also now verifying the .msi and installer executable.

We can improve this further but I'd like to get this in to avoid further
critical issues with code signing given the current broken signing
configuration.
2023-10-06 09:14:35 +07:00

333 lines
9.7 KiB
Makefile

# DEBUG=1
#
# Paths
#
!IFNDEF KEYMAN_ROOT
KEYMAN_ROOT=c:\keyman
!ENDIF
ROOT=$(KEYMAN_ROOT)\windows
COMMON_ROOT=$(KEYMAN_ROOT)\common\windows\delphi
# TODO: include COMMON_ROOT's defines.mak
EXT=$(ROOT)\src\ext
INCLUDE=$(ROOT)\src\global\inc;$(INCLUDE)
!ifndef EXCLUDEPATHDEFINES
!ifndef NODELPHI
!include $(ROOT)\src\PathDefines.mak
!endif
!endif
PROGRAM=$(ROOT)\bin
BUILD=$(ROOT)\build
DEBUGPATH=$(ROOT)\debug
OUTLIB=$(ROOT)\lib
INSTALLPATH_KEYMANDESKTOP=%ProgramFiles(X86)%\Keyman\Keyman Desktop
INSTALLPATH_KEYMANDEVELOPER=%ProgramFiles(X86)%\Keyman\Keyman Developer
INSTALLPATH_KEYMANENGINE=%CommonProgramFiles(X86)%\Keyman\Keyman Engine
!IFDEF DEBUG
GO_FAST=1
MAKEFLAG_DEBUG="DEBUG=$(DEBUG)"
DELPHI_MSBUILD_FLAG_DEBUG="/p:Config=Debug"
!ELSE
!IFDEF TEAMCITY_PR_NUMBER
GO_FAST=1
!ENDIF
DELPHI_MSBUILD_FLAG_DEBUG="/p:Config=Release"
!ENDIF
!IFDEF USERDEFINES
MAKEFLAG_USERDEFINES="USERDEFINES=$(USERDEFINES)"
!ENDIF
!IFDEF SC_TIMESTAMP
MAKEFLAG_SC_TIMESTAMP="SC_TIMESTAMP=$(SC_TIMESTAMP)"
!ENDIF
!IFDEF BUILDHELP
MAKEFLAG_BUILDHELP="BUILDHELP=$(BUILDHELP)"
!ENDIF
!IFDEF BUILDRTF
MAKEFLAG_BUILDRTF="BUILDRTF=$(BUILDRTF)"
!ENDIF
!IFDEF REL_SUFFIX
!ERROR Not using REL_SUFFIX any more!
!ENDIF
!IFDEF LINT
MAKEFLAG_LINT="LINT=$(LINT)"
!ENDIF
!IFDEF NOUI
MAKEFLAG_QUIET="NOUI=$(NOUI)"
!ELSE
!IFDEF QUIET
MAKEFLAG_QUIET="QUIET=$(QUIET)"
!ENDIF
!ENDIF
!IFDEF RELEASE_OEM
MAKEFLAG_RELEASE_OEM="RELEASE_OEM=$(RELEASE_OEM)"
!ENDIF
!IFDEF QUICK_BUILD_KEYMAN
MAKEFLAG_QUICK_BUILD_KEYMAN="QUICK_BUILD_KEYMAN=$(QUICK_BUILD_KEYMAN)"
!ENDIF
#
# USERDEFINES allows the developer to specify overrides for various settings. We need a variable
# because Makefiles cannot test for file existence
#
!ifdef USERDEFINES
!include $(ROOT)\src\UserDefines.mak
!endif
#
# Delphi Compiler Configuration - Delphi 10.3.2
#
!IFNDEF DELPHI_VERSION
DELPHI_VERSION=20.0
!ENDIF
DCC32PATH=C:\Program Files (x86)\Embarcadero\Studio\$(DELPHI_VERSION)\bin
#
# Pass local configuration through to sub-instances of MAKE
#
MAKE="nmake" /C $(MAKEFLAG_QUICK_BUILD_KEYMAN) $(MAKEFLAG_USERDEFINES) $(MAKEFLAG_DEBUG) $(MAKEFLAG_BUILDHELP) $(MAKEFLAG_BUILDRTF) $(MAKEFLAG_SC_TIMESTAMP) $(MAKEFLAG_LINT) $(MAKEFLAG_QUIET) $(MAKEFLAG_RELEASE_OEM)
#
# Delphi build commands
#
!IFDEF DEBUG
TARGET_PATH=Debug
!ELSE
TARGET_PATH=Release
!ENDIF
!IFDEF LINT
DELPHIWARNINGS=-W+MESSAGE_DIRECTIVE -W+IMPLICIT_STRING_CAST -W+IMPLICIT_STRING_CAST_LOSS -W+EXPLICIT_STRING_CAST -W+EXPLICIT_STRING_CAST_LOSS -W+CVT_WCHAR_TO_ACHAR -W+CVT_NARROWING_STRING_LOST -W+CVT_ACHAR_TO_WCHAR -W+CVT_WIDENING_STRING_LOST -W+UNICODE_TO_LOCALE -W+LOCALE_TO_UNICODE -W+IMPLICIT_VARIANTS
!ELSE
DELPHIWARNINGS=-W-MESSAGE_DIRECTIVE -W-IMPLICIT_STRING_CAST -W-IMPLICIT_STRING_CAST_LOSS -W-EXPLICIT_STRING_CAST -W-EXPLICIT_STRING_CAST_LOSS -W-CVT_WCHAR_TO_ACHAR -W-CVT_NARROWING_STRING_LOST -W-CVT_ACHAR_TO_WCHAR -W-CVT_WIDENING_STRING_LOST -W-UNICODE_TO_LOCALE -W-LOCALE_TO_UNICODE -W-IMPLICIT_VARIANTS -W-IMPLICIT_INTEGER_CAST_LOSS -W-IMPLICIT_CONVERSION_LOSS -W-COMBINING_SIGNED_UNSIGNED64 -W-COMBINING_SIGNED_UNSIGNED64
!ENDIF
DELPHIDPRPARAMS=-Q -B -GD -H -VT -^$C+ -^$D+ -^$J+ -^$L+ -^$O+ -^$Q- -^$R- -^$W+ -^$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -NU.\obj\Win32\$(TARGET_PATH) -E.\bin\Win32\$(TARGET_PATH)
DELPHIDPRPARAMS64=-Q -B -GD -H -VT -^$C+ -^$D+ -^$J+ -^$L+ -^$O+ -^$Q- -^$R- -^$W+ -^$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -NU.\obj\Win64\$(TARGET_PATH) -E.\bin\Win64\$(TARGET_PATH)
DELPHIDPKPARAMS=-Q -B -GD -VT -^$C+ -^$D+ -^$J+ -^$L+ -^$O+ -^$Q- -^$R- -^$W+ -^$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -LE$(OUTLIB) -LN$(OUTLIB) -NSData -NUobj\Win32\$(TARGET_PATH)
# we are using cmd /c because dcc32/dcc64 are failing on direct execution
# from nmake
DCC32=cmd /c "$(DCC32PATH)\dcc32.exe" $(DELPHIDPRPARAMS)
DCC32DPK=cmd /c "$(DCC32PATH)\dcc32.exe" $(DELPHIDPKPARAMS)
DCC64=cmd /c "$(DCC32PATH)\dcc64.exe" $(DELPHIDPRPARAMS64) -N0x64\ -Ex64\
#
# Delphi MSBuild related commands and macros
#
DELPHI_MSBUILD="$(COMMON_ROOT)\tools\msbuild-wrapper.bat" "$(DCC32PATH)" $(DELPHI_MSBUILD_FLAG_DEBUG)
!IFDEF NODELPHI
DCC32=echo skipping
DCC32DPK=echo skipping
DCC64=echo skipping
DELPHI_MSBUILD=echo skipping
!ENDIF
# Visual C++ x86, x64
WIN32_TARGET_PATH=bin\Win32\$(TARGET_PATH)
X64_TARGET_PATH=bin\x64\$(TARGET_PATH)
# Delphi x86, x64
# WIN32_TARGET_PATH=...
WIN64_TARGET_PATH=bin\Win64\$(TARGET_PATH)
#
# Shared devtools app for common Delphi source manipulation
#
DEVTOOLS=$(COMMON_ROOT)\tools\devtools\$(WIN32_TARGET_PATH)\devtools.exe
#
# Other program build commands
#
PHPDIR=\php
PHPEXE=$(PHPDIR)\php.exe
BRCC32=rc.exe
HHC="C:\Program Files (x86)\HTML Help Workshop\hhc.exe"
NMAKE=nmake.exe
CL=cl.exe
MSBUILD=msbuild.exe
# /maxcpucount see https://devblogs.microsoft.com/cppblog/precompiled-header-pch-issues-and-recommendations/
MT=mt.exe
VCBUILD=error
!IFDEF DEBUG
MSBUILD_BUILD=/t:Build /p:Configuration=Debug
MSBUILD_CLEAN=/t:Clean /p:Configuration=Debug
!ELSE
MSBUILD_BUILD=/t:Rebuild /p:Configuration=Release
MSBUILD_CLEAN=/t:Clean /p:Configuration=Release
!ENDIF
COPY=copy
ISXBUILD=C:\PROGRA~1\INSTALLSHIELD\Express\System\IsExpCmdBld
WZZIPPATH="C:\program files\7-zip\7z.exe"
!IFDEF GO_FAST
WZZIP=$(WZZIPPATH) a -mx1
!ELSE
WZZIP=$(WZZIPPATH) a -mx9
!ENDIF
WZUNZIP=$(WZZIPPATH) e
# TDSPACK=error! $(ROOT)\src\buildtools\tdspack\tdspack -e
# TDSPACKCOMPRESS=error! $(ROOT)\src\buildtools\tdspack\tdspack -o
# we are using cmd /c because tds2dbg is failing on direct execution
# from nmake
TDS2DBG=cmd /c $(KEYMAN_ROOT)\common\windows\bin\tools\tds2dbg
SENTRYTOOL=$(COMMON_ROOT)\tools\sentrytool\$(WIN32_TARGET_PATH)\sentrytool.exe
SENTRYTOOL_DELPHIPREP=$(SENTRYTOOL) delphiprep -r $(KEYMAN_ROOT) -i $(DELPHIINCLUDES)
WIXPATH="c:\program files (x86)\WiX Toolset v3.11\bin"
WIXCANDLE=$(WIXPATH)\candle.exe -wx -nologo
!IFDEF LINT
WIXLIGHTLINT=
!ELSE
# we suppress ICE82 because it reports spurious errors with merge module keymanengine to do with duplicate sequence numbers. Safely ignored.
WIXLIGHTLINT= -sice:ICE82 -sice:ICE80
!ENDIF
!IFDEF GO_FAST
# for debug builds, we turn off compression because it is so hideously slow
# for test builds, we also turn off compression
WIXLIGHTCOMPRESSION=-dcl:none
!ELSE
WIXLIGHTCOMPRESSION=-dcl:high
!ENDIF
WIXLIGHT=$(WIXPATH)\light.exe -wx -nologo $(WIXLIGHTLINT) $(WIXLIGHTCOMPRESSION)
WIXLIT=$(WIXPATH)\lit.exe -wx -nologo
WIXHEAT=$(WIXPATH)\heat.exe
LINKPATH=link.exe
#
# Certificates and code signing
#
!ifdef SIGNCODE_BUILD
MAKE=$(MAKE) "SIGNCODE_BUILD=$(SIGNCODE_BUILD)"
!else
MAKE=$(MAKE)
!endif
#
# To get a .pfx from a .spc and .pvk, run pvk2pfx.exe
#
!IFNDEF SC_PFX_SHA1
SC_PFX_SHA1="$(COMMON_ROOT)\tools\certificates\keymantest-sha1.pfx"
!ENDIF
!IFNDEF SC_PFX_SHA256
SC_PFX_SHA256="$(COMMON_ROOT)\tools\certificates\keymantest-sha256.pfx"
!ENDIF
!IFNDEF SC_URL
SC_URL="https://keyman.com/"
!ENDIF
!IFNDEF SC_PWD
SC_PWD=""
!ENDIF
SIGNCODE=@"$(KEYMAN_ROOT)\common\windows\signtime.bat" signtool.exe $(SC_PFX_SHA1) $(SC_PFX_SHA256) $(SC_URL) $(SC_PWD)
#
# On some computers, the PLATFORM environment variable is set to x86. This can break msbuild
# with our projects. This may be resolvable in the future, but for now the easy fix is ...
# This may be exacerbated by a bug in Delphi MAKE - https://quality.embarcadero.com/browse/RSP-18245
#
PLATFORM=Win32
#
# mkver commands. mkver determines tag from the local build environment variables
# in the same way as /resources/build/build-utils.sh.
#
!ifdef GIT_BASH_FOR_KEYMAN
MKVER_SH=$(GIT_BASH_FOR_KEYMAN) $(KEYMAN_ROOT)\common\windows\mkver.sh
!else
MKVER_SH=start /wait $(KEYMAN_ROOT)\common\windows\mkver.sh
!endif
MKVER_M=$(MKVER_SH) manifest.in manifest.xml
MKVER_U=$(MKVER_SH)
#
# Symstore
#
# KEYMAN_SYMSTOREPATH defaults to sibling folder "symbols". If it is not present,
# then we won't attempt to write symbols to the store.
!IFNDEF KEYMAN_SYMSTOREPATH
KEYMAN_SYMSTOREPATH=$(KEYMAN_ROOT)\..\symbols
!ENDIF
# Nearly matches algorithm from resources/build/build-utils.sh
# For now, we'll use it only for SYMSTORE, where it is for reference
# only. Thus using the variable name __VERSION_WITH_TAG. Issues:
# 1. always appends tier, even for stable
# 2. test builds will append a branch name for master/beta/stable-x.y
# 3. this is only available for `make symbols` (VERSION_WIN, VERSION_TIER
# are defined in Targets.mak only here)
# Fixing this properly would be possible but take a fair bit more
# work than I want to do just now. The intent is to make it possible to find
# symbols in the symstore index which we can purge later on.
__VERSION_WITH_TAG=$(VERSION_WIN)-$(VERSION_TIER)
!IFNDEF TEAMCITY_VERSION
__VERSION_WITH_TAG=$(__VERSION_WITH_TAG)-local
!ELSE
!IFDEF TEAMCITY_PR_NUMBER
__VERSION_WITH_TAG=$(__VERSION_WITH_TAG)-test-$(TEAMCITY_PR_NUMBER)
!ENDIF
!ENDIF
# This command depends on VERSION_WIN and VERSION_TIER being defined, through
# `make symbols` (i.e. don't call `make wrap-symbols`)
SYMSTORE="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\symstore.exe" add \
/s "$(KEYMAN_SYMSTOREPATH)" \
/v "$(VERSION_WIN)" \
/c "Version: $(__VERSION_WITH_TAG)" \
/compress /f
CLEAN=-del /S /Q
#
# Signature checks
#
VERIFY_SIGNATURES_PATH=$(KEYMAN_ROOT)\common\windows\delphi\tools\verify_signatures
# Note: hyphen prefix is important to ignore return value from sigcheck
SIGCHECK=-$(VERIFY_SIGNATURES_PATH)\$(WIN32_TARGET_PATH)\sigcheck -q -s -e -v -accepteula
VERIFY_SIGNATURES=$(VERIFY_SIGNATURES_PATH)\$(WIN32_TARGET_PATH)\verify_signatures -d $(KEYMAN_ROOT)\VERSION.md