mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-19 06:47:41 +00:00
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.
333 lines
9.7 KiB
Makefile
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
|