NMAKE invocations are costly (slow, no-parallel support). Rather than pinpoint cleaning of each combination of $(PKG), $(LANG), $(PLAT) and $(CFG) related files, we do the wildcard cleaning of all $(PKG) related files. Signed-off-by: Simon Rozman <simon@rozman.si>
277 lines
21 KiB
Makefile
277 lines
21 KiB
Makefile
#
|
||
# Copyright 1991-2020 Amebis
|
||
# Copyright 2016 GÉANT
|
||
#
|
||
# This file is part of MSIBuild.
|
||
#
|
||
# MSIBuild is free software: you can redistribute it and/or modify
|
||
# it under the terms of the GNU General Public License as published by
|
||
# the Free Software Foundation, either version 3 of the License, or
|
||
# (at your option) any later version.
|
||
#
|
||
# MSIBuild is distributed in the hope that it will be useful,
|
||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
# GNU General Public License for more details.
|
||
#
|
||
# You should have received a copy of the GNU General Public License
|
||
# along with MSIBuild. If not, see <http://www.gnu.org/licenses/>.
|
||
#
|
||
|
||
######################################################################
|
||
# Parameter validation
|
||
######################################################################
|
||
|
||
!IFNDEF MSIBUILD_OUTPUT_DIR
|
||
!ERROR Parameter MSIBUILD_OUTPUT_DIR is undefined.
|
||
!ENDIF
|
||
|
||
!IFNDEF MSIBUILD_ROOT
|
||
!ERROR Parameter MSIBUILD_ROOT is undefined.
|
||
!ENDIF
|
||
|
||
!IFNDEF MSIBUILD_TARGET
|
||
!ERROR Parameter MSIBUILD_TARGET is undefined.
|
||
!ENDIF
|
||
|
||
!IFNDEF MSIBUILD_PRODUCT_NAME
|
||
!ERROR Parameter MSIBUILD_PRODUCT_NAME is undefined.
|
||
!ENDIF
|
||
|
||
!IFNDEF MSIBUILD_CODEPAGE
|
||
!ERROR Parameter MSIBUILD_CODEPAGE is undefined.
|
||
!ENDIF
|
||
|
||
!IFNDEF MSIBUILD_LANGID
|
||
!ERROR Parameter MSIBUILD_LANGID is undefined.
|
||
!ENDIF
|
||
|
||
!IFNDEF MSIBUILD_MSI_VERSION_MIN
|
||
!ERROR Parameter MSIBUILD_MSI_VERSION_MIN is undefined.
|
||
!ENDIF
|
||
|
||
!IFNDEF MSIBUILD_LENGTH_ID
|
||
!ERROR Parameter MSIBUILD_LENGTH_ID is undefined.
|
||
!ENDIF
|
||
|
||
!IFNDEF MSIBUILD_LENGTH_HELP
|
||
!ERROR Parameter MSIBUILD_LENGTH_HELP is undefined.
|
||
!ENDIF
|
||
|
||
!IFNDEF MSIBUILD_PHASE
|
||
MSIBUILD_PHASE=0
|
||
!ENDIF
|
||
|
||
!IFNDEF PLAT
|
||
PLAT=Win32
|
||
!ENDIF
|
||
!IF "$(PLAT)" == "Win32"
|
||
MSIBUILD_PLAT=Intel
|
||
!ELSEIF "$(PLAT)" == "ARM64"
|
||
MSIBUILD_PLAT=Arm64
|
||
!IF $(MSIBUILD_MSI_VERSION_MIN) < 500
|
||
!ERROR ARM64 platform is supported on MSI 5.0 or later. Please, specify MSIBUILD_MSI_VERSION_MIN=500 for ARM64 builds.
|
||
!ENDIF
|
||
!ELSEIF "$(PLAT)" == "x64"
|
||
MSIBUILD_PLAT=x64
|
||
!IF $(MSIBUILD_MSI_VERSION_MIN) < 150
|
||
!ERROR x64 platform is supported on MSI 1.5 or later. Please, specify MSIBUILD_MSI_VERSION_MIN=150 for x64 builds.
|
||
!ENDIF
|
||
!ELSE
|
||
!ERROR Unsupported platform: $(PLAT)
|
||
!ENDIF
|
||
!IF "$(PROCESSOR_ARCHITECTURE)" == "AMD64" || "$(PROCESSOR_ARCHITECTURE)" == "ARM64"
|
||
MSIBUILD_MSM_MS_REPO=$(PROGRAMW6432) (x86)\Common Files\Merge Modules
|
||
!ELSE
|
||
MSIBUILD_MSM_MS_REPO=$(COMMONPROGRAMFILES)\Merge Modules
|
||
!ENDIF
|
||
!IFDEF MSIBUILD_VENDOR_NAME
|
||
MSIINFO_FLAGS=/A "$(MSIBUILD_VENDOR_NAME)"
|
||
!ELSE
|
||
MSIINFO_FLAGS=
|
||
!ENDIF
|
||
|
||
######################################################################
|
||
# Target Stubs
|
||
######################################################################
|
||
|
||
All ::
|
||
|
||
Clean ::
|
||
|
||
!IF $(MSIBUILD_PHASE) == 0
|
||
|
||
######################################################################
|
||
# Setup Phase
|
||
# - Version info parsing
|
||
######################################################################
|
||
|
||
All :: \
|
||
"$(MSIBUILD_ROOT)\Version\$(PKG)Version.mak" \
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).PackageGUID.mak"
|
||
$(MAKE) /f "Makefile" /$(MAKEFLAGS) MSIBUILD_PHASE=1 All
|
||
|
||
Clean ::
|
||
$(MAKE) /f "Makefile" /$(MAKEFLAGS) MSIBUILD_PHASE=100 Clean
|
||
|
||
"$(MSIBUILD_ROOT)\Version\$(PKG)Version.mak" ::
|
||
cd $(@D)
|
||
$(MAKE) /f "Makefile" /$(MAKEFLAGS) Version
|
||
cd "$(MAKEDIR)"
|
||
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).PackageGUID.mak" ::
|
||
cscript.exe "$(MSIBUILD_ROOT)\MSI.wsf" //Job:MakeGUID //Nologo /M:MSIBUILD_PACKAGE_GUID > "$(@:"=).tmp"
|
||
move /y "$(@:"=).tmp" $@ > NUL
|
||
|
||
!ELSEIF $(MSIBUILD_PHASE) == 1
|
||
|
||
######################################################################
|
||
# 1st Phase
|
||
# - Module preparation, generating dependency lists and first version
|
||
# of MSI package
|
||
######################################################################
|
||
|
||
!INCLUDE "$(MSIBUILD_ROOT)\Version\$(PKG)Version.mak"
|
||
!INCLUDE "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).PackageGUID.mak"
|
||
|
||
All :: \
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).1.msi" \
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).2.dep"
|
||
$(MAKE) /f "Makefile" /$(MAKEFLAGS) MSIBUILD_PHASE=2 All
|
||
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).1.msi" : $(MSIBUILD_MODULES) $(MSIBUILD_MODULES_PRECOMPILED)
|
||
-if exist $@ del /f /q $@
|
||
copy /y "$(MSIBUILD_ROOT)\Empty.msi" "$(@:"=).tmp" > NUL
|
||
!if not exist "$(**R:"=).msmcfg" msidb.exe -d "$(@:"=).tmp" -m $**
|
||
msiinfo.exe "$(@:"=).tmp" /nologo /C $(MSIBUILD_CODEPAGE) /T "$(MSIBUILD_PRODUCT_NAME) $(MSIBUILD_VERSION_STR) ($(PLAT))" $(MSIINFO_FLAGS) /P "$(MSIBUILD_PLAT);$(MSIBUILD_LANGID)" /G $(MSIBUILD_MSI_VERSION_MIN) /V $(MSIBUILD_PACKAGE_GUID) /W 0 /O ""
|
||
!if exist "$(**R:"=).msmcfg" msimsm.exe "$(@:"=).tmp" $** /N "$(**R:"=).msmcfg" /D "$(**R:"=).log" /Sd "$(MSIBUILD_OUTPUT_DIR)" /F
|
||
move /y "$(@:"=).tmp" $@ > NUL
|
||
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).2.dep" : "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).1.msi"
|
||
cscript.exe "$(MSIBUILD_ROOT)\MSI.wsf" //Job:MakeDEP //Nologo "$(@:"=).tmp" "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).2.msi" $**
|
||
move /y "$(@:"=).tmp" $@ > NUL
|
||
|
||
$(MSIBUILD_MODULES) ::
|
||
cd $(@D)
|
||
$(MAKE) /f "Makefile" /$(MAKEFLAGS) MSIBUILD_HAS_VERSION=1
|
||
cd "$(MAKEDIR)"
|
||
|
||
!IFDEF MSIBUILD_MODULES_PRECOMPILED
|
||
$(MSIBUILD_MODULES_PRECOMPILED) ::
|
||
if exist "$(MSIBUILD_MSM_MS_REPO)\$(@F:"=)" $(MAKE) /f "Makefile" /$(MAKEFLAGS) MSIBUILD_PHASE=90 MSIBUILD_MSM_SRC="$(MSIBUILD_MSM_MS_REPO)\$(@F:"=)" MSIBUILD_MSM_DST=$@ All
|
||
!ENDIF
|
||
|
||
!ELSEIF $(MSIBUILD_PHASE) == 2
|
||
|
||
######################################################################
|
||
# 2nd Phase
|
||
# - MSI package population with exact file versions and sizes
|
||
######################################################################
|
||
|
||
!INCLUDE "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).2.dep"
|
||
!INCLUDE "$(MSIBUILD_ROOT)\Version\$(PKG)Version.mak"
|
||
|
||
All :: \
|
||
!IFDEF MSIBUILD_COMPRESS
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).3.dep" \
|
||
!ENDIF
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).2.msi"
|
||
!IFDEF MSIBUILD_COMPRESS
|
||
$(MAKE) /f "Makefile" /$(MAKEFLAGS) MSIBUILD_PHASE=3 All
|
||
!ENDIF
|
||
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).2.msi" : "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).1.msi"
|
||
-if exist $@ del /f /q $@
|
||
copy /y "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).1.msi" "$(@:"=).tmp" > NUL
|
||
msifiler.exe -v -h -d "$(@:"=).tmp" > "$(*:"=).out"
|
||
move /y "$(@:"=).tmp" $@ > NUL
|
||
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).3.dep" : "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).1.msi"
|
||
cscript.exe "$(MSIBUILD_ROOT)\MSI.wsf" //Job:MakeDEP //Nologo "$(@:"=).tmp" "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).cab" $**
|
||
move /y "$(@:"=).tmp" $@ > NUL
|
||
|
||
!ELSEIF $(MSIBUILD_PHASE) == 3
|
||
|
||
######################################################################
|
||
# 3rd Phase
|
||
# - MSI package compression
|
||
######################################################################
|
||
|
||
!INCLUDE "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).3.dep"
|
||
!INCLUDE "$(MSIBUILD_ROOT)\Version\$(PKG)Version.mak"
|
||
|
||
All :: \
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).3.msi"
|
||
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).3.ddf" : "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).2.msi"
|
||
cscript.exe "$(MSIBUILD_ROOT)\MSI.wsf" //Job:MakeDDF //Nologo "$(@:"=).tmp" $** /O:"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET)" /C:LZX
|
||
move /y "$(@:"=).tmp" $@ > NUL
|
||
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).cab" \
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).inf" \
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).rpt" : "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).3.ddf"
|
||
makecab.exe /F "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).3.ddf"
|
||
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).3.msi" : \
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).2.msi" \
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).cab" \
|
||
"$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).inf"
|
||
-if exist $@ del /f /q $@
|
||
copy /y "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).2.msi" "$(@:"=).tmp" > NUL
|
||
cscript.exe "$(MSIBUILD_ROOT)\MSI.wsf" //Job:SetCAB //Nologo "$(@:"=).tmp" "$(MSIBUILD_OUTPUT_DIR)\$(MSIBUILD_TARGET).inf" /E
|
||
msiinfo.exe "$(@:"=).tmp" /nologo /U 4
|
||
!IFDEF MANIFESTCERTIFICATETHUMBPRINT
|
||
signtool.exe sign /sha1 "$(MANIFESTCERTIFICATETHUMBPRINT)" /fd sha256 /tr "$(MANIFESTTIMESTAMPRFC3161URL)" /d "$(MSIBUILD_PRODUCT_NAME)" /q "$(@:"=).tmp"
|
||
!ENDIF
|
||
attrib.exe +r "$(@:"=).tmp"
|
||
move /y "$(@:"=).tmp" $@ > NUL
|
||
|
||
!ELSEIF $(MSIBUILD_PHASE) == 90
|
||
|
||
######################################################################
|
||
# MSM Copy from Repository Phase
|
||
######################################################################
|
||
|
||
All :: "$(MSIBUILD_MSM_DST)"
|
||
|
||
"$(MSIBUILD_MSM_DST)" : "$(MSIBUILD_MSM_SRC)"
|
||
copy /y $** $@ > NUL
|
||
|
||
!ELSE
|
||
|
||
######################################################################
|
||
# Cleanup Phase
|
||
# - Cleaning modules
|
||
######################################################################
|
||
|
||
Clean :: $(MSIBUILD_MODULES) $(MSIBUILD_MODULES_PRECOMPILED)
|
||
cd "$(MSIBUILD_ROOT)\Version"
|
||
$(MAKE) /f "Makefile" /$(MAKEFLAGS) Clean
|
||
cd "$(MAKEDIR)"
|
||
-if exist "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.PackageGUID.mak" del /f /q "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.PackageGUID.mak"
|
||
-if exist "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.1.msi" del /f /q "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.1.msi"
|
||
-if exist "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.2.dep" del /f /q "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.2.dep"
|
||
-if exist "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.2.msi" del /f /q "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.2.msi"
|
||
-if exist "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.2.out" del /f /q "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.2.out"
|
||
-if exist "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.3.dep" del /f /q "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.3.dep"
|
||
-if exist "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.3.ddf" del /f /q "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.3.ddf"
|
||
-if exist "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.3.msi" del /f /q "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.3.msi"
|
||
-if exist "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.3.out" del /f /q "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.3.out"
|
||
-if exist "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.cab" del /f /q "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.cab"
|
||
-if exist "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.inf" del /f /q "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.inf"
|
||
-if exist "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.rpt" del /f /q "$(MSIBUILD_OUTPUT_DIR)\$(PKG)*.rpt"
|
||
|
||
$(MSIBUILD_MODULES) ::
|
||
cd $(@D)
|
||
$(MAKE) /f "Makefile" /$(MAKEFLAGS) Clean
|
||
cd "$(MAKEDIR)"
|
||
|
||
!IFDEF MSIBUILD_MODULES_PRECOMPILED
|
||
$(MSIBUILD_MODULES_PRECOMPILED) ::
|
||
cd $(@D)
|
||
-if exist "*.log" del /f /q "*.log"
|
||
cd "$(MAKEDIR)"
|
||
!ENDIF
|
||
|
||
!ENDIF
|