Page Menu
Home
GnuPG
Search
Configure Global Search
Log In
Files
F34252386
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Size
119 KB
Subscribers
None
View Options
diff --git a/Makefile.am b/Makefile.am
index cfc68a0ad..4af18b25d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,267 +1,268 @@
# Makefile.am - main makefile for GnuPG
# Copyright (C) 2001, 2004, 2010 Free Software Foundation, Inc.
#
# This file is part of GnuPG.
#
# GnuPG 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.
#
# GnuPG 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 this program; if not, see <https://www.gnu.org/licenses/>.
## Process this file with automake to produce Makefile.in
# Location of the released tarball archives. This is prefixed by
# the variable RELEASE_ARCHIVE in ~/.gnupg-autogen.rc. For example:
# RELEASE_ARCHIVE=user@host:archive/tarballs
RELEASE_ARCHIVE_SUFFIX = gnupg/v2.2
# The variable RELEASE_SIGNKEY in ~/.gnupg-autogen.rc is used
# to specify the key for signing. For example:
# RELEASE_SIGNKEY=D8692123C4065DEA5E0F3AB5249B39D24F25E3B6
# Autoconf flags.
ACLOCAL_AMFLAGS = -I m4
AM_DISTCHECK_CONFIGURE_FLAGS = --enable-gnupg-builddir-envvar \
--enable-all-tests --enable-g13 \
--enable-gpgtar --enable-wks-tools --disable-ntbtls
GITLOG_TO_CHANGELOG=gitlog-to-changelog
EXTRA_DIST = build-aux/config.rpath build-aux/potomo autogen.sh autogen.rc \
ChangeLog-2011 po/ChangeLog-2011 build-aux/ChangeLog-2011 \
VERSION README.GIT build-aux/gitlog-to-changelog \
COPYING.GPL2 COPYING.LGPL21 COPYING.LGPL3 \
COPYING.CC0 COPYING.other \
build-aux/git-log-fix build-aux/git-log-footer \
build-aux/getswdb.sh \
build-aux/speedo.mk \
build-aux/speedo/zlib.pc \
build-aux/speedo/w32/inst-options.ini \
build-aux/speedo/w32/inst.nsi \
build-aux/speedo/w32/pkg-copyright.txt \
build-aux/speedo/w32/g4wihelp.c \
build-aux/speedo/w32/pango.modules \
build-aux/speedo/w32/gdk-pixbuf-loaders.cache \
build-aux/speedo/w32/exdll.h \
+ build-aux/speedo/w32/exdll.c \
build-aux/speedo/w32/README.txt \
build-aux/speedo/w32/gnupg-logo-150x57.bmp \
build-aux/speedo/w32/gnupg-logo-164x314.bmp \
build-aux/speedo/w32/wixlib.wxs \
build-aux/speedo/patches/atk-1.32.0.patch \
build-aux/speedo/patches/libiconv-1.14.patch \
build-aux/speedo/patches/pango-1.29.4.patch \
build-aux/speedo/patches/gpgme-1.12.0.patch \
build-aux/speedo/patches/sqlite.patch
DISTCLEANFILES = g10defs.h
if BUILD_GPG
gpg = g10
else
gpg =
endif
if BUILD_GPGSM
sm = sm
else
sm =
endif
if BUILD_AGENT
agent = agent
else
agent =
endif
if BUILD_SCDAEMON
scd = scd
else
scd =
endif
if BUILD_G13
g13 = g13
else
g13 =
endif
if BUILD_DIRMNGR
dirmngr = dirmngr
else
dirmngr =
endif
if BUILD_DOC
doc = doc
else
doc =
endif
if DISABLE_TESTS
tests =
else
tests = tests
endif
SUBDIRS = m4 common regexp kbx \
${gpg} ${sm} ${agent} ${scd} ${g13} ${dirmngr} \
tools po ${doc} ${tests}
dist_doc_DATA = README
dist-hook: gen-ChangeLog
distcheck-hook:
set -e; ( \
pref="#+macro: gnupg22_" ;\
reldate="$$(date -u +%Y-%m-%d)" ;\
echo "$${pref}ver $(PACKAGE_VERSION)" ;\
echo "$${pref}date $${reldate}" ;\
list='$(DIST_ARCHIVES)'; for i in $$list; do \
case "$$i" in *.tar.bz2) \
echo "$${pref}size $$(wc -c <$$i|awk '{print int($$1/1024)}')k" ;\
echo "$${pref}sha1 $$(sha1sum <$$i|cut -d' ' -f1)" ;\
echo "$${pref}sha2 $$(sha256sum <$$i|cut -d' ' -f1)" ;;\
esac;\
done ) | tee $(distdir).swdb
if HAVE_W32_SYSTEM
install-data-hook:
set -e; \
for i in $$($(top_srcdir)/build-aux/potomo \
--get-linguas $(top_srcdir)/po) ; do \
$(MKDIR_P) "$(DESTDIR)$(localedir)/$$i/LC_MESSAGES" || true; \
rm -f "$(DESTDIR)$(localedir)/$$i/LC_MESSAGES/gnupg2.mo" \
2>/dev/null || true; \
$(top_srcdir)/build-aux/potomo $(top_srcdir)/po/$$i.po \
"$(DESTDIR)$(localedir)/$$i/LC_MESSAGES/gnupg2.mo" ; \
done
endif
gen_start_date = 2011-12-01T06:00:00
.PHONY: gen-ChangeLog
gen-ChangeLog:
if test -e $(top_srcdir)/.git; then \
(cd $(top_srcdir) && \
$(GITLOG_TO_CHANGELOG) --append-dot --tear-off \
--amend=build-aux/git-log-fix \
--since=$(gen_start_date) ) > $(distdir)/cl-t; \
cat $(top_srcdir)/build-aux/git-log-footer >> $(distdir)/cl-t; \
rm -f $(distdir)/ChangeLog; \
mv $(distdir)/cl-t $(distdir)/ChangeLog; \
fi
stowinstall:
$(MAKE) $(AM_MAKEFLAGS) install prefix=/usr/local/stow/gnupg
TESTS_ENVIRONMENT = \
LC_ALL=C \
EXEEXT=$(EXEEXT) \
PATH=$(abs_top_builddir)/tests/gpgscm:$(PATH) \
abs_top_srcdir=$(abs_top_srcdir) \
objdir=$(abs_top_builddir) \
GPGSCM_PATH=$(abs_top_srcdir)/tests/gpgscm
.PHONY: check-all release sign-release
check-all:
$(TESTS_ENVIRONMENT) \
$(abs_top_builddir)/tests/gpgscm/gpgscm \
$(abs_srcdir)/tests/run-tests.scm $(TESTFLAGS) $(TESTS)
# Names of to help the release target.
RELEASE_NAME = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)
RELEASE_W32_STEM_NAME = $(PACKAGE_TARNAME)-w32-$(PACKAGE_VERSION)
release:
+(set -e;\
if [ "$(abs_top_builddir)" = "$(abs_top_srcdir)" ]; then \
echo "error: build directory must not be the source directory" >&2;\
exit 2;\
fi ;\
echo "/* Build started at $$(date -uIseconds) */" ;\
cd $(top_srcdir); \
./autogen.sh --force; \
cd $(abs_top_builddir); \
rm -rf dist; mkdir dist ; cd dist ; \
mkopt=""; \
if [ -n "$$CUSTOM_SWDB" ]; then \
mkopt="CUSTOM_SWB=1"; \
x=$$(grep '^OVERRIDE_TARBALLS=' \
$$HOME/.gnupg-autogen.rc|cut -d= -f2);\
if [ -f "$$x/swdb.lst" ]; then \
echo "/* Copying swdb.lst from the overrides directory */"; \
cp "$$x/swdb.lst" . ; \
cp "$$x/swdb.lst.sig" . ; \
fi; \
fi; \
echo "/* Running configure */";\
$(abs_top_srcdir)/configure --enable-maintainer-mode; \
echo "/* Running make distcheck */";\
$(MAKE) distcheck TESTFLAGS=--parallel; \
echo "/* Unpacking release */";\
$(TAR) xjf $(RELEASE_NAME).tar.bz2 ;\
echo "/* Running $(MAKE) -f $(RELEASE_NAME)/build-aux/speedo.mk w32-release $$mkopt";\
$(MAKE) -f $(RELEASE_NAME)/build-aux/speedo.mk w32-release $$mkopt;\
echo "/* Build finished at $$(date -uIseconds) */" ;\
echo "/*" ;\
echo " * Please run the final step interactivly:" ;\
echo " * make sign-release" ;\
echo " */" ;\
) 2>&1 | tee "$(RELEASE_NAME).buildlog"
sign-release:
+(set -e; \
test $$(pwd | sed 's,.*/,,') = dist || cd dist; \
x=$$(grep '^RELEASE_ARCHIVE=' $$HOME/.gnupg-autogen.rc|cut -d= -f2);\
if [ -z "$$x" ]; then \
echo "error: RELEASE_ARCHIVE missing in ~/.gnupg-autogen.rc">&2; \
exit 2;\
fi;\
myarchive="$$x/$(RELEASE_ARCHIVE_SUFFIX)";\
x=$$(grep '^RELEASE_SIGNKEY=' $$HOME/.gnupg-autogen.rc|cut -d= -f2);\
if [ -z "$$x" ]; then \
echo "error: RELEASE_SIGNKEY missing in ~/.gnupg-autogen.rc">&2; \
exit 2;\
fi;\
mysignkey="$$x";\
release_w32_name="$(RELEASE_W32_STEM_NAME)_$$(date -u +%Y%m%d)" ;\
files1="$(RELEASE_NAME).tar.bz2 \
$${release_w32_name}.tar.xz \
$${release_w32_name}.exe" ;\
files2="$(RELEASE_NAME).tar.bz2.sig \
$(RELEASE_NAME).swdb \
$(RELEASE_NAME).buildlog \
$${release_w32_name}.tar.xz.sig \
$${release_w32_name}.exe.sig \
$${release_w32_name}.exe.swdb" ;\
files3="$${release_w32_name}.wixlib \
$${release_w32_name}.wixlib.sig"; \
$(MAKE) -f $(RELEASE_NAME)/build-aux/speedo.mk w32-sign-installer ;\
echo "/* Signing the source tarball ..." ;\
gpg -sbu $$mysignkey $(RELEASE_NAME).tar.bz2 ;\
echo "/* Signing the W32 source tarball ..." ;\
gpg -sbu $$mysignkey $${release_w32_name}.tar.xz ;\
echo "/* Signing the W32 installer ..." ;\
gpg -sbu $$mysignkey $${release_w32_name}.exe ;\
echo "/* Signing the Wixlib ..." ;\
gpg -sbu $$mysignkey $${release_w32_name}.wixlib ;\
cat $(RELEASE_NAME).swdb >swdb.snippet;\
echo '#+macro: gnupg22_branch STABLE-BRANCH-2-2' >>swdb.snippet;\
cat $${release_w32_name}.exe.swdb >>swdb.snippet;\
echo >>swdb.snippet ;\
sha1sum $${files1} >>swdb.snippet ;\
cat "../$(RELEASE_NAME).buildlog" swdb.snippet \
| gzip >$(RELEASE_NAME).buildlog ;\
echo "Release created - copying it to the archive ..." ;\
scp -p $${files1} $${files2} $${files3} $$myarchive/ \
|| echo "/* Error copying files to the archive - ignored */" ;\
echo '/*' ;\
echo ' * All done; for checksums see dist/swdb.snippet' ;\
echo ' */' ;\
)
diff --git a/build-aux/speedo.mk b/build-aux/speedo.mk
index 63209ac17..8426838ea 100644
--- a/build-aux/speedo.mk
+++ b/build-aux/speedo.mk
@@ -1,1553 +1,1557 @@
# speedo.mk - Speedo rebuilds speedily.
# Copyright (C) 2008, 2014, 2019 g10 Code GmbH
#
# speedo 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.
#
# speedo 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 this program; if not, see <http://www.gnu.org/licenses/>.
# speedo builds gnupg-related packages from GIT and installs them in a
# user directory, thereby providing a non-obstrusive test environment.
# speedo does only work with GNU make. The build system is similar to
# that of gpg4win. The following commands are supported:
#
# make -f speedo.mk all pkg2rep=/dir/with/tarballs
# or
# make -f speedo.mk
#
# Builds all packages and installs them under PLAY/inst. At the end,
# speedo prints commands that can be executed in the local shell to
# make use of the installed packages.
#
# make -f speedo.mk clean
# or
# make -f speedo.mk clean-PACKAGE
#
# Removes all packages or the package PACKAGE from the installation
# and build tree. A subsequent make will rebuild these (and only
# these) packages.
#
# make -f speedo.mk report
# or
# make -f speedo.mk report-PACKAGE
#
# Lists packages and versions.
#
# The information reyured to sign the tarballs and binaries
# are expected in the developer specific file ~/.gnupg-autogen.rc".
# Here is an example:
#--8<---------------cut here---------------start------------->8---
# # Location of the released tarball archives. Note that this is an
# # internal archive and before uploading this to the public server,
# # manual tests should be run and the git release tagged and pushed.
# # This is greped by the Makefile.
# RELEASE_ARCHIVE=foo@somehost:tarball-archive
#
# # The key used to sign the released sources.
# # This is greped by the Makefile.
# RELEASE_SIGNKEY=6DAA6E64A76D2840571B4902528897B826403ADA
#
# # For signing Windows binaries we need to employ a Windows machine.
# # We connect to this machine via ssh and take the connection
# # parameters via .ssh/config. For example a VM could be specified
# # like this:
# #
# # Host authenticode-signhost
# # HostName localhost
# # Port 27042
# # User gpgsign
# #
# # Depending on the used token it might be necessary to allow single
# # signon and unlock the token before running the make. The following
# # variable references this entry. This is greped by the Makefile.
# AUTHENTICODE_SIGNHOST=authenticode-signhost
#
# # The name of the signtool as used on Windows.
# # This is greped by the Makefile.
# AUTHENTICODE_TOOL="C:\Program Files (x86)\Windows Kits\10\bin\signtool.exe"
#
# # To use osslsigncode the follwing entries are required and
# # an empty string must be given for AUTHENTICODE_SIGNHOST.
# # They are greped by the Makefile.
# AUTHENTICODE_KEY=/home/foo/.gnupg/my-authenticode-key.p12
# AUTHENTICODE_CERTS=/home/foo/.gnupg/my-authenticode-certs.pem
#
# If a tarball has not been published while building a release it
# may be stored in a directory specified by:
# OVERRIDE_TARBALLS=/home/foo/override-tarballs
#--8<---------------cut here---------------end--------------->8---
# We need to know our own name.
SPEEDO_MK := $(realpath $(lastword $(MAKEFILE_LIST)))
.PHONY : help native native-gui w32-installer w32-source w32-wixlib
.PHONY : git-native git-native-gui git-w32-installer git-w32-source
.PHONY : this-native this-native-gui this-w32-installer this-w32-source
help:
@echo 'usage: make -f speedo.mk TARGET'
@echo ' with TARGET being one of:'
@echo ' help This help'
@echo ' native Native build of the GnuPG core'
@echo ' native-gui Ditto but with pinentry and GPA'
@echo ' w32-installer Build a Windows installer'
@echo ' w32-source Pack a source archive'
@echo ' w32-release Build a Windows release'
@echo ' w32-wixlib Build a wixlib for MSI packages'
@echo ' w32-sign-installer Sign the installer'
@echo
@echo 'You may append INSTALL_PREFIX=<dir> for native builds.'
@echo 'Prepend TARGET with "git-" to build from GIT repos.'
@echo 'Prepend TARGET with "this-" to build from the source tarball.'
@echo 'Use STATIC=1 to build with statically linked libraries.'
@echo 'Use SELFCHECK=0 for a non-released version.'
@echo 'Use CUSTOM_SWDB=1 for an already downloaded swdb.lst.'
@echo 'Use WIXPREFIX to provide the WIX binaries for the MSI package.'
@echo ' Using WIX also requires wine with installed wine mono.'
@echo ' See help-wixlib for more information'
help-wixlib:
@echo 'The buildsystem can create a wixlib to build MSI packages.'
@echo ''
@echo 'On debian install the packages "wine"'
@echo ' apt-get install wine'
@echo ''
@echo 'Download the wine-mono msi:'
@echo ' https://dl.winehq.org/wine/wine-mono/'
@echo ''
@echo 'Install it:'
@echo ' wine msiexec /i ~/Downloads/wine-mono-4.9.4.msi'
@echo ''
@echo 'Download the wix toolset binary zip from:'
@echo ' https://github.com/wixtoolset/wix3/releases'
@echo 'The default folder searches for ~/w32root/wixtools'
@echo 'Alternative locations can be passed by WIXPREFIX variable'
@echo ' unzip -d ~/w32root/wixtools ~/Downloads/wix311-binaries.zip'
@echo ''
@echo 'Afterwards w32-release will build also a wixlib.'
# NB: we can't use +$(MAKE) here because we would need to define the
# dependencies of our packages. This does not make much sense given that
# we have a clear order in how they are build and concurrent builds
# would anyway clutter up the logs.
SPEEDOMAKE := $(MAKE) -f $(SPEEDO_MK) UPD_SWDB=1
native: check-tools
$(SPEEDOMAKE) TARGETOS=native WHAT=release WITH_GUI=0 all
git-native: check-tools
$(SPEEDOMAKE) TARGETOS=native WHAT=git WITH_GUI=0 all
this-native: check-tools
$(SPEEDOMAKE) TARGETOS=native WHAT=this WITH_GUI=0 all
native-gui: check-tools
$(SPEEDOMAKE) TARGETOS=native WHAT=release WITH_GUI=1 all
git-native-gui: check-tools
$(SPEEDOMAKE) TARGETOS=native WHAT=git WITH_GUI=1 all
this-native-gui: check-tools
$(SPEEDOMAKE) TARGETOS=native WHAT=this WITH_GUI=1 all
w32-installer: check-tools
$(SPEEDOMAKE) TARGETOS=w32 WHAT=release WITH_GUI=0 installer
git-w32-installer: check-tools
$(SPEEDOMAKE) TARGETOS=w32 WHAT=git WITH_GUI=0 installer
this-w32-installer: check-tools
$(SPEEDOMAKE) TARGETOS=w32 WHAT=this WITH_GUI=0 \
CUSTOM_SWDB=1 installer
w32-wixlib: check-tools
$(SPEEDOMAKE) TARGETOS=w32 WHAT=release WITH_GUI=0 wixlib
git-w32-wixlib: check-tools
$(SPEEDOMAKE) TARGETOS=w32 WHAT=git WITH_GUI=0 wixlib
this-w32-wixlib: check-tools
$(SPEEDOMAKE) TARGETOS=w32 WHAT=this WITH_GUI=0 \
CUSTOM_SWDB=1 wixlib
w32-source: check-tools
$(SPEEDOMAKE) TARGETOS=w32 WHAT=release WITH_GUI=0 dist-source
git-w32-source: check-tools
$(SPEEDOMAKE) TARGETOS=w32 WHAT=git WITH_GUI=0 dist-source
this-w32-source: check-tools
$(SPEEDOMAKE) TARGETOS=w32 WHAT=this WITH_GUI=0 \
CUSTOM_SWDB=1 dist-source
w32-release: check-tools
$(SPEEDOMAKE) TARGETOS=w32 WHAT=release WITH_GUI=0 SELFCHECK=0 \
installer-from-source
w32-sign-installer: check-tools
$(SPEEDOMAKE) TARGETOS=w32 WHAT=release WITH_GUI=0 SELFCHECK=0 \
sign-installer
w32-release-offline: check-tools
$(SPEEDOMAKE) TARGETOS=w32 WHAT=release WITH_GUI=0 SELFCHECK=0 \
CUSTOM_SWDB=1 pkgrep=${HOME}/b pkg10rep=${HOME}/b \
installer-from-source
# Set this to "git" to build from git,
# to "release" from tarballs,
# to "this" from the unpacked sources.
WHAT=git
# Set target to "native" or "w32"
TARGETOS=
# Set to 1 to build the GUI tools
WITH_GUI=0
# Set to 1 to use a pre-installed swdb.lst instead of the online version.
CUSTOM_SWDB=0
# Set to 1 to really download the swdb.
UPD_SWDB=0
# Set to 0 to skip the GnuPG version self-check
SELFCHECK=1
# Set to 1 to build with statically linked libraries.
STATIC=0
# Set to the location of the directory with tarballs of
# external packages.
TARBALLS=$(shell pwd)/../tarballs
# Number of parallel make jobs in each package
MAKE_J=3
# Name to use for the w32 installer and sources
INST_NAME=gnupg-w32
# Use this to override the installaion directory for native builds.
INSTALL_PREFIX=none
# Set this to the location of wixtools
WIXPREFIX=$(shell readlink -f ~/w32root/wixtools)
# Read signing information from ~/.gnupg-autogen.rc
define READ_AUTOGEN_template
$(1) = $$(shell grep '^$(1)=' $$$$HOME/.gnupg-autogen.rc|cut -d= -f2)
endef
$(eval $(call READ_AUTOGEN_template,AUTHENTICODE_SIGNHOST))
$(eval $(call READ_AUTOGEN_template,AUTHENTICODE_TOOL))
$(eval $(call READ_AUTOGEN_template,AUTHENTICODE_KEY))
$(eval $(call READ_AUTOGEN_template,AUTHENTICODE_CERTS))
$(eval $(call READ_AUTOGEN_template,OSSLSIGNCODE))
$(eval $(call READ_AUTOGEN_template,OSSLPKCS11ENGINE))
$(eval $(call READ_AUTOGEN_template,SCUTEMODULE))
$(eval $(call READ_AUTOGEN_template,OVERRIDE_TARBALLS))
# All files given in AUTHENTICODE_FILES are signed before
# they are put into the installer.
AUTHENTICODE_FILES= \
dirmngr.exe \
dirmngr_ldap.exe \
gpg-agent.exe \
gpg-connect-agent.exe \
gpg-preset-passphrase.exe \
gpg-check-pattern.exe \
gpg-wks-client.exe \
gpg.exe \
gpgconf.exe \
gpgconf-w32.exe \
gpgme-w32spawn.exe \
gpgsm.exe \
gpgtar.exe \
gpgv.exe \
libassuan-0.dll \
libgcrypt-20.dll \
libgpg-error-0.dll \
libgpgme-11.dll \
libksba-8.dll \
libnpth-0.dll \
libsqlite3-0.dll \
pinentry-w32.exe \
scdaemon.exe \
zlib1.dll
# Directory names.
# They must be absolute, as we switch directories pretty often.
root := $(shell pwd)/PLAY
sdir := $(root)/src
bdir := $(root)/build
bdir6:= $(root)/build-w64
ifeq ($(INSTALL_PREFIX),none)
idir := $(root)/inst
else
idir := $(abspath $(INSTALL_PREFIX))
endif
idir6:= $(root)/inst-w64
stampdir := $(root)/stamps
topsrc := $(shell cd $(dir $(SPEEDO_MK)).. && pwd)
auxsrc := $(topsrc)/build-aux/speedo
patdir := $(topsrc)/build-aux/speedo/patches
w32src := $(topsrc)/build-aux/speedo/w32
# =====BEGIN LIST OF PACKAGES=====
# The packages that should be built. The order is also the build order.
# Fixme: Do we need to build pkg-config for cross-building?
speedo_spkgs = \
libgpg-error npth libgcrypt
ifeq ($(TARGETOS),w32)
speedo_spkgs += \
zlib bzip2 sqlite
ifeq ($(WITH_GUI),1)
speedo_spkgs += gettext libiconv
endif
endif
speedo_spkgs += \
libassuan libksba
ifeq ($(TARGETOS),w32)
speedo_spkgs += \
ntbtls
endif
speedo_spkgs += \
gnupg
ifeq ($(TARGETOS),w32)
ifeq ($(WITH_GUI),1)
speedo_spkgs += \
libffi glib pkg-config
endif
endif
ifeq ($(STATIC),0)
speedo_spkgs += \
gpgme
endif
ifeq ($(TARGETOS),w32)
ifeq ($(WITH_GUI),1)
speedo_spkgs += \
libpng \
gdk-pixbuf atk pixman cairo pango gtk+
endif
endif
ifeq ($(TARGETOS),w32)
speedo_spkgs += pinentry
ifeq ($(WITH_GUI),1)
speedo_spkgs += gpa gpgex
endif
else
ifeq ($(WITH_GUI),1)
speedo_spkgs += pinentry gpa
endif
endif
# =====END LIST OF PACKAGES=====
# Packages which are additionally build for 64 bit Windows. They are
# only used for gpgex and thus we need to build them only if we want
# a full installer.
speedo_w64_spkgs =
ifeq ($(WITH_GUI),1)
speedo_w64_spkgs += libgpg-error libiconv gettext libassuan gpgex
endif
# Packages which use the gnupg autogen.sh build style
speedo_gnupg_style = \
libgpg-error npth libgcrypt \
libassuan libksba ntbtls gnupg gpgme \
pinentry gpa gpgex
# Packages which use only make and no build directory
speedo_make_only_style = \
zlib bzip2
# Get the content of the software DB.
ifeq ($(CUSTOM_SWDB),1)
getswdb_options = --skip-download --skip-verify
else
getswdb_options =
endif
ifeq ($(SELFCHECK),0)
getswdb_options += --skip-selfcheck
endif
ifeq ($(UPD_SWDB),1)
SWDB := $(shell $(topsrc)/build-aux/getswdb.sh $(getswdb_options) && echo okay)
ifeq ($(strip $(SWDB)),)
ifneq ($(WHAT),git)
$(error Error getting GnuPG software version database)
endif
endif
# Version numbers of the released packages
gnupg_ver_this = $(shell cat $(topsrc)/VERSION)
gnupg_ver := $(shell awk '$$1=="gnupg22_ver" {print $$2}' swdb.lst)
libgpg_error_ver := $(shell awk '$$1=="libgpg_error_ver" {print $$2}' swdb.lst)
libgpg_error_sha1:= $(shell awk '$$1=="libgpg_error_sha1" {print $$2}' swdb.lst)
libgpg_error_sha2:= $(shell awk '$$1=="libgpg_error_sha2" {print $$2}' swdb.lst)
npth_ver := $(shell awk '$$1=="npth_ver" {print $$2}' swdb.lst)
npth_sha1 := $(shell awk '$$1=="npth_sha1" {print $$2}' swdb.lst)
npth_sha2 := $(shell awk '$$1=="npth_sha2" {print $$2}' swdb.lst)
libgcrypt_ver := $(shell awk '$$1=="libgcrypt18_ver" {print $$2}' swdb.lst)
libgcrypt_sha1 := $(shell awk '$$1=="libgcrypt18_sha1" {print $$2}' swdb.lst)
libgcrypt_sha2 := $(shell awk '$$1=="libgcrypt18_sha2" {print $$2}' swdb.lst)
libassuan_ver := $(shell awk '$$1=="libassuan_ver" {print $$2}' swdb.lst)
libassuan_sha1 := $(shell awk '$$1=="libassuan_sha1" {print $$2}' swdb.lst)
libassuan_sha2 := $(shell awk '$$1=="libassuan_sha2" {print $$2}' swdb.lst)
libksba_ver := $(shell awk '$$1=="libksba_ver" {print $$2}' swdb.lst)
libksba_sha1 := $(shell awk '$$1=="libksba_sha1" {print $$2}' swdb.lst)
libksba_sha2 := $(shell awk '$$1=="libksba_sha2" {print $$2}' swdb.lst)
ntbtls_ver := $(shell awk '$$1=="ntbtls_ver" {print $$2}' swdb.lst)
ntbtls_sha1 := $(shell awk '$$1=="ntbtls_sha1" {print $$2}' swdb.lst)
ntbtls_sha2 := $(shell awk '$$1=="ntbtls_sha2" {print $$2}' swdb.lst)
gpgme_ver := $(shell awk '$$1=="gpgme_ver" {print $$2}' swdb.lst)
gpgme_sha1 := $(shell awk '$$1=="gpgme_sha1" {print $$2}' swdb.lst)
gpgme_sha2 := $(shell awk '$$1=="gpgme_sha2" {print $$2}' swdb.lst)
pinentry_ver := $(shell awk '$$1=="pinentry_ver" {print $$2}' swdb.lst)
pinentry_sha1 := $(shell awk '$$1=="pinentry_sha1" {print $$2}' swdb.lst)
pinentry_sha2 := $(shell awk '$$1=="pinentry_sha2" {print $$2}' swdb.lst)
gpa_ver := $(shell awk '$$1=="gpa_ver" {print $$2}' swdb.lst)
gpa_sha1 := $(shell awk '$$1=="gpa_sha1" {print $$2}' swdb.lst)
gpa_sha2 := $(shell awk '$$1=="gpa_sha2" {print $$2}' swdb.lst)
gpgex_ver := $(shell awk '$$1=="gpgex_ver" {print $$2}' swdb.lst)
gpgex_sha1 := $(shell awk '$$1=="gpgex_sha1" {print $$2}' swdb.lst)
gpgex_sha2 := $(shell awk '$$1=="gpgex_sha2" {print $$2}' swdb.lst)
zlib_ver := $(shell awk '$$1=="zlib_ver" {print $$2}' swdb.lst)
zlib_sha1 := $(shell awk '$$1=="zlib_sha1_gz" {print $$2}' swdb.lst)
zlib_sha2 := $(shell awk '$$1=="zlib_sha2_gz" {print $$2}' swdb.lst)
bzip2_ver := $(shell awk '$$1=="bzip2_ver" {print $$2}' swdb.lst)
bzip2_sha1 := $(shell awk '$$1=="bzip2_sha1_gz" {print $$2}' swdb.lst)
bzip2_sha2 := $(shell awk '$$1=="bzip2_sha2_gz" {print $$2}' swdb.lst)
sqlite_ver := $(shell awk '$$1=="sqlite_ver" {print $$2}' swdb.lst)
sqlite_sha1 := $(shell awk '$$1=="sqlite_sha1_gz" {print $$2}' swdb.lst)
sqlite_sha2 := $(shell awk '$$1=="sqlite_sha2_gz" {print $$2}' swdb.lst)
$(info Information from the version database)
$(info GnuPG ..........: $(gnupg_ver) (building $(gnupg_ver_this)))
$(info Libgpg-error ...: $(libgpg_error_ver))
$(info Npth ...........: $(npth_ver))
$(info Libgcrypt ......: $(libgcrypt_ver))
$(info Libassuan ......: $(libassuan_ver))
$(info Libksba ........: $(libksba_ver))
$(info Zlib ...........: $(zlib_ver))
$(info Bzip2 ..........: $(bzip2_ver))
$(info SQLite .........: $(sqlite_ver))
$(info NtbTLS .. ......: $(ntbtls_ver))
$(info GPGME ..........: $(gpgme_ver))
$(info Pinentry .......: $(pinentry_ver))
$(info GPA ............: $(gpa_ver))
$(info GpgEX.... ......: $(gpgex_ver))
endif
# Version number for external packages
pkg_config_ver = 0.23
libiconv_ver = 1.14
gettext_ver = 0.18.2.1
libffi_ver = 3.0.13
glib_ver = 2.34.3
libpng_ver = 1.4.12
gdk_pixbuf_ver = 2.26.5
atk_ver = 1.32.0
pango_ver = 1.29.4
pixman_ver = 0.32.4
cairo_ver = 1.12.16
gtk__ver = 2.24.17
# The GIT repository. Using a local repo is much faster.
#gitrep = git://git.gnupg.org
gitrep = ${HOME}/s
# The tarball directories
pkgrep = https://gnupg.org/ftp/gcrypt
pkg10rep = ftp://ftp.g10code.com/g10code
pkg2rep = $(TARBALLS)
# For each package, the following variables can be defined:
#
# speedo_pkg_PACKAGE_git: The GIT repository that should be built.
# speedo_pkg_PACKAGE_gitref: The GIT revision to checkout
#
# speedo_pkg_PACKAGE_tar: URL to the tar file that should be built.
#
# Exactly one of the above variables is required. Note that this
# version of speedo does not cache repositories or tar files, and does
# not test the integrity of the downloaded software. If you care
# about this, you can also specify filenames to locally verified files.
# Filenames are differentiated from URLs by starting with a slash '/'.
#
# speedo_pkg_PACKAGE_configure: Extra arguments to configure.
#
# speedo_pkg_PACKAGE_make_args: Extra arguments to make.
#
# speedo_pkg_PACKAGE_make_args_inst: Extra arguments to make install.
#
# Note that you can override the defaults in this file in a local file
# "config.mk"
ifeq ($(WHAT),this)
else ifeq ($(WHAT),git)
speedo_pkg_libgpg_error_git = $(gitrep)/libgpg-error
speedo_pkg_libgpg_error_gitref = master
speedo_pkg_npth_git = $(gitrep)/npth
speedo_pkg_npth_gitref = master
speedo_pkg_libassuan_git = $(gitrep)/libassuan
speedo_pkg_libassuan_gitref = master
speedo_pkg_libgcrypt_git = $(gitrep)/libgcrypt
speedo_pkg_libgcrypt_gitref = master
speedo_pkg_libksba_git = $(gitrep)/libksba
speedo_pkg_libksba_gitref = master
speedo_pkg_ntbtls_git = $(gitrep)/ntbtls
speedo_pkg_ntbtls_gitref = master
speedo_pkg_gpgme_git = $(gitrep)/gpgme
speedo_pkg_gpgme_gitref = master
speedo_pkg_pinentry_git = $(gitrep)/pinentry
speedo_pkg_pinentry_gitref = master
speedo_pkg_gpa_git = $(gitrep)/gpa
speedo_pkg_gpa_gitref = master
speedo_pkg_gpgex_git = $(gitrep)/gpgex
speedo_pkg_gpgex_gitref = master
else ifeq ($(WHAT),release)
speedo_pkg_libgpg_error_tar = \
$(pkgrep)/libgpg-error/libgpg-error-$(libgpg_error_ver).tar.bz2
speedo_pkg_npth_tar = \
$(pkgrep)/npth/npth-$(npth_ver).tar.bz2
speedo_pkg_libassuan_tar = \
$(pkgrep)/libassuan/libassuan-$(libassuan_ver).tar.bz2
speedo_pkg_libgcrypt_tar = \
$(pkgrep)/libgcrypt/libgcrypt-$(libgcrypt_ver).tar.bz2
speedo_pkg_libksba_tar = \
$(pkgrep)/libksba/libksba-$(libksba_ver).tar.bz2
speedo_pkg_ntbtls_tar = \
$(pkgrep)/ntbtls/ntbtls-$(ntbtls_ver).tar.bz2
speedo_pkg_gpgme_tar = \
$(pkgrep)/gpgme/gpgme-$(gpgme_ver).tar.bz2
speedo_pkg_pinentry_tar = \
$(pkgrep)/pinentry/pinentry-$(pinentry_ver).tar.bz2
speedo_pkg_gpa_tar = \
$(pkgrep)/gpa/gpa-$(gpa_ver).tar.bz2
speedo_pkg_gpgex_tar = \
$(pkg10rep)/gpgex/gpgex-$(gpgex_ver).tar.bz2
else
$(error invalid value for WHAT (use on of: git release this))
endif
speedo_pkg_pkg_config_tar = $(pkg2rep)/pkg-config-$(pkg_config_ver).tar.gz
speedo_pkg_zlib_tar = $(pkgrep)/zlib/zlib-$(zlib_ver).tar.gz
speedo_pkg_bzip2_tar = $(pkgrep)/bzip2/bzip2-$(bzip2_ver).tar.gz
speedo_pkg_sqlite_tar = $(pkgrep)/sqlite/sqlite-autoconf-$(sqlite_ver).tar.gz
speedo_pkg_libiconv_tar = $(pkg2rep)/libiconv-$(libiconv_ver).tar.gz
speedo_pkg_gettext_tar = $(pkg2rep)/gettext-$(gettext_ver).tar.gz
speedo_pkg_libffi_tar = $(pkg2rep)/libffi-$(libffi_ver).tar.gz
speedo_pkg_glib_tar = $(pkg2rep)/glib-$(glib_ver).tar.xz
speedo_pkg_libpng_tar = $(pkg2rep)/libpng-$(libpng_ver).tar.bz2
speedo_pkg_gdk_pixbuf_tar = $(pkg2rep)/gdk-pixbuf-$(gdk_pixbuf_ver).tar.xz
speedo_pkg_atk_tar = $(pkg2rep)/atk-$(atk_ver).tar.bz2
speedo_pkg_pango_tar = $(pkg2rep)/pango-$(pango_ver).tar.bz2
speedo_pkg_pixman_tar = $(pkg2rep)/pixman-$(pixman_ver).tar.gz
speedo_pkg_cairo_tar = $(pkg2rep)/cairo-$(cairo_ver).tar.xz
speedo_pkg_gtk__tar = $(pkg2rep)/gtk+-$(gtk__ver).tar.xz
#
# Package build options
#
speedo_pkg_npth_configure = --enable-static
speedo_pkg_libgpg_error_configure = --enable-static --enable-install-gpg-error-config
speedo_pkg_w64_libgpg_error_configure = --enable-static --enable-install-gpg-error-config
speedo_pkg_libassuan_configure = --enable-static
speedo_pkg_w64_libassuan_configure = --enable-static
speedo_pkg_libgcrypt_configure = --disable-static
speedo_pkg_libksba_configure = --disable-static
speedo_pkg_ntbtls_configure = --enable-static
ifeq ($(STATIC),1)
speedo_pkg_npth_configure += --disable-shared
speedo_pkg_libgpg_error_configure += --disable-shared
speedo_pkg_libassuan_configure += --disable-shared
speedo_pkg_libgcrypt_configure += --disable-shared
speedo_pkg_libksba_configure += --disable-shared
endif
# For now we build ntbtls only static
speedo_pkg_ntbtls_configure = --disable-shared
ifeq ($(TARGETOS),w32)
speedo_pkg_gnupg_configure = \
--disable-g13 --enable-ntbtls
else
speedo_pkg_gnupg_configure = --disable-g13 --enable-wks-tools
endif
speedo_pkg_gnupg_extracflags = -g
# Create the version info files only for W32 so that they won't get
# installed if for example INSTALL_PREFIX=/usr/local is used.
ifeq ($(TARGETOS),w32)
define speedo_pkg_gnupg_post_install
(set -e; \
sed -n 's/.*PACKAGE_VERSION "\(.*\)"/\1/p' config.h >$(idir)/INST_VERSION; \
sed -n 's/.*W32INFO_VI_PRODUCTVERSION \(.*\)/\1/p' common/w32info-rc.h \
|sed 's/,/./g' >$(idir)/INST_PROD_VERSION )
endef
endif
# The LDFLAGS is needed for -lintl for glib.
ifeq ($(WITH_GUI),1)
speedo_pkg_gpgme_configure = \
--enable-static --enable-w32-glib \
--with-gpg-error-prefix=$(idir) \
LDFLAGS=-L$(idir)/lib
else
speedo_pkg_gpgme_configure = \
--disable-static --disable-w32-glib \
--with-gpg-error-prefix=$(idir) \
LDFLAGS=-L$(idir)/lib
endif
ifeq ($(TARGETOS),w32)
speedo_pkg_pinentry_configure = --disable-pinentry-gtk2
else
speedo_pkg_pinentry_configure = --enable-pinentry-gtk2
endif
speedo_pkg_pinentry_configure += \
--disable-pinentry-qt5 \
--disable-pinentry-qt \
--disable-pinentry-fltk \
--disable-pinentry-tty \
CPPFLAGS=-I$(idir)/include \
LDFLAGS=-L$(idir)/lib \
CXXFLAGS=-static-libstdc++
speedo_pkg_gpa_configure = \
--with-libiconv-prefix=$(idir) --with-libintl-prefix=$(idir) \
--with-gpgme-prefix=$(idir) --with-zlib=$(idir) \
--with-libassuan-prefix=$(idir) --with-gpg-error-prefix=$(idir)
speedo_pkg_gpgex_configure = \
--with-gpg-error-prefix=$(idir) \
--with-libassuan-prefix=$(idir) \
--enable-gpa-only
speedo_pkg_w64_gpgex_configure = \
--with-gpg-error-prefix=$(idir6) \
--with-libassuan-prefix=$(idir6) \
--enable-gpa-only
#
# External packages
#
# gcc 10.2 takes __udivdi3 from the exception handler DLL and thus
# requires it. This is a regression from gcc 8.3 and earlier. To fix
# this we need to pass -static-libgcc.
ifeq ($(TARGETOS),w32)
speedo_pkg_zlib_make_args = \
-fwin32/Makefile.gcc PREFIX=$(host)- IMPLIB=libz.dll.a \
LDFLAGS=-static-libgcc
speedo_pkg_zlib_make_args_inst = \
-fwin32/Makefile.gcc \
BINARY_PATH=$(idir)/bin INCLUDE_PATH=$(idir)/include \
LIBRARY_PATH=$(idir)/lib SHARED_MODE=1 IMPLIB=libz.dll.a
# Zlib needs some special magic to generate a libtool file.
# We also install the pc file here.
define speedo_pkg_zlib_post_install
(set -e; mkdir $(idir)/lib/pkgconfig || true; \
cp $(auxsrc)/zlib.pc $(idir)/lib/pkgconfig/; \
cd $(idir); \
echo "# Generated by libtool" > lib/libz.la \
echo "dlname='../bin/zlib1.dll'" >> lib/libz.la; \
echo "library_names='libz.dll.a'" >> lib/libz.la; \
echo "old_library='libz.a'" >> lib/libz.la; \
echo "dependency_libs=''" >> lib/libz.la; \
echo "current=1" >> lib/libz.la; \
echo "age=2" >> lib/libz.la; \
echo "revision=5" >> lib/libz.la; \
echo "installed=yes" >> lib/libz.la; \
echo "shouldnotlink=no" >> lib/libz.la; \
echo "dlopen=''" >> lib/libz.la; \
echo "dlpreopen=''" >> lib/libz.la; \
echo "libdir=\"$(idir)/lib\"" >> lib/libz.la)
endef
endif
ifeq ($(TARGETOS),w32)
speedo_pkg_bzip2_make_args = \
CC="$(host)-gcc" AR="$(host)-ar" RANLIB="$(host)-ranlib"
speedo_pkg_bzip2_make_args_inst = \
PREFIX=$(idir) CC="$(host)-gcc" AR="$(host)-ar" RANLIB="$(host)-ranlib"
endif
speedo_pkg_w64_libiconv_configure = \
--enable-shared=no --enable-static=yes
speedo_pkg_gettext_configure = \
--with-lib-prefix=$(idir) --with-libiconv-prefix=$(idir) \
CPPFLAGS=-I$(idir)/include LDFLAGS=-L$(idir)/lib
speedo_pkg_w64_gettext_configure = \
--with-lib-prefix=$(idir) --with-libiconv-prefix=$(idir) \
CPPFLAGS=-I$(idir6)/include LDFLAGS=-L$(idir6)/lib
speedo_pkg_gettext_extracflags = -O2
# We only need gettext-runtime and there is sadly no top level
# configure option for this
speedo_pkg_gettext_make_dir = gettext-runtime
speedo_pkg_glib_configure = \
--disable-modular-tests \
--with-libiconv=gnu \
CPPFLAGS=-I$(idir)/include \
LDFLAGS=-L$(idir)/lib \
CCC=$(host)-g++ \
LIBFFI_CFLAGS=-I$(idir)/lib/libffi-$(libffi_ver)/include \
LIBFFI_LIBS=\"-L$(idir)/lib -lffi\"
ifeq ($(TARGETOS),w32)
speedo_pkg_glib_extracflags = -march=i486
endif
ifeq ($(TARGETOS),w32)
speedo_pkg_libpng_configure = \
CPPFLAGS=\"-I$(idir)/include -DPNG_BUILD_DLL\" \
LDFLAGS=\"-L$(idir)/lib\" LIBPNG_DEFINES=\"-DPNG_BUILD_DLL\"
else
speedo_pkg_libpng_configure = \
CPPFLAGS=\"-I$(idir)/include\" \
LDFLAGS=\"-L$(idir)/lib\"
endif
ifneq ($(TARGETOS),w32)
speedo_pkg_gdk_pixbuf_configure = --without-libtiff --without-libjpeg
endif
speedo_pkg_pixman_configure = \
CPPFLAGS=-I$(idir)/include \
LDFLAGS=-L$(idir)/lib
ifeq ($(TARGETOS),w32)
speedo_pkg_cairo_configure = \
--disable-qt --disable-ft --disable-fc \
--enable-win32 --enable-win32-font \
CPPFLAGS=-I$(idir)/include \
LDFLAGS=-L$(idir)/lib
else
speedo_pkg_cairo_configure = \
--disable-qt \
CPPFLAGS=-I$(idir)/include \
LDFLAGS=-L$(idir)/lib
endif
speedo_pkg_pango_configure = \
--disable-gtk-doc \
CPPFLAGS=-I$(idir)/include \
LDFLAGS=-L$(idir)/lib
speedo_pkg_gtk__configure = \
--disable-cups \
CPPFLAGS=-I$(idir)/include \
LDFLAGS=-L$(idir)/lib
# ---------
all: all-speedo
report: report-speedo
clean: clean-speedo
ifeq ($(TARGETOS),w32)
STRIP = i686-w64-mingw32-strip
else
STRIP = strip
endif
W32CC = i686-w64-mingw32-gcc
-include config.mk
#
# The generic speedo code
#
MKDIR=mkdir
MAKENSIS=makensis
WINE=wine
SHA1SUM := $(shell $(topsrc)/build-aux/getswdb.sh --find-sha1sum)
ifeq ($(SHA1SUM),false)
$(error The sha1sum tool is missing)
endif
SHA2SUM := $(shell $(topsrc)/build-aux/getswdb.sh --find-sha256sum)
ifeq ($(SHA2SUM),false)
$(error The sha256sum tool is missing)
endif
BUILD_ISODATE=$(shell date -u +%Y-%m-%d)
BUILD_DATESTR=$(subst -,,$(BUILD_ISODATE))
# The next two macros will work only after gnupg has been build.
ifeq ($(TARGETOS),w32)
INST_VERSION=$(shell head -1 $(idir)/INST_VERSION)
INST_PROD_VERSION=$(shell head -1 $(idir)/INST_PROD_VERSION)
endif
# List with packages
speedo_build_list = $(speedo_spkgs)
speedo_w64_build_list = $(speedo_w64_spkgs)
# To avoid running external commands during the read phase (":=" style
# assignments), we check that the targetos has been given
ifneq ($(TARGETOS),)
# Determine build and host system
build := $(shell $(topsrc)/autogen.sh --silent --print-build)
ifeq ($(TARGETOS),w32)
speedo_autogen_buildopt := --build-w32
speedo_autogen_buildopt6 := --build-w64
host := $(shell $(topsrc)/autogen.sh --silent --print-host --build-w32)
host6:= $(shell $(topsrc)/autogen.sh --silent --print-host --build-w64)
speedo_host_build_option := --host=$(host) --build=$(build)
speedo_host_build_option6 := --host=$(host6) --build=$(build)
speedo_w32_cflags := -mms-bitfields
else
speedo_autogen_buildopt :=
host :=
speedo_host_build_option :=
speedo_w32_cflags :=
endif
ifeq ($(MAKE_J),)
speedo_makeopt=
else
speedo_makeopt=-j$(MAKE_J)
endif
# End non-empty TARGETOS
endif
# The playground area is our scratch area, where we unpack, build and
# install the packages.
$(stampdir)/stamp-directories:
$(MKDIR) -p $(root)
$(MKDIR) -p $(stampdir)
$(MKDIR) -p $(sdir)
$(MKDIR) -p $(bdir)
$(MKDIR) -p $(idir)
ifeq ($(TARGETOS),w32)
$(MKDIR) -p $(bdir6)
$(MKDIR) -p $(idir6)
endif
touch $(stampdir)/stamp-directories
# Frob the name $1 by converting all '-' and '+' characters to '_'.
define FROB_macro
$(subst +,_,$(subst -,_,$(1)))
endef
# Get the variable $(1) (which may contain '-' and '+' characters).
define GETVAR
$($(call FROB_macro,$(1)))
endef
# Set a couple of common variables.
define SETVARS
pkg="$(1)"; \
git="$(call GETVAR,speedo_pkg_$(1)_git)"; \
gitref="$(call GETVAR,speedo_pkg_$(1)_gitref)"; \
tar="$(call GETVAR,speedo_pkg_$(1)_tar)"; \
ver="$(call GETVAR,$(1)_ver)"; \
sha2="$(call GETVAR,$(1)_sha2)"; \
sha1="$(call GETVAR,$(1)_sha1)"; \
pkgsdir="$(sdir)/$(1)"; \
if [ "$(1)" = "gnupg" ]; then \
git=''; \
gitref=''; \
tar=''; \
pkgsdir="$(topsrc)"; \
fi; \
pkgbdir="$(bdir)/$(1)"; \
pkgcfg="$(call GETVAR,speedo_pkg_$(1)_configure)"; \
tmp="$(speedo_w32_cflags) \
$(call GETVAR,speedo_pkg_$(1)_extracflags)"; \
if [ x$$$$(echo "$$$$tmp" | tr -d '[:space:]')x != xx ]; then \
pkgextracflags="CFLAGS=\"$$$$tmp\""; \
else \
pkgextracflags=; \
fi; \
pkgmkdir="$(call GETVAR,speedo_pkg_$(1)_make_dir)"; \
pkgmkargs="$(call GETVAR,speedo_pkg_$(1)_make_args)"; \
pkgmkargs_inst="$(call GETVAR,speedo_pkg_$(1)_make_args_inst)"; \
pkgmkargs_uninst="$(call GETVAR,speedo_pkg_$(1)_make_args_uninst)"; \
export PKG_CONFIG="/usr/bin/pkg-config"; \
export PKG_CONFIG_PATH="$(idir)/lib/pkgconfig"; \
[ "$(TARGETOS)" != native ] && export PKG_CONFIG_LIBDIR=""; \
export SYSROOT="$(idir)"; \
export PATH="$(idir)/bin:$${PATH}"; \
export LD_LIBRARY_PATH="$(idir)/lib:$${LD_LIBRARY_PATH}"
endef
define SETVARS_W64
pkg="$(1)"; \
git="$(call GETVAR,speedo_pkg_$(1)_git)"; \
gitref="$(call GETVAR,speedo_pkg_$(1)_gitref)"; \
tar="$(call GETVAR,speedo_pkg_$(1)_tar)"; \
ver="$(call GETVAR,$(1)_ver)"; \
sha2="$(call GETVAR,$(1)_sha2)"; \
sha1="$(call GETVAR,$(1)_sha1)"; \
pkgsdir="$(sdir)/$(1)"; \
if [ "$(1)" = "gnupg" ]; then \
git=''; \
gitref=''; \
tar=''; \
pkgsdir="$(topsrc)"; \
fi; \
pkgbdir="$(bdir6)/$(1)"; \
pkgcfg="$(call GETVAR,speedo_pkg_w64_$(1)_configure)"; \
tmp="$(speedo_w32_cflags) \
$(call GETVAR,speedo_pkg_$(1)_extracflags)"; \
if [ x$$$$(echo "$$$$tmp" | tr -d '[:space:]')x != xx ]; then \
pkgextracflags="CFLAGS=\"$$$$tmp\""; \
else \
pkgextracflags=; \
fi; \
pkgmkdir="$(call GETVAR,speedo_pkg_$(1)_make_dir)"; \
pkgmkargs="$(call GETVAR,speedo_pkg_$(1)_make_args)"; \
pkgmkargs_inst="$(call GETVAR,speedo_pkg_$(1)_make_args_inst)"; \
pkgmkargs_uninst="$(call GETVAR,speedo_pkg_$(1)_make_args_uninst)"; \
export PKG_CONFIG="/usr/bin/pkg-config"; \
export PKG_CONFIG_PATH="$(idir6)/lib/pkgconfig"; \
[ "$(TARGETOS)" != native ] && export PKG_CONFIG_LIBDIR=""; \
export SYSROOT="$(idir6)"; \
export PATH="$(idir6)/bin:$${PATH}"; \
export LD_LIBRARY_PATH="$(idir6)/lib:$${LD_LIBRARY_PATH}"
endef
# Template for source packages.
# Note that the gnupg package is special: The package source dir is
# the same as the topsrc dir and thus we need to detect the gnupg
# package and cd to that directory. We also test that no in-source build
# has been done. autogen.sh is not run for gnupg.
#
define SPKG_template
$(stampdir)/stamp-$(1)-00-unpack:
@echo "speedo: /*"
@echo "speedo: * $(1)"
@echo "speedo: */"
@(set -e; cd $(sdir); \
$(call SETVARS,$(1)); \
if [ "$(WHAT)" = "this" ]; then \
echo "speedo: using included source"; \
elif [ "$(1)" = "gnupg" ]; then \
cd $$$${pkgsdir}; \
if [ -f config.log ]; then \
echo "GnuPG has already been build in-source" >&2 ;\
echo "Please run \"make distclean\" and retry" >&2 ;\
exit 1 ; \
fi; \
echo "speedo: unpacking gnupg not needed"; \
elif [ -n "$$$${git}" ]; then \
echo "speedo: unpacking $(1) from $$$${git}:$$$${gitref}"; \
git clone -b "$$$${gitref}" "$$$${git}" "$$$${pkg}"; \
cd "$$$${pkg}"; \
AUTOGEN_SH_SILENT=1 ./autogen.sh; \
elif [ -n "$$$${tar}" ]; then \
tar2="$(OVERRIDE_TARBALLS)/$$$$(basename $$$${tar})";\
if [ -f "$$$${tar2}" ]; then \
tar="$$$$tar2"; \
echo "speedo: /*"; \
echo "speedo: * Note: using an override"; \
echo "speedo: */"; \
fi; \
echo "speedo: unpacking $(1) from $$$${tar}"; \
case "$$$${tar}" in \
*.gz) pretar=zcat ;; \
*.bz2) pretar=bzcat ;; \
*.xz) pretar=xzcat ;; \
*) pretar=cat ;; \
esac; \
[ -f tmp.tgz ] && rm tmp.tgz; \
case "$$$${tar}" in \
/*) $$$${pretar} < $$$${tar} | tar xf - ;; \
*) wget -q -O - $$$${tar} | tee tmp.tgz \
| $$$${pretar} | tar x$$$${opt}f - ;; \
esac; \
if [ -f tmp.tgz ]; then \
if [ -n "$$$${sha2}" ]; then \
tmp=$$$$($(SHA2SUM) <tmp.tgz|cut -d' ' -f1);\
if [ "$$$${tmp}" != "$$$${sha2}" ]; then \
echo "speedo:"; \
echo "speedo: ERROR: SHA-256 checksum mismatch for $(1)";\
echo "speedo:"; \
exit 1; \
fi; \
elif [ -n "$$$${sha1}" ]; then \
tmp=$$$$($(SHA1SUM) <tmp.tgz|cut -d' ' -f1);\
if [ "$$$${tmp}" != "$$$${sha1}" ]; then \
echo "speedo:"; \
echo "speedo: ERROR: SHA-1 checksum mismatch for $(1)";\
echo "speedo:"; \
exit 1; \
fi; \
else \
echo "speedo:"; \
echo "speedo: Warning: No checksum known for $(1)";\
echo "speedo:"; \
fi; \
rm tmp.tgz; \
fi; \
base=`echo "$$$${tar}" | sed -e 's,^.*/,,' \
| sed -e 's,\.tar.*$$$$,,'`; \
mv $$$${base} $(1); \
patch="$(patdir)/$(1)-$$$${base#$(1)-}.patch";\
patchx="$(patdir)/$(1).patch"; \
if [ -x "$$$${patch}" ]; then \
echo "speedo: applying patch $$$${patch}"; \
cd $(1); "$$$${patch}"; \
elif [ -x "$$$${patchx}" ]; then \
echo "speedo: applying patch $$$${patchx}";\
cd $(1); "$$$${patchx}"; \
elif [ -f "$$$${patch}" ]; then \
echo "speedo: warning: $$$${patch} is not executable"; \
fi; \
else \
echo "speedo: unpacking $(1) from UNKNOWN"; \
fi)
@touch $(stampdir)/stamp-$(1)-00-unpack
$(stampdir)/stamp-$(1)-01-configure: $(stampdir)/stamp-$(1)-00-unpack
@echo "speedo: configuring $(1)"
ifneq ($(findstring $(1),$(speedo_make_only_style)),)
@echo "speedo: configure run not required"
else ifneq ($(findstring $(1),$(speedo_gnupg_style)),)
@($(call SETVARS,$(1)); \
mkdir "$$$${pkgbdir}"; \
cd "$$$${pkgbdir}"; \
if [ -n "$(speedo_autogen_buildopt)" ]; then \
eval AUTOGEN_SH_SILENT=1 w32root="$(idir)" \
"$$$${pkgsdir}/autogen.sh" \
$(speedo_autogen_buildopt) \
$$$${pkgcfg} $$$${pkgextracflags}; \
else \
eval "$$$${pkgsdir}/configure" \
--silent \
--enable-maintainer-mode \
--prefix="$(idir)" \
$$$${pkgcfg} $$$${pkgextracflags}; \
fi)
else
@($(call SETVARS,$(1)); \
mkdir "$$$${pkgbdir}"; \
cd "$$$${pkgbdir}"; \
eval "$$$${pkgsdir}/configure" \
--silent $(speedo_host_build_option) \
--prefix="$(idir)" \
$$$${pkgcfg} $$$${pkgextracflags}; \
)
endif
@touch $(stampdir)/stamp-$(1)-01-configure
# Note that unpack has no 64 bit version becuase it is just the source.
# Fixme: We should use templates to create the standard and w64
# version of these rules.
$(stampdir)/stamp-w64-$(1)-01-configure: $(stampdir)/stamp-$(1)-00-unpack
@echo "speedo: configuring $(1) (64 bit)"
ifneq ($(findstring $(1),$(speedo_make_only_style)),)
@echo "speedo: configure run not required"
else ifneq ($(findstring $(1),$(speedo_gnupg_style)),)
@($(call SETVARS_W64,$(1)); \
mkdir "$$$${pkgbdir}"; \
cd "$$$${pkgbdir}"; \
if [ -n "$(speedo_autogen_buildopt)" ]; then \
eval AUTOGEN_SH_SILENT=1 w64root="$(idir6)" \
"$$$${pkgsdir}/autogen.sh" \
$(speedo_autogen_buildopt6) \
$$$${pkgcfg} $$$${pkgextracflags}; \
else \
eval "$$$${pkgsdir}/configure" \
--silent \
--enable-maintainer-mode \
--prefix="$(idir6)" \
$$$${pkgcfg} $$$${pkgextracflags}; \
fi)
else
@($(call SETVARS_W64,$(1)); \
mkdir "$$$${pkgbdir}"; \
cd "$$$${pkgbdir}"; \
eval "$$$${pkgsdir}/configure" \
--silent $(speedo_host_build_option6) \
--prefix="$(idir6)" \
$$$${pkgcfg} $$$${pkgextracflags}; \
)
endif
@touch $(stampdir)/stamp-w64-$(1)-01-configure
$(stampdir)/stamp-$(1)-02-make: $(stampdir)/stamp-$(1)-01-configure
@echo "speedo: making $(1)"
ifneq ($(findstring $(1),$(speedo_make_only_style)),)
@($(call SETVARS,$(1)); \
cd "$$$${pkgsdir}"; \
test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
if test "$$$${pkg}" = zlib -a "$(TARGETOS)" != w32 ; then \
./configure --prefix="$(idir)" ; \
fi ;\
$(MAKE) --no-print-directory $(speedo_makeopt) $$$${pkgmkargs} V=0)
else
@($(call SETVARS,$(1)); \
cd "$$$${pkgbdir}"; \
test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
$(MAKE) --no-print-directory $(speedo_makeopt) $$$${pkgmkargs} V=0)
endif
@touch $(stampdir)/stamp-$(1)-02-make
$(stampdir)/stamp-w64-$(1)-02-make: $(stampdir)/stamp-w64-$(1)-01-configure
@echo "speedo: making $(1) (64 bit)"
ifneq ($(findstring $(1),$(speedo_make_only_style)),)
@($(call SETVARS_W64,$(1)); \
cd "$$$${pkgsdir}"; \
test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
$(MAKE) --no-print-directory $(speedo_makeopt) $$$${pkgmkargs} V=0)
else
@($(call SETVARS_W64,$(1)); \
cd "$$$${pkgbdir}"; \
test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
$(MAKE) --no-print-directory $(speedo_makeopt) $$$${pkgmkargs} V=0)
endif
@touch $(stampdir)/stamp-w64-$(1)-02-make
# Note that post_install must come last because it may be empty and
# "; ;" is a syntax error.
$(stampdir)/stamp-$(1)-03-install: $(stampdir)/stamp-$(1)-02-make
@echo "speedo: installing $(1)"
ifneq ($(findstring $(1),$(speedo_make_only_style)),)
@($(call SETVARS,$(1)); \
cd "$$$${pkgsdir}"; \
test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
$(MAKE) --no-print-directory $$$${pkgmkargs_inst} install V=0;\
$(call speedo_pkg_$(call FROB_macro,$(1))_post_install))
else
@($(call SETVARS,$(1)); \
cd "$$$${pkgbdir}"; \
test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
$(MAKE) --no-print-directory $$$${pkgmkargs_inst} install-strip V=0;\
$(call speedo_pkg_$(call FROB_macro,$(1))_post_install))
endif
touch $(stampdir)/stamp-$(1)-03-install
$(stampdir)/stamp-w64-$(1)-03-install: $(stampdir)/stamp-w64-$(1)-02-make
@echo "speedo: installing $(1) (64 bit)"
ifneq ($(findstring $(1),$(speedo_make_only_style)),)
@($(call SETVARS_W64,$(1)); \
cd "$$$${pkgsdir}"; \
test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
$(MAKE) --no-print-directory $$$${pkgmkargs_inst} install V=0;\
$(call speedo_pkg_$(call FROB_macro,$(1))_post_install))
else
@($(call SETVARS_W64,$(1)); \
cd "$$$${pkgbdir}"; \
test -n "$$$${pkgmkdir}" && cd "$$$${pkgmkdir}"; \
$(MAKE) --no-print-directory $$$${pkgmkargs_inst} install-strip V=0;\
$(call speedo_pkg_$(call FROB_macro,$(1))_post_install))
endif
touch $(stampdir)/stamp-w64-$(1)-03-install
$(stampdir)/stamp-final-$(1): $(stampdir)/stamp-$(1)-03-install
@($(call SETVARS,$(1)); \
printf "%-14s %-12s %s\n" $(1) "$$$${ver}" "$$$${sha1}" \
>> $(bdir)/pkg-versions.txt)
@echo "speedo: $(1) done"
@touch $(stampdir)/stamp-final-$(1)
$(stampdir)/stamp-w64-final-$(1): $(stampdir)/stamp-w64-$(1)-03-install
@echo "speedo: $(1) (64 bit) done"
@touch $(stampdir)/stamp-w64-final-$(1)
.PHONY : clean-$(1)
clean-$(1):
@echo "speedo: uninstalling $(1)"
@($(call SETVARS,$(1)); \
(cd "$$$${pkgbdir}" 2>/dev/null && \
$(MAKE) --no-print-directory \
$$$${pkgmkargs_uninst} uninstall V=0 ) || true;\
if [ "$(1)" = "gnupg" ]; then \
rm -fR "$$$${pkgbdir}" || true ;\
else \
rm -fR "$$$${pkgsdir}" "$$$${pkgbdir}" || true;\
fi)
-rm -f $(stampdir)/stamp-final-$(1) $(stampdir)/stamp-$(1)-*
.PHONY : build-$(1)
build-$(1): $(stampdir)/stamp-final-$(1)
.PHONY : report-$(1)
report-$(1):
@($(call SETVARS,$(1)); \
echo -n $(1):\ ; \
if [ -n "$$$${git}" ]; then \
if [ -e "$$$${pkgsdir}/.git" ]; then \
cd "$$$${pkgsdir}" && \
git describe ; \
else \
echo missing; \
fi \
elif [ -n "$$$${tar}" ]; then \
base=`echo "$$$${tar}" | sed -e 's,^.*/,,' \
| sed -e 's,\.tar.*$$$$,,'`; \
echo $$$${base} ; \
fi)
endef
# Insert the template for each source package.
$(foreach spkg, $(speedo_spkgs), $(eval $(call SPKG_template,$(spkg))))
$(stampdir)/stamp-final: clean-pkg-versions
ifeq ($(TARGETOS),w32)
$(stampdir)/stamp-final: $(addprefix $(stampdir)/stamp-w64-final-,$(speedo_w64_build_list))
endif
$(stampdir)/stamp-final: $(addprefix $(stampdir)/stamp-final-,$(speedo_build_list))
touch $(stampdir)/stamp-final
clean-pkg-versions:
@: >$(bdir)/pkg-versions.txt
all-speedo: $(stampdir)/stamp-final
report-speedo: $(addprefix report-,$(speedo_build_list))
# Just to check if we catched all stamps.
clean-stamps:
$(RM) -fR $(stampdir)
clean-speedo:
$(RM) -fR PLAY
#
# Windows installer
#
# {{{
ifeq ($(TARGETOS),w32)
dist-source: installer
for i in 00 01 02 03; do sleep 1;touch PLAY/stamps/stamp-*-${i}-*;done
(set -e;\
tarname="$(INST_NAME)-$(INST_VERSION)_$(BUILD_DATESTR).tar" ;\
[ -f "$$tarname" ] && rm "$$tarname" ;\
tar -C $(topsrc) -cf "$$tarname" --exclude-backups --exclude-vcs \
--transform='s,^\./,$(INST_NAME)-$(INST_VERSION)/,' \
--anchored --exclude './PLAY' . ;\
tar --totals -rf "$$tarname" --exclude-backups --exclude-vcs \
--transform='s,^,$(INST_NAME)-$(INST_VERSION)/,' \
PLAY/stamps/stamp-*-00-unpack PLAY/src swdb.lst swdb.lst.sig ;\
[ -f "$$tarname".xz ] && rm "$$tarname".xz;\
xz -T0 "$$tarname" ;\
)
# Extract the two latest news entries. */
$(bdir)/NEWS.tmp: $(topsrc)/NEWS
awk '/^Notewo/ {if(okay>1){exit}; okay++};okay {print $0}' \
<$(topsrc)/NEWS >$(bdir)/NEWS.tmp
# Sort the file with the package versions.
$(bdir)/pkg-versions.sorted: $(bdir)/pkg-versions.txt
grep -v '^gnupg ' <$(bdir)/pkg-versions.txt \
| sort | uniq >$(bdir)/pkg-versions.sorted
$(bdir)/README.txt: $(bdir)/NEWS.tmp $(topsrc)/README $(w32src)/README.txt \
$(w32src)/pkg-copyright.txt $(bdir)/pkg-versions.sorted
sed -e '/^;.*/d;' \
-e '/!NEWSFILE!/{r $(bdir)/NEWS.tmp' -e 'd;}' \
-e '/!GNUPGREADME!/{r $(topsrc)/README' -e 'd;}' \
-e '/!PKG-COPYRIGHT!/{r $(w32src)/pkg-copyright.txt' -e 'd;}' \
-e '/!PKG-VERSIONS!/{r $(bdir)/pkg-versions.sorted' -e 'd;}' \
-e 's,!VERSION!,$(INST_VERSION),g' \
< $(w32src)/README.txt \
| sed -e '/^#/d' \
| awk '{printf "%s\r\n", $$0}' >$(bdir)/README.txt
-$(bdir)/g4wihelp.dll: $(w32src)/g4wihelp.c $(w32src)/exdll.h
+$(bdir)/g4wihelp.dll: $(w32src)/g4wihelp.c $(w32src)/exdll.h $(w32src)/exdll.c
(set -e; cd $(bdir); \
- $(W32CC) -I. -shared -O2 -o g4wihelp.dll $(w32src)/g4wihelp.c \
- -lwinmm -lgdi32; \
+ $(W32CC) -DUNICODE -static-libgcc -I . -O2 -c \
+ -o exdll.o $(w32src)/exdll.c; \
+ $(W32CC) -DUNICODE -static-libgcc -I. -shared -O2 \
+ -o g4wihelp.dll $(w32src)/g4wihelp.c exdll.o \
+ -lwinmm -lgdi32 -luserenv \
+ -lshell32 -loleaut32 -lshlwapi -lmsimg32; \
$(STRIP) g4wihelp.dll)
w32_insthelpers: $(bdir)/g4wihelp.dll
$(bdir)/inst-options.ini: $(w32src)/inst-options.ini
cat $(w32src)/inst-options.ini >$(bdir)/inst-options.ini
extra_installer_options =
ifeq ($(WITH_GUI),1)
extra_installer_options += -DWITH_GUI=1
endif
# Note that we sign only when doing the final installer.
installer: all w32_insthelpers $(w32src)/inst-options.ini $(bdir)/README.txt
(set -e;\
cd "$(idir)"; \
if echo "$(idir)" | grep -q '/PLAY-release/' ; then \
for f in $(AUTHENTICODE_FILES); do \
if [ -f "bin/$$f" ]; then \
$(call AUTHENTICODE_sign,"bin/$$f","bin/$$f");\
elif [ -f "libexec/$$f" ]; then \
$(call AUTHENTICODE_sign,"libexec/$$f","libexec/$$f");\
else \
echo "speedo: WARNING: file '$$f' not available for signing";\
fi;\
done; \
fi \
)
$(MAKENSIS) -V2 $$($(MAKENSIS) -version \
| grep -q ^v3 && echo "-INPUTCHARSET CP1252 ") \
-DINST_DIR=$(idir) \
-DINST6_DIR=$(idir6) \
-DBUILD_DIR=$(bdir) \
-DTOP_SRCDIR=$(topsrc) \
-DW32_SRCDIR=$(w32src) \
-DBUILD_ISODATE=$(BUILD_ISODATE) \
-DBUILD_DATESTR=$(BUILD_DATESTR) \
-DNAME=$(INST_NAME) \
-DVERSION=$(INST_VERSION) \
-DPROD_VERSION=$(INST_PROD_VERSION) \
$(extra_installer_options) $(w32src)/inst.nsi
@echo "Ready: $(idir)/$(INST_NAME)-$(INST_VERSION)_$(BUILD_DATESTR).exe"
# We use the installer target to ensure everything is done and signed
wixlib: installer $(bdir)/README.txt $(w32src)/wixlib.wxs
if [ -z "$$(which $(WINE))" ]; then \
echo "ERROR: For the w32-wixlib wine needs to be installed."; \
echo "ERROR: see 'help-w32-wixlib'"; \
exit 1; \
fi;
if [ ! -d "$(WIXPREFIX)" ]; then \
echo "ERROR: You must set WIXPREFIX to an installation of wixtools."; \
echo "ERROR: see 'help-w32-wixlib'"; \
exit 1; \
fi;
(if [ -z "$$WINEPREFIX" ]; then \
WINEPREFIX="$$HOME/.wine"; \
if [ ! -e "$$WINEPREFIX/dosdevices" ]; then \
echo "ERROR: No wine prefix found under $$WINEPREFIX"; \
exit 1; \
fi; \
fi; \
WINEINST=$$WINEPREFIX/dosdevices/k:; \
WINESRC=$$WINEPREFIX/dosdevices/i:; \
WINEBUILD=$$WINEPREFIX/dosdevices/j:; \
if [ -e "$$WINEINST" ]; then \
echo "ERROR: $$WINEINST already exists. Please remove."; \
exit 1; \
fi; \
if [ -e "$$WINESRC" ]; then \
echo "ERROR: $$WINESRC already exists. Please remove."; \
exit 1; \
fi; \
if [ -e "$$WINEBUILD" ]; then \
echo "ERROR: $$WINEBUILD already exists. Please remove."; \
exit 1; \
fi; \
echo "$(INST_NAME)" > $(bdir)/VERSION; \
echo "$(INST_VERSION)" >> $(bdir)/VERSION; \
MSI_VERSION=$$(echo $(INST_VERSION) | tr -s \\-beta .); \
(ln -s $(idir) $$WINEINST; \
ln -s $(w32src) $$WINESRC; \
ln -s $(bdir) $$WINEBUILD; \
$(WINE) $(WIXPREFIX)/candle.exe \
-dSourceDir=k: \
-dBuildDir=j: \
-dVersion=$$MSI_VERSION \
-out k:\\$(INST_NAME).wixobj \
-pedantic -wx i:\\wixlib.wxs ;\
$(WINE) $(WIXPREFIX)/lit.exe \
-out k:\\$(INST_NAME)-$(INST_VERSION)_$(BUILD_DATESTR).wixlib \
-bf \
-wx \
-pedantic \
k:\\$(INST_NAME).wixobj \
); \
(rm $$WINEINST; rm $$WINESRC; rm $$WINEBUILD;) \
)
define MKSWDB_commands
( pref="#+macro: gnupg22_w32_$(3)" ;\
echo "$${pref}ver $(INST_VERSION)_$(BUILD_DATESTR)" ;\
echo "$${pref}date $(2)" ;\
echo "$${pref}size $$(wc -c <$(1)|awk '{print int($$1/1024)}')k";\
echo "$${pref}sha1 $$(sha1sum <$(1)|cut -d' ' -f1)" ;\
echo "$${pref}sha2 $$(sha256sum <$(1)|cut -d' ' -f1)" ;\
) | tee $(1).swdb
endef
# Sign the file $1 and save the result as $2
define AUTHENTICODE_sign
set -e;\
if [ -n "$(AUTHENTICODE_SIGNHOST)" ]; then \
echo "speedo: Signing via host $(AUTHENTICODE_SIGNHOST)";\
scp $(1) "$(AUTHENTICODE_SIGNHOST):a.exe" ;\
ssh "$(AUTHENTICODE_SIGNHOST)" '$(AUTHENTICODE_TOOL)' sign \
/a /n '"g10 Code GmbH"' \
/tr 'http://rfc3161timestamp.globalsign.com/advanced' /td sha256 \
/fd sha256 /du https://gnupg.org a.exe ;\
scp "$(AUTHENTICODE_SIGNHOST):a.exe" $(2);\
echo "speedo: signed file is '$(2)'" ;\
elif [ "$(AUTHENTICODE_KEY)" = card ]; then \
echo "speedo: Signing using a card";\
$(OSSLSIGNCODE) sign \
-pkcs11engine $(OSSLPKCS11ENGINE) \
-pkcs11module $(SCUTEMODULE) \
-certs $(AUTHENTICODE_CERTS) \
-h sha256 -n GnuPG -i https://gnupg.org \
-ts http://rfc3161timestamp.globalsign.com/advanced \
-in $(1) -out $(2).tmp ; mv $(2).tmp $(2) ; \
elif [ -e "$(AUTHENTICODE_KEY)" ]; then \
echo "speedo: Signing using key $(AUTHENTICODE_KEY)";\
osslsigncode sign -certs $(AUTHENTICODE_CERTS) \
-pkcs12 $(AUTHENTICODE_KEY) -askpass \
-ts "http://timestamp.globalsign.com/scripts/timstamp.dll" \
-h sha256 -n GnuPG -i https://gnupg.org \
-in $(1) -out $(2) ;\
else \
echo "speedo: WARNING: Binaries are not signed"; \
fi
endef
# Help target for testing to sign a file.
# Usage: make -f speedo.mk test-authenticode-sign TARGETOS=w32 FILE=foo.exe
test-authenticode-sign:
(set -e; \
echo "Test signining of $(FILE)" ; \
$(call AUTHENTICODE_sign,"$(FILE)","$(FILE)");\
)
# Build the installer from the source tarball.
installer-from-source: dist-source
(set -e;\
[ -d PLAY-release ] && rm -rf PLAY-release; \
mkdir PLAY-release;\
cd PLAY-release; \
tar xJf "../$(INST_NAME)-$(INST_VERSION)_$(BUILD_DATESTR).tar.xz";\
cd $(INST_NAME)-$(INST_VERSION); \
$(MAKE) -f build-aux/speedo.mk this-w32-installer SELFCHECK=0;\
if [ -d "$(WIXPREFIX)" ]; then \
$(MAKE) -f build-aux/speedo.mk this-w32-wixlib SELFCHECK=0;\
fi; \
reldate="$$(date -u +%Y-%m-%d)" ;\
exefile="$(INST_NAME)-$(INST_VERSION)_$(BUILD_DATESTR).exe" ;\
cp "PLAY/inst/$$exefile" ../.. ;\
exefile="../../$$exefile" ;\
$(call MKSWDB_commands,$${exefile},$${reldate}); \
msifile="$(INST_NAME)-$(INST_VERSION)_$(BUILD_DATESTR).wixlib"; \
if [ -e "PLAY/inst/$${msifile}" ]; then \
cp "PLAY/inst/$$msifile" ../..; \
msifile="../../$$msifile" ; \
$(call MKSWDB_commands,$${msifile},$${reldate},"wixlib_"); \
fi \
)
# This target repeats some of the installer-from-source steps but it
# is intended to be called interactively, so that the passphrase can be
# entered.
sign-installer:
@(set -e; \
cd PLAY-release; \
cd $(INST_NAME)-$(INST_VERSION); \
reldate="$$(date -u +%Y-%m-%d)" ;\
exefile="$(INST_NAME)-$(INST_VERSION)_$(BUILD_DATESTR).exe" ;\
msifile="$(INST_NAME)-$(INST_VERSION)_$(BUILD_DATESTR).wixlib" ;\
echo "speedo: /*" ;\
echo "speedo: * Signing installer" ;\
echo "speedo: */" ;\
$(call AUTHENTICODE_sign,"PLAY/inst/$$exefile","../../$$exefile");\
exefile="../../$$exefile" ;\
msifile="../../$$msifile" ;\
$(call MKSWDB_commands,$${exefile},$${reldate}); \
if [ -e "$${msifile}" ]; then \
$(call MKSWDB_commands,$${msifile},$${reldate},"wixlib_"); \
fi; \
echo "speedo: /* (osslsigncode verify disabled) */" ;\
echo osslsigncode verify $${exefile} \
)
endif
# }}} W32
#
# Check availibility of standard tools and prepare everything.
#
check-tools: $(stampdir)/stamp-directories
#
# Mark phony targets
#
.PHONY: all all-speedo report-speedo clean-stamps clean-speedo installer \
w32_insthelpers check-tools clean-pkg-versions
diff --git a/build-aux/speedo/w32/exdll.c b/build-aux/speedo/w32/exdll.c
new file mode 100644
index 000000000..7815523ae
--- /dev/null
+++ b/build-aux/speedo/w32/exdll.c
@@ -0,0 +1,286 @@
+#include "exdll.h"
+
+unsigned int g_stringsize;
+stack_t **g_stacktop;
+LPTSTR g_variables;
+
+// utility functions (not required but often useful)
+
+int NSISCALL popstring(LPTSTR str)
+{
+ stack_t *th;
+ if (!g_stacktop || !*g_stacktop) return 1;
+ th=(*g_stacktop);
+ if (str) lstrcpy(str,th->text);
+ *g_stacktop = th->next;
+ GlobalFree((HGLOBAL)th);
+ return 0;
+}
+
+int NSISCALL popstringn(LPTSTR str, int maxlen)
+{
+ stack_t *th;
+ if (!g_stacktop || !*g_stacktop) return 1;
+ th=(*g_stacktop);
+ if (str) lstrcpyn(str,th->text,maxlen?maxlen:g_stringsize);
+ *g_stacktop = th->next;
+ GlobalFree((HGLOBAL)th);
+ return 0;
+}
+
+void NSISCALL pushstring(LPCTSTR str)
+{
+ stack_t *th;
+ if (!g_stacktop) return;
+ th=(stack_t*)GlobalAlloc(GPTR,(sizeof(stack_t)+(g_stringsize)*sizeof(*str)));
+ lstrcpyn(th->text,str,g_stringsize);
+ th->next=*g_stacktop;
+ *g_stacktop=th;
+}
+
+LPTSTR NSISCALL getuservariable(const int varnum)
+{
+ if (!isvalidnsisvarindex(varnum)) return NULL;
+ return (LPWSTR)((wchar_t*)g_variables+varnum*g_stringsize);
+}
+
+void NSISCALL setuservariable(const int varnum, LPCTSTR var)
+{
+ if (var && isvalidnsisvarindex(varnum))
+ lstrcpy((LPWSTR)((wchar_t*)g_variables + varnum*g_stringsize), var);
+}
+
+#ifdef UNICODE
+int NSISCALL PopStringA(LPSTR ansiStr)
+{
+ LPWSTR wideStr = (LPWSTR) GlobalAlloc(GPTR, g_stringsize*sizeof(WCHAR));
+ int rval = popstring(wideStr);
+ WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
+ GlobalFree((HGLOBAL)wideStr);
+ return rval;
+}
+
+int NSISCALL PopStringNA(LPSTR ansiStr, int maxlen)
+{
+ int realLen = maxlen ? maxlen : g_stringsize;
+ LPWSTR wideStr = (LPWSTR) GlobalAlloc(GPTR, realLen*sizeof(WCHAR));
+ int rval = popstringn(wideStr, realLen);
+ WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, realLen, NULL, NULL);
+ GlobalFree((HGLOBAL)wideStr);
+ return rval;
+}
+
+void NSISCALL PushStringA(LPCSTR ansiStr)
+{
+ LPWSTR wideStr = (LPWSTR) GlobalAlloc(GPTR, g_stringsize*sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
+ pushstring(wideStr);
+ GlobalFree((HGLOBAL)wideStr);
+ return;
+}
+
+void NSISCALL GetUserVariableW(const int varnum, LPWSTR wideStr)
+{
+ lstrcpyW(wideStr, getuservariable(varnum));
+}
+
+void NSISCALL GetUserVariableA(const int varnum, LPSTR ansiStr)
+{
+ LPWSTR wideStr = getuservariable(varnum);
+ WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
+}
+
+void NSISCALL SetUserVariableA(const int varnum, LPCSTR ansiStr)
+{
+ if (ansiStr && isvalidnsisvarindex(varnum))
+ {
+ LPWSTR wideStr = (LPWSTR)((char*)g_variables + varnum * g_stringsize);
+ MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
+ }
+}
+
+#else
+// ANSI defs
+int NSISCALL PopStringW(LPWSTR wideStr)
+{
+ LPSTR ansiStr = (LPSTR) GlobalAlloc(GPTR, g_stringsize);
+ int rval = popstring(ansiStr);
+ MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
+ GlobalFree((HGLOBAL)ansiStr);
+ return rval;
+}
+
+int NSISCALL PopStringNW(LPWSTR wideStr, int maxlen)
+{
+ int realLen = maxlen ? maxlen : g_stringsize;
+ LPSTR ansiStr = (LPSTR) GlobalAlloc(GPTR, realLen);
+ int rval = popstringn(ansiStr, realLen);
+ MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, realLen);
+ GlobalFree((HGLOBAL)ansiStr);
+ return rval;
+}
+
+void NSISCALL PushStringW(LPWSTR wideStr)
+{
+ LPSTR ansiStr = (LPSTR) GlobalAlloc(GPTR, g_stringsize);
+ WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
+ pushstring(ansiStr);
+ GlobalFree((HGLOBAL)ansiStr);
+}
+
+void NSISCALL GetUserVariableW(const int varnum, LPWSTR wideStr)
+{
+ LPSTR ansiStr = getuservariable(varnum);
+ MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
+}
+
+void NSISCALL GetUserVariableA(const int varnum, LPSTR ansiStr)
+{
+ lstrcpyA(ansiStr, getuservariable(varnum));
+}
+
+void NSISCALL SetUserVariableW(const int varnum, LPCWSTR wideStr)
+{
+ if (wideStr && isvalidnsisvarindex(varnum))
+ {
+ LPSTR ansiStr = (char*)g_variables + varnum * g_stringsize;
+ WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
+ }
+}
+#endif
+
+// playing with integers
+
+INT_PTR NSISCALL nsishelper_str_to_ptr(LPCTSTR s)
+{
+ INT_PTR v=0;
+ if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X')))
+ {
+ s++;
+ for (;;)
+ {
+ int c=*(++s);
+ if (c >= _T('0') && c <= _T('9')) c-=_T('0');
+ else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10;
+ else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10;
+ else break;
+ v<<=4;
+ v+=c;
+ }
+ }
+ else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0'))
+ {
+ for (;;)
+ {
+ int c=*(++s);
+ if (c >= _T('0') && c <= _T('7')) c-=_T('0');
+ else break;
+ v<<=3;
+ v+=c;
+ }
+ }
+ else
+ {
+ int sign=0;
+ if (*s == _T('-')) sign++; else s--;
+ for (;;)
+ {
+ int c=*(++s) - _T('0');
+ if (c < 0 || c > 9) break;
+ v*=10;
+ v+=c;
+ }
+ if (sign) v = -v;
+ }
+
+ return v;
+}
+
+unsigned int NSISCALL myatou(LPCTSTR s)
+{
+ unsigned int v=0;
+
+ for (;;)
+ {
+ unsigned int c=*s++;
+ if (c >= _T('0') && c <= _T('9')) c-=_T('0');
+ else break;
+ v*=10;
+ v+=c;
+ }
+ return v;
+}
+
+int NSISCALL myatoi_or(LPCTSTR s)
+{
+ int v=0;
+ if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X')))
+ {
+ s++;
+ for (;;)
+ {
+ int c=*(++s);
+ if (c >= _T('0') && c <= _T('9')) c-=_T('0');
+ else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10;
+ else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10;
+ else break;
+ v<<=4;
+ v+=c;
+ }
+ }
+ else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0'))
+ {
+ for (;;)
+ {
+ int c=*(++s);
+ if (c >= _T('0') && c <= _T('7')) c-=_T('0');
+ else break;
+ v<<=3;
+ v+=c;
+ }
+ }
+ else
+ {
+ int sign=0;
+ if (*s == _T('-')) sign++; else s--;
+ for (;;)
+ {
+ int c=*(++s) - _T('0');
+ if (c < 0 || c > 9) break;
+ v*=10;
+ v+=c;
+ }
+ if (sign) v = -v;
+ }
+
+ // Support for simple ORed expressions
+ if (*s == _T('|'))
+ {
+ v |= myatoi_or(s+1);
+ }
+
+ return v;
+}
+
+INT_PTR NSISCALL popintptr()
+{
+ TCHAR buf[128];
+ if (popstringn(buf,COUNTOF(buf)))
+ return 0;
+ return nsishelper_str_to_ptr(buf);
+}
+
+int NSISCALL popint_or()
+{
+ TCHAR buf[128];
+ if (popstringn(buf,COUNTOF(buf)))
+ return 0;
+ return myatoi_or(buf);
+}
+
+void NSISCALL pushintptr(INT_PTR value)
+{
+ TCHAR buffer[30];
+ wsprintf(buffer, sizeof(void*) > 4 ? _T("%Id") : _T("%d"), value);
+ pushstring(buffer);
+}
diff --git a/build-aux/speedo/w32/exdll.h b/build-aux/speedo/w32/exdll.h
index bb13ae097..f419dc3fe 100644
--- a/build-aux/speedo/w32/exdll.h
+++ b/build-aux/speedo/w32/exdll.h
@@ -1,151 +1,176 @@
-/* exdll.h for use with gpg4win
- * Copyright (C) 1999-2005 Nullsoft, Inc.
- *
- * This license applies to everything in the NSIS package, except
- * where otherwise noted.
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any
- * damages arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any
- * purpose, including commercial applications, and to alter it and
- * redistribute it freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must
- * not claim that you wrote the original software. If you use this
- * software in a product, an acknowledgment in the product
- * documentation would be appreciated but is not required.
- *
- * 2. Altered source versions must be plainly marked as such, and must
- * not be misrepresented as being the original software.
- *
- * 3. This notice may not be removed or altered from any source
- * distribution.
- ************************************************************
- * 2005-11-14 wk Applied license text to original exdll.h file from
- * NSIS 2.0.4 and did some formatting changes.
- */
-
-#ifndef _EXDLL_H_
-#define _EXDLL_H_
-
-/* only include this file from one place in your DLL. (it is all
- static, if you use it in two places it will fail) */
+#include <windows.h>
+#ifndef ___NSIS_PLUGIN__H___
+#define ___NSIS_PLUGIN__H___
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef NSISCALL
+# define NSISCALL __stdcall
+#endif
+#if !defined(_WIN32) && !defined(LPTSTR)
+# define LPTSTR TCHAR*
+#endif
+
+
+
+#ifndef NSISCALL
+# define NSISCALL WINAPI
+#endif
#define EXDLL_INIT() { \
g_stringsize=string_size; \
g_stacktop=stacktop; \
g_variables=variables; }
-/* For page showing plug-ins */
-#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)
-#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd)
-#define NOTIFY_BYE_BYE 'x'
+
+enum NSPIM
+{
+ NSPIM_UNLOAD,
+ NSPIM_GUIUNLOAD
+};
+
+typedef UINT_PTR (*NSISPLUGINCALLBACK)(enum NSPIM);
typedef struct _stack_t {
struct _stack_t *next;
- char text[1]; /* This should be the length of string_size. */
+#ifdef UNICODE
+ WCHAR text[1]; // this should be the length of g_stringsize when allocating
+#else
+ char text[1];
+#endif
} stack_t;
-
-static unsigned int g_stringsize;
-static stack_t **g_stacktop;
-static char *g_variables;
-
-static int __stdcall popstring(char *str, size_t maxlen); /* 0 on success, 1 on empty stack */
-static void __stdcall pushstring(const char *str);
-
-enum
- {
- INST_0, // $0
- INST_1, // $1
- INST_2, // $2
- INST_3, // $3
- INST_4, // $4
- INST_5, // $5
- INST_6, // $6
- INST_7, // $7
- INST_8, // $8
- INST_9, // $9
- INST_R0, // $R0
- INST_R1, // $R1
- INST_R2, // $R2
- INST_R3, // $R3
- INST_R4, // $R4
- INST_R5, // $R5
- INST_R6, // $R6
- INST_R7, // $R7
- INST_R8, // $R8
- INST_R9, // $R9
- INST_CMDLINE, // $CMDLINE
- INST_INSTDIR, // $INSTDIR
- INST_OUTDIR, // $OUTDIR
- INST_EXEDIR, // $EXEDIR
- INST_LANG, // $LANGUAGE
- __INST_LAST
-};
-
typedef struct {
int autoclose;
int all_user_var;
int exec_error;
int abort;
int exec_reboot;
int reboot_called;
int XXX_cur_insttype; /* deprecated */
- int XXX_insttype_changed; /* deprecated */
+ int plugin_api_version; /* Used to be insttype_changed */
int silent;
int instdir_error;
int rtl;
int errlvl;
+ int alter_reg_view;
+ int status_update;
} exec_flags_t;
typedef struct {
exec_flags_t *exec_flags;
int (__stdcall *ExecuteCodeSegment)(int, HWND);
+ void (__stdcall *validate_filename)(LPTSTR);
+ int (__stdcall *RegisterPluginCallback)(HMODULE, NSISPLUGINCALLBACK);
} extra_parameters_t;
-/* Utility functions (not required but often useful). */
-static int __stdcall
-popstring(char *str, size_t maxlen)
-{
- stack_t *th;
- if (!g_stacktop || !*g_stacktop)
- return 1;
- th=(*g_stacktop);
- lstrcpyn (str, th->text, maxlen);
- *g_stacktop = th->next;
- GlobalFree((HGLOBAL)th);
- return 0;
-}
-
-static void __stdcall
-pushstring(const char *str)
-{
- stack_t *th;
- if (!g_stacktop) return;
- th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize);
- lstrcpyn(th->text,str,g_stringsize);
- th->next=*g_stacktop;
- *g_stacktop=th;
-}
-
-static char * __stdcall
-getuservariable(const int varnum)
+enum
{
- if (varnum < 0 || varnum >= __INST_LAST) return NULL;
- return g_variables+varnum*g_stringsize;
-}
+INST_0, // $0
+INST_1, // $1
+INST_2, // $2
+INST_3, // $3
+INST_4, // $4
+INST_5, // $5
+INST_6, // $6
+INST_7, // $7
+INST_8, // $8
+INST_9, // $9
+INST_R0, // $R0
+INST_R1, // $R1
+INST_R2, // $R2
+INST_R3, // $R3
+INST_R4, // $R4
+INST_R5, // $R5
+INST_R6, // $R6
+INST_R7, // $R7
+INST_R8, // $R8
+INST_R9, // $R9
+INST_CMDLINE, // $CMDLINE
+INST_INSTDIR, // $INSTDIR
+INST_OUTDIR, // $OUTDIR
+INST_EXEDIR, // $EXEDIR
+INST_LANG, // $LANGUAGE
+__INST_LAST
+};
-static void __stdcall
-setuservariable(const int varnum, const char *var)
-{
- if (var != NULL && varnum >= 0 && varnum < __INST_LAST)
- lstrcpy(g_variables + varnum*g_stringsize, var);
+extern unsigned int g_stringsize;
+extern stack_t **g_stacktop;
+extern LPTSTR g_variables;
+
+void NSISCALL pushstring(LPCTSTR str);
+void NSISCALL pushintptr(INT_PTR value);
+#define pushint(v) pushintptr((INT_PTR)(v))
+int NSISCALL popstring(LPTSTR str); // 0 on success, 1 on empty stack
+int NSISCALL popstringn(LPTSTR str, int maxlen); // with length limit, pass 0 for g_stringsize
+INT_PTR NSISCALL popintptr();
+#define popint() ( (int) popintptr() )
+int NSISCALL popint_or(); // with support for or'ing (2|4|8)
+INT_PTR NSISCALL nsishelper_str_to_ptr(LPCTSTR s);
+#define myatoi(s) ( (int) nsishelper_str_to_ptr(s) ) // converts a string to an integer
+unsigned int NSISCALL myatou(LPCTSTR s); // converts a string to an unsigned integer, decimal only
+int NSISCALL myatoi_or(LPCTSTR s); // with support for or'ing (2|4|8)
+LPTSTR NSISCALL getuservariable(const int varnum);
+void NSISCALL setuservariable(const int varnum, LPCTSTR var);
+
+#ifdef UNICODE
+#define PopStringW(x) popstring(x)
+#define PushStringW(x) pushstring(x)
+#define SetUserVariableW(x,y) setuservariable(x,y)
+
+int NSISCALL PopStringA(LPSTR ansiStr);
+int NSISCALL PopStringNA(LPSTR ansiStr, int maxlen);
+void NSISCALL PushStringA(LPCSTR ansiStr);
+void NSISCALL GetUserVariableW(const int varnum, LPWSTR wideStr);
+void NSISCALL GetUserVariableA(const int varnum, LPSTR ansiStr);
+void NSISCALL SetUserVariableA(const int varnum, LPCSTR ansiStr);
+
+#else
+// ANSI defs
+
+#define PopStringA(x) popstring(x)
+#define PushStringA(x) pushstring(x)
+#define SetUserVariableA(x,y) setuservariable(x,y)
+
+int NSISCALL PopStringW(LPWSTR wideStr);
+void NSISCALL PushStringW(LPWSTR wideStr);
+void NSISCALL GetUserVariableW(const int varnum, LPWSTR wideStr);
+void NSISCALL GetUserVariableA(const int varnum, LPSTR ansiStr);
+void NSISCALL SetUserVariableW(const int varnum, LPCWSTR wideStr);
+
+#endif
+
+#ifdef __cplusplus
}
-
-
-
-#endif/*_EXDLL_H_*/
+#endif
+
+#endif//!___NSIS_PLUGIN__H___
+
+#ifndef COUNTOF
+#define COUNTOF(a) (sizeof(a)/sizeof(a[0]))
+#endif
+
+// minimal tchar.h emulation
+#ifndef _T
+# define _T TEXT
+#endif
+#if !defined(TCHAR) && !defined(_TCHAR_DEFINED)
+# ifdef UNICODE
+# define TCHAR WCHAR
+# else
+# define TCHAR char
+# endif
+#endif
+
+#define isvalidnsisvarindex(varnum) ( ((unsigned int)(varnum)) < (__INST_LAST) )
+
+#define ERRORPRINTF(fmt, ...) \
+ { \
+ char buf[512]; \
+ snprintf(buf, 511, "ERROR: " fmt, ##__VA_ARGS__); \
+ buf[511] = '\0'; \
+ OutputDebugStringA(buf); \
+ }
diff --git a/build-aux/speedo/w32/g4wihelp.c b/build-aux/speedo/w32/g4wihelp.c
index 626f3f12c..bae4b837c 100644
--- a/build-aux/speedo/w32/g4wihelp.c
+++ b/build-aux/speedo/w32/g4wihelp.c
@@ -1,1175 +1,1323 @@
-/* g4wihelp.c - NSIS Helper DLL used with gpg4win. -*- coding: latin-1; -*-
- * Copyright (C) 2005 g10 Code GmbH
+/* g4wihelp.c - NSIS Helper DLL used with gpg4win.
+ * Copyright (C) 2005, 2023 g10 Code GmbH
* Copyright (C) 2001 Justin Frankel
+ * Copyright (C) 2016, 2017 Intevation GmbH
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any
* damages arising from the use of this software.
*
* Permission is granted to anyone to use this software for any
* purpose, including commercial applications, and to alter it and
* redistribute it freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must
* not claim that you wrote the original software. If you use this
* software in a product, an acknowledgment in the product
* documentation would be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must
* not be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
************************************************************
* The code for the splash screen has been taken from the Splash
* plugin of the NSIS 2.04 distribution. That code comes without
- * explicit copyright notices in the source files or author names, it
+ * explicit copyright notices in tyhe source files or author names, it
* seems that it has been written by Justin Frankel; not sure about
* the year, though. [wk 2005-11-28]
*
* Fixed some compiler warnings. [wk 2014-02-24].
+ * Merged code from GnuPG version. [wk 2023-04-24].
+ *
+ * Compile time macros:
+ * ENABLE_SLIDE_SHOW :: Define for Gpg4win.
*/
-#include <stdio.h>
#include <windows.h>
+#include <stdio.h>
+#include <tlhelp32.h>
+#include <psapi.h>
+#include <stdio.h>
+#include <string.h>
#include "exdll.h"
+/* We keep some code here for documentation reasons. That code has not
+ * yet been converted to the Unicode NSIS plugin API. */
+/* #define ENABLE_SOUND_GADGET 1 */
+/* #define ENABLE_SPLASH_GADGET 1 */
+/* #define ENABLE_SERVICE_MANAGEMENT 1 */
+
+
static HINSTANCE g_hInstance; /* Our Instance. */
static HWND g_hwndParent; /* Handle of parent window or NULL. */
static HBITMAP g_hbm; /* Handle of the splash image. */
static int sleepint; /* Milliseconds to show the spals image. */
+#ifdef ENABLE_SLIDE_SHOW
+void
+slide_stop(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop);
+#endif
/* Standard entry point for DLLs. */
int WINAPI
DllMain (HANDLE hinst, DWORD reason, LPVOID reserved)
{
if (reason == DLL_PROCESS_ATTACH)
g_hInstance = hinst;
+ else if (reason == DLL_PROCESS_DETACH)
+ {
+#ifdef ENABLE_SLIDE_SHOW
+ slide_stop (NULL, 0, NULL, NULL);
+#endif
+ }
return TRUE;
}
/* Dummy function for testing. */
void __declspec(dllexport)
-dummy (HWND hwndParent, int string_size, char *variables,
+dummy (HWND hwndParent, int string_size, LPTSTR variables,
stack_t **stacktop, extra_parameters_t *extra)
{
g_hwndParent = hwndParent;
EXDLL_INIT();
// note if you want parameters from the stack, pop them off in order.
// i.e. if you are called via exdll::myFunction file.dat poop.dat
// calling popstring() the first time would give you file.dat,
// and the second time would give you poop.dat.
// you should empty the stack of your parameters, and ONLY your
// parameters.
- // do your stuff here
+ /* Let's dump the variables. */
{
- char buf[1024];
- snprintf (buf, sizeof buf, "$R0=%s\r\n$R1=%s\r\n",
- getuservariable(INST_R0),
- getuservariable(INST_R1));
- MessageBox (g_hwndParent,buf,0,MB_OK);
-
- snprintf (buf, sizeof buf,
- "autoclose =%d\r\n"
+ char line[512];
+ char *p;
+ const unsigned char *s = (void*)g_variables;
+ int i,j;
+
+ for (i=0; i < string_size* __INST_LAST; i+=32, s += 32)
+ {
+ for (j=0; j < 32; j++)
+ if (s[j])
+ break;
+ if (j != 32)
+ {
+ p = line;
+ *p = 0;
+ snprintf (p, 10, "%05x: ", i);
+ p += strlen (p);
+ for (j=0; j < 32; j++)
+ {
+ snprintf (p, 10, "%02x", s[j]);
+ p += strlen (p);
+ }
+ strcat (p, " |");
+ p += strlen (p);
+ for (j=0; j < 32; j++)
+ {
+ if (s[j] >= 32 && s[j] < 127)
+ *p = s[j];
+ else
+ *p = '.';
+ p++;
+ }
+ strcat (p, "|");
+ OutputDebugStringA (line);
+ }
+ }
+ }
+
+
+ {
+ wchar_t buf[1024];
+
+ swprintf(buf, 1024,
+ L"stringsize=%d\r\n$0=%s\r\n$1=%s\r\n$R0=%s\r\n$R1=%s\r\n",
+ string_size,
+ getuservariable(INST_0),
+ getuservariable(INST_1),
+ getuservariable(INST_R0),
+ getuservariable(INST_R1));
+ MessageBoxW(g_hwndParent,buf,0,MB_OK);
+
+ swprintf (buf, 1024,
+ L"autoclose =%d\r\n"
"all_user_var =%d\r\n"
"exec_error =%d\r\n"
"abort =%d\r\n"
"exec_reboot =%d\r\n"
"reboot_called=%d\r\n"
+ "api_version =%d\r\n"
"silent =%d\r\n"
"instdir_error=%d\r\n"
"rtl =%d\r\n"
"errlvl =%d\r\n",
extra->exec_flags->autoclose,
extra->exec_flags->all_user_var,
extra->exec_flags->exec_error,
extra->exec_flags->abort,
extra->exec_flags->exec_reboot,
extra->exec_flags->reboot_called,
+ extra->exec_flags->plugin_api_version,
extra->exec_flags->silent,
extra->exec_flags->instdir_error,
extra->exec_flags->rtl,
extra->exec_flags->errlvl);
- MessageBox(g_hwndParent,buf,0,MB_OK);
+ MessageBoxW(g_hwndParent,buf,0,MB_OK);
}
}
+
void __declspec(dllexport)
-runonce (HWND hwndParent, int string_size, char *variables,
+runonce (HWND hwndParent, int string_size, LPTSTR variables,
stack_t **stacktop, extra_parameters_t *extra)
{
- const char *result;
+ LPCWSTR result;
g_hwndParent = hwndParent;
EXDLL_INIT();
- CreateMutexA (NULL, 0, getuservariable(INST_R0));
- result = GetLastError ()? "1":"0";
+ CreateMutexW (NULL, 0, getuservariable(INST_R0));
+ result = GetLastError ()? L"1" : L"0";
setuservariable (INST_R0, result);
}
+
+#ifdef ENABLE_SOUND_GADGET
void __declspec(dllexport)
playsound (HWND hwndParent, int string_size, char *variables,
stack_t **stacktop, extra_parameters_t *extra)
{
char fname[MAX_PATH];
g_hwndParent = hwndParent;
EXDLL_INIT();
if (popstring(fname, sizeof fname))
return;
PlaySound (fname, NULL, SND_ASYNC|SND_FILENAME|SND_NODEFAULT);
}
void __declspec(dllexport)
stopsound (HWND hwndParent, int string_size, char *variables,
stack_t **stacktop, extra_parameters_t *extra)
{
g_hwndParent = hwndParent;
EXDLL_INIT();
PlaySound (NULL, NULL, 0);
}
+#endif /*ENABLE_SOUND_GADGET*/
+#ifdef ENABLE_SPLASH_GADGET
/* Windows procedure to control the splashimage. This one pauses the
execution until the sleep time is over or the user closes this
windows. */
static LRESULT CALLBACK
splash_wndproc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT result = 0;
switch (uMsg)
{
case WM_CREATE:
{
BITMAP bm;
RECT vp;
GetObject(g_hbm, sizeof(bm), (LPSTR)&bm);
SystemParametersInfo(SPI_GETWORKAREA, 0, &vp, 0);
SetWindowLong(hwnd,GWL_STYLE,0);
SetWindowPos(hwnd,NULL,
vp.left+(vp.right-vp.left-bm.bmWidth)/2,
vp.top+(vp.bottom-vp.top-bm.bmHeight)/2,
bm.bmWidth,bm.bmHeight,
SWP_NOZORDER);
ShowWindow(hwnd,SW_SHOW);
SetTimer(hwnd,1,sleepint,NULL);
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
RECT r;
HDC curdc=BeginPaint(hwnd,&ps);
HDC hdc=CreateCompatibleDC(curdc);
HBITMAP oldbm;
GetClientRect(hwnd,&r);
oldbm=(HBITMAP)SelectObject(hdc,g_hbm);
BitBlt(curdc,r.left,r.top,r.right-r.left,r.bottom-r.top,
hdc,0,0,SRCCOPY);
SelectObject(hdc,oldbm);
DeleteDC(hdc);
EndPaint(hwnd,&ps);
}
break;
case WM_CLOSE:
break;
case WM_TIMER:
case WM_LBUTTONDOWN:
DestroyWindow(hwnd);
/*(fall through)*/
default:
result = DefWindowProc (hwnd, uMsg, wParam, lParam);
}
return result;
}
/* Display a splash screen. Call as
g4wihelp::showsplash SLEEP FNAME
With SLEEP being the time in milliseconds to show the splashscreen
and FNAME the complete filename of the image. As of now only BMP
is supported.
*/
void __declspec(dllexport)
showsplash (HWND hwndParent, int string_size, char *variables,
stack_t **stacktop, extra_parameters_t *extra)
{
static WNDCLASS wc;
char sleepstr[30];
char fname[MAX_PATH];
int err = 0;
char *p;
char classname[] = "_sp";
g_hwndParent = hwndParent;
EXDLL_INIT();
if (popstring(sleepstr, sizeof sleepstr))
err = 1;
if (popstring(fname, sizeof fname))
err = 1;
if (err)
return;
if (!*fname)
return; /* Nothing to do. */
for (sleepint=0, p=sleepstr; *p >= '0' && *p <= '9'; p++)
{
sleepint *= 10;
sleepint += *p - '0';
}
if (sleepint <= 0)
return; /* Nothing to do. */
wc.lpfnWndProc = splash_wndproc;
wc.hInstance = g_hInstance;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.lpszClassName = classname;
if (!RegisterClass(&wc))
return; /* Error. */
g_hbm = LoadImage (NULL, fname, IMAGE_BITMAP,
0, 0 , LR_CREATEDIBSECTION|LR_LOADFROMFILE);
if (g_hbm)
{
MSG msg;
HWND hwnd;
hwnd = CreateWindowEx (WS_EX_TOOLWINDOW, classname, classname,
0, 0, 0, 0, 0, (HWND)hwndParent, NULL,
g_hInstance, NULL);
while (IsWindow(hwnd) && GetMessage ( &msg, hwnd, 0, 0))
{
DispatchMessage (&msg);
}
DeleteObject (g_hbm);
g_hbm = NULL;
}
UnregisterClass (classname, g_hInstance);
}
+#endif /*ENABLE_SPLASH_GADGET*/
-
-/* Service Management. */
+#ifdef ENABLE_SERVICE_MANAGEMENT
/* Use this to report unexpected errors. FIXME: This is really not
very descriptive. */
void
service_error (const char *str)
{
char buf[1024];
snprintf (buf, sizeof (buf), "error: %s: ec=%d\r\n", str,
GetLastError ());
MessageBox(g_hwndParent, buf, 0, MB_OK);
setuservariable (INST_R0, "1");
}
void __declspec(dllexport)
service_create (HWND hwndParent, int string_size, char *variables,
stack_t **stacktop, extra_parameters_t *extra)
{
SC_HANDLE sc;
SC_HANDLE service;
const char *result = NULL;
char service_name[256];
char display_name[256];
char program[256];
int err = 0;
g_hwndParent = hwndParent;
EXDLL_INIT();
/* The expected stack layout: service_name, display_name, program. */
if (popstring (service_name, sizeof (service_name)))
err = 1;
if (!err && popstring (display_name, sizeof (display_name)))
err = 1;
if (!err && popstring (program, sizeof (program)))
err = 1;
if (err)
{
setuservariable (INST_R0, "1");
return;
}
sc = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (sc == NULL)
{
service_error ("OpenSCManager");
return;
}
service = CreateService (sc, service_name, display_name,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
/* Use SERVICE_DEMAND_START for testing.
FIXME: Currently not configurable by caller. */
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL, program,
NULL, NULL, NULL,
/* FIXME: Currently not configurable by caller. */
/* FIXME: LocalService or NetworkService
don't work for dirmngr right now. NOTE!
If you change it here, you also should
adjust make-msi.pl for the msi
installer. In the future, this should
be an argument to the function and then
the make-msi.pl script can extract it
from the invocation. */
NULL /* "NT AUTHORITY\\LocalService" */,
NULL);
if (service == NULL)
{
service_error ("CreateService");
CloseServiceHandle (sc);
return;
}
CloseServiceHandle (service);
result = GetLastError () ? "1":"0";
setuservariable (INST_R0, result);
return;
}
/* Requires g_hwndParent to be set! */
SC_HANDLE
service_lookup (char *service_name)
{
SC_HANDLE sc;
SC_HANDLE service;
sc = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (sc == NULL)
{
service_error ("OpenSCManager");
return NULL;
}
service = OpenService (sc, service_name, SC_MANAGER_ALL_ACCESS);
if (service == NULL)
{
/* Fail silently here. */
CloseServiceHandle (sc);
return NULL;
}
CloseServiceHandle (sc);
return service;
}
/* Returns status. */
void __declspec(dllexport)
service_query (HWND hwndParent, int string_size, char *variables,
stack_t **stacktop, extra_parameters_t *extra)
{
SC_HANDLE service;
const char *result = NULL;
char service_name[256];
int err = 0;
SERVICE_STATUS status;
g_hwndParent = hwndParent;
EXDLL_INIT();
/* The expected stack layout: service_name argc [argv]. */
if (popstring (service_name, sizeof (service_name)))
err = 1;
if (err)
{
setuservariable (INST_R0, "ERROR");
return;
}
service = service_lookup (service_name);
if (service == NULL)
if (err == 0)
{
setuservariable (INST_R0, "MISSING");
return;
}
err = QueryServiceStatus (service, &status);
if (err == 0)
{
setuservariable (INST_R0, "ERROR");
CloseServiceHandle (service);
return;
}
CloseServiceHandle (service);
switch (status.dwCurrentState)
{
case SERVICE_START_PENDING:
result = "START_PENDING";
break;
case SERVICE_RUNNING:
result = "RUNNING";
break;
case SERVICE_PAUSE_PENDING:
result = "PAUSE_PENDING";
break;
case SERVICE_PAUSED:
result = "PAUSED";
break;
case SERVICE_CONTINUE_PENDING:
result = "CONTINUE_PENDING";
break;
case SERVICE_STOP_PENDING:
result = "STOP_PENDING";
break;
case SERVICE_STOPPED:
result = "STOPPED";
break;
default:
result = "UNKNOWN";
}
setuservariable (INST_R0, result);
return;
}
void __declspec(dllexport)
service_start (HWND hwndParent, int string_size, char *variables,
stack_t **stacktop, extra_parameters_t *extra)
{
SC_HANDLE service;
const char *result = NULL;
char service_name[256];
char argc_str[256];
#define NR_ARGS 10
#define ARG_MAX 256
char argv_str[NR_ARGS][ARG_MAX];
const char *argv[NR_ARGS + 1];
int argc;
int i;
int err = 0;
g_hwndParent = hwndParent;
EXDLL_INIT();
/* The expected stack layout: service_name argc [argv]. */
if (popstring (service_name, sizeof (service_name)))
err = 1;
if (!err && popstring (argc_str, sizeof (argc_str)))
err = 1;
if (!err)
{
argc = atoi (argc_str);
for (i = 0; i < argc; i++)
{
if (popstring (argv_str[i], ARG_MAX))
{
err = 1;
break;
}
argv[i] = argv_str[i];
}
argv[i] = NULL;
}
if (err)
{
setuservariable (INST_R0, "1");
return;
}
service = service_lookup (service_name);
if (service == NULL)
return;
err = StartService (service, argc, argc == 0 ? NULL : argv);
if (err == 0)
{
service_error ("StartService");
CloseServiceHandle (service);
return;
}
CloseServiceHandle (service);
setuservariable (INST_R0, "0");
return;
}
void __declspec(dllexport)
service_stop (HWND hwndParent, int string_size, char *variables,
stack_t **stacktop, extra_parameters_t *extra)
{
SC_HANDLE service;
const char *result = NULL;
char service_name[256];
int err = 0;
SERVICE_STATUS status;
DWORD timeout = 10000; /* 10 seconds. */
DWORD start_time;
g_hwndParent = hwndParent;
EXDLL_INIT();
/* The expected stack layout: service_name argc [argv]. */
if (popstring (service_name, sizeof (service_name)))
err = 1;
if (err)
{
setuservariable (INST_R0, "1");
return;
}
service = service_lookup (service_name);
if (service == NULL)
return;
err = QueryServiceStatus (service, &status);
if (err == 0)
{
service_error ("QueryService");
CloseServiceHandle (service);
return;
}
if (status.dwCurrentState != SERVICE_STOPPED
&& status.dwCurrentState != SERVICE_STOP_PENDING)
{
err = ControlService (service, SERVICE_CONTROL_STOP, &status);
if (err == 0)
{
service_error ("ControlService");
CloseServiceHandle (service);
return;
}
}
start_time = GetTickCount ();
while (status.dwCurrentState != SERVICE_STOPPED)
{
Sleep (1000); /* One second. */
if (!QueryServiceStatus (service, &status))
{
service_error ("QueryService");
CloseServiceHandle (service);
return;
}
if (status.dwCurrentState == SERVICE_STOPPED)
break;
if (GetTickCount () - start_time > timeout)
{
char buf[1024];
snprintf (buf, sizeof (buf),
"time out waiting for service %s to stop\r\n",
service_name);
MessageBox (g_hwndParent, buf, 0, MB_OK);
setuservariable (INST_R0, "1");
return;
}
}
CloseServiceHandle (service);
setuservariable (INST_R0, "0");
return;
}
void __declspec(dllexport)
service_delete (HWND hwndParent, int string_size, char *variables,
stack_t **stacktop, extra_parameters_t *extra)
{
SC_HANDLE service;
const char *result = NULL;
char service_name[256];
int err = 0;
g_hwndParent = hwndParent;
EXDLL_INIT();
/* The expected stack layout: service_name argc [argv]. */
if (popstring (service_name, sizeof (service_name)))
err = 1;
if (err)
{
setuservariable (INST_R0, "1");
return;
}
service = service_lookup (service_name);
if (service == NULL)
return;
err = DeleteService (service);
if (err == 0)
{
service_error ("DeleteService");
CloseServiceHandle (service);
return;
}
CloseServiceHandle (service);
setuservariable (INST_R0, "0");
return;
}
+#endif /*ENABLE_SERVICE_MANAGEMENT*/
-
-#include <stdio.h>
/* Extract config file parameters. FIXME: Not particularly robust.
We expect some reasonable formatting. The parser below is very
limited. It expects a command line option /c=FILE or /C=FILE,
where FILE must be enclosed in double-quotes if it contains spaces.
That file should contain a single section [gpg4win] and KEY=VALUE
pairs for each additional configuration file to install. Comments
are supported only on lines by themselves. VALUE can be quoted in
double-quotes, but does not need to be, unless it has whitespace at
the beginning or end. KEY can, for example, be "gpg.conf" (without
the quotes). */
void
config_init (char **keys, char **values, int max)
{
/* First, parse the command line. */
+ LPCWSTR wcmdline;
char *cmdline;
char *begin = NULL;
char *end = NULL;
char mark;
char *fname;
char *ptr;
FILE *conf;
*keys = NULL;
*values = NULL;
- cmdline = getuservariable (INST_CMDLINE);
+ cmdline = malloc (4096);
+ if (!cmdline)
+ return;
+
+ wcmdline = getuservariable (INST_CMDLINE);
+ *cmdline = 0;
+ WideCharToMultiByte(CP_ACP, 0, wcmdline, -1, cmdline, 4095, NULL, NULL);
+ if (!*cmdline)
+ return;
mark = (*cmdline == '"') ? (cmdline++, '"') : ' ';
while (*cmdline && *cmdline != mark)
cmdline++;
if (mark == '"' && *cmdline)
cmdline++;
while (*cmdline && *cmdline == ' ')
cmdline++;
while (*cmdline)
{
/* We are at the beginning of a new argument. */
if (cmdline[0] == '/' && (cmdline[1] == 'C' || cmdline[1] == 'c')
&& cmdline[2] == '=')
{
cmdline += 3;
begin = cmdline;
}
while (*cmdline && *cmdline != ' ')
{
/* Skip over quoted parts. */
if (*cmdline == '"')
{
cmdline++;
while (*cmdline && *cmdline != '"')
cmdline++;
if (*cmdline)
cmdline++;
}
else
cmdline++;
}
if (begin && !end)
{
end = cmdline - 1;
break;
}
while (*cmdline && *cmdline == ' ')
cmdline++;
}
if (!begin || begin > end)
return;
/* Strip quotes. */
if (*begin == '"' && *end == '"')
{
begin++;
end--;
}
if (begin > end)
return;
fname = malloc (end - begin + 2);
if (!fname)
return;
ptr = fname;
while (begin <= end)
*(ptr++) = *(begin++);
*ptr = '\0';
conf = fopen (fname, "r");
free (fname);
+ free (cmdline);
if (!conf)
return;
while (max - 1 > 0)
{
char line[256];
char *ptr2;
if (fgets (line, sizeof (line), conf) == NULL)
break;
ptr = &line[strlen (line)];
while (ptr > line && (ptr[-1] == '\n' || ptr[-1] == '\r'
|| ptr[-1] == ' ' || ptr[-1] == '\t'))
ptr--;
*ptr = '\0';
ptr = line;
while (*ptr && (*ptr == ' ' || *ptr == '\t'))
ptr++;
/* Ignore comment lines. */
/* FIXME: Ignore section markers. */
if (*ptr == '\0' || *ptr == ';' || *ptr == '[')
continue;
begin = ptr;
while (*ptr && *ptr != '=' && *ptr != ' ' && *ptr != '\t')
ptr++;
end = ptr - 1;
while (*ptr && (*ptr == ' ' || *ptr == '\t'))
ptr++;
if (*ptr != '=')
continue;
ptr++;
if (begin > end)
continue;
/* We found a key. */
*keys = malloc (end - begin + 2);
if (!keys)
return;
ptr2 = *keys;
while (begin <= end)
*(ptr2++) = *(begin++);
*ptr2 = '\0';
*values = NULL;
while (*ptr && (*ptr == ' ' || *ptr == '\t'))
ptr++;
begin = ptr;
/* In this case, end points to the byte after the value, which
is OK because that is '\0'. */
end = &line[strlen (line)];
if (begin > end)
begin = end;
/* Strip quotes. */
if (*begin == '"' && end[-1] == '"')
{
begin++;
end--;
*end = '\0';
}
if (begin > end)
return;
*values = malloc (end - begin + 1);
ptr2 = *values;
while (begin <= end)
*(ptr2++) = *(begin++);
keys++;
values++;
max--;
}
fclose (conf);
*keys = NULL;
*values = NULL;
}
char *
config_lookup (char *key)
{
#define MAX_KEYS 128
static int initialised = 0;
static char *keys[MAX_KEYS];
static char *values[MAX_KEYS];
int i;
if (initialised == 0)
{
initialised = 1;
config_init (keys, values, MAX_KEYS);
#if 0
MessageBox(g_hwndParent, "Configuration File:", 0, MB_OK);
i = 0;
while (keys[i])
{
char buf[256];
sprintf (buf, "%s=%s\r\n", keys[i], values[i]);
MessageBox (g_hwndParent, buf, 0, MB_OK);
i++;
}
#endif
}
i = 0;
while (keys[i])
{
if (!strcmp (keys[i], key))
return values[i];
i++;
}
return NULL;
}
void __declspec(dllexport)
-config_fetch (HWND hwndParent, int string_size, char *variables,
+config_fetch (HWND hwndParent, int string_size, LPTSTR variables,
stack_t **stacktop, extra_parameters_t *extra)
{
char key[256];
int err = 0;
char *value;
g_hwndParent = hwndParent;
EXDLL_INIT();
/* The expected stack layout: key. */
- if (popstring (key, sizeof (key)))
+ if (PopStringNA (key, sizeof (key)))
err = 1;
if (err)
{
- setuservariable (INST_R0, "");
+ setuservariable (INST_R0, L"");
return;
}
value = config_lookup (key);
- setuservariable (INST_R0, value == NULL ? "" : value);
+ SetUserVariableA (INST_R0, value == NULL ? "" : value);
return;
}
void __declspec(dllexport)
-config_fetch_bool (HWND hwndParent, int string_size, char *variables,
+config_fetch_bool (HWND hwndParent, int string_size, LPTSTR variables,
stack_t **stacktop, extra_parameters_t *extra)
{
char key[256];
int err = 0;
char *value;
int result;
g_hwndParent = hwndParent;
EXDLL_INIT();
/* The expected stack layout: key. */
- if (popstring (key, sizeof (key)))
+ if (PopStringNA (key, sizeof (key)))
err = 1;
if (err)
{
- setuservariable (INST_R0, "");
+ setuservariable (INST_R0, L"");
return;
}
value = config_lookup (key);
if (value == NULL || *value == '\0')
{
- setuservariable (INST_R0, "");
+ setuservariable (INST_R0, L"");
return;
}
result = 0;
if (!strcasecmp (value, "true")
|| !strcasecmp (value, "yes")
|| atoi (value) != 0)
result = 1;
- setuservariable (INST_R0, result == 0 ? "0" : "1");
+ SetUserVariableA (INST_R0, result == 0 ? "0" : "1");
return;
}
/* Return a string from the Win32 Registry or NULL in case of error.
Caller must release the return value. A NULL for root is an alias
for HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE in turn. */
-char *
-read_w32_registry_string (HKEY root, const char *dir, const char *name)
+static wchar_t *
+read_w32_registry_string (HKEY root, const wchar_t *dir, const wchar_t *name)
{
HKEY root_key;
HKEY key_handle;
DWORD n1, nbytes, type;
- char *result = NULL;
+ wchar_t *result = NULL;
root_key = root;
- if (! root_key)
+ if (!root_key)
root_key = HKEY_CURRENT_USER;
- if( RegOpenKeyEx( root_key, dir, 0, KEY_READ, &key_handle ) )
+ if (RegOpenKeyExW (root_key, dir, 0, KEY_READ, &key_handle))
{
if (root)
return NULL; /* no need for a RegClose, so return direct */
/* It seems to be common practise to fall back to HKLM. */
- if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) )
+ if (RegOpenKeyExW (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle))
return NULL; /* still no need for a RegClose, so return direct */
}
nbytes = 1;
- if( RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes ) ) {
- if (root)
- goto leave;
- /* Try to fallback to HKLM also vor a missing value. */
- RegCloseKey (key_handle);
- if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) )
- return NULL; /* Nope. */
- if (RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes))
- goto leave;
+ if (RegQueryValueExW (key_handle, name, 0, NULL, NULL, &nbytes))
+ {
+ if (root)
+ goto leave;
+ /* Try to fallback to HKLM also for a missing value. */
+ RegCloseKey (key_handle);
+ if (RegOpenKeyExW (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle))
+ return NULL; /* Nope. */
+ if (RegQueryValueExW (key_handle, name, 0, NULL, NULL, &nbytes))
+ goto leave;
}
- result = malloc( (n1=nbytes+1) );
-
- if( !result )
- goto leave;
- if( RegQueryValueEx( key_handle, name, 0, &type, result, &n1 ) ) {
- free(result); result = NULL;
+ result = calloc ((n1=nbytes+1), sizeof *result);
+ if (!result)
goto leave;
- }
- result[nbytes] = 0; /* make sure it is really a string */
+
+ if (RegQueryValueExW (key_handle, name, 0, &type,
+ (unsigned char *)result, &n1))
+ {
+ free (result);
+ result = NULL;
+ goto leave;
+ }
+ result[nbytes] = 0; /* Make sure it is really a string */
leave:
- RegCloseKey( key_handle );
+ RegCloseKey (key_handle);
return result;
}
+/* Registry keys for PATH for HKLM and HKCU. */
#define ENV_HK HKEY_LOCAL_MACHINE
-#define ENV_REG "SYSTEM\\CurrentControlSet\\Control\\" \
- "Session Manager\\Environment"
- /* The following setting can be used for a per-user setting. */
+#define ENV_REG L"SYSTEM\\CurrentControlSet\\Control\\" \
+ "Session Manager\\Environment"
#define ENV_HK_USER HKEY_CURRENT_USER
-#define ENV_REG_USER "Environment"
+#define ENV_REG_USER L"Environment"
+
/* Due to a bug in Windows7 (kb 2685893) we better put a lower limit
- than 8191 on the maximum length of the PATH variable. Note, that
- depending on the used toolchain we used to had a 259 byte limit in
- the past. */
+ * than 8191 on the maximum length of the PATH variable. Note, that
+ * depending on the used toolchain we used to had a 259 byte limit in
+ * the past.
+ * [wk 2023-04-24]: Can this be lifted now that we use the wchar_t API?
+ */
#define PATH_LENGTH_LIMIT 2047
void __declspec(dllexport)
-path_add (HWND hwndParent, int string_size, char *variables,
+path_add (HWND hwndParent, int string_size, LPTSTR variables,
stack_t **stacktop, extra_parameters_t *extra)
{
- char dir[PATH_LENGTH_LIMIT];
- char is_user_install[2];
- char *path;
- char *path_new;
- int path_new_size;
- char *comp;
- const char delims[] = ";";
+ wchar_t dir[PATH_LENGTH_LIMIT];
+ wchar_t is_user_install[2];
+ wchar_t *path;
+ wchar_t *path_new;
+ size_t path_new_size;
+ wchar_t *comp;
+ const wchar_t delims[] = L";";
int is_user;
HKEY key_handle = 0;
HKEY root_key;
- const char *env_reg;
+ const wchar_t *env_reg;
+ /* wchar_t *tokctx; Context var for wcstok - not yet needed. */
g_hwndParent = hwndParent;
EXDLL_INIT();
- setuservariable (INST_R0, "0");
-
-/* MessageBox (g_hwndParent, "XXX 1", 0, MB_OK); */
+ setuservariable (INST_R0, L"0"); /* Default return value. */
/* The expected stack layout: path component. */
- if (popstring (dir, sizeof (dir)))
+ if (popstringn (dir, COUNTOF (dir)))
return;
+ dir[COUNTOF(dir)-1] = 0;
/* The expected stack layout: HKEY component. */
- if (popstring (is_user_install, sizeof (is_user_install)))
+ if (popstringn (is_user_install, COUNTOF (is_user_install)))
return;
+ is_user_install[COUNTOF(is_user_install)-1] = 0;
- if (!strcmp(is_user_install, "1"))
+ if (!wcscmp (is_user_install, L"1"))
{
root_key = ENV_HK_USER;
env_reg = ENV_REG_USER;
}
else
{
root_key = ENV_HK;
env_reg = ENV_REG;
}
- path = read_w32_registry_string (root_key, env_reg, "Path");
-
- if (! path)
+ path = read_w32_registry_string (root_key, env_reg, L"Path");
+ if (!path)
{
- path = strdup ("");
+ path = wcsdup (L"");
}
-/* MessageBox (g_hwndParent, "XXX 3", 0, MB_OK); */
-
/* Old path plus semicolon plus dir plus terminating nul. */
- path_new_size = strlen (path) + 1 + strlen (dir) + 1;
+ path_new_size = wcslen (path) + 1 + wcslen (dir) + 1;
if (path_new_size > PATH_LENGTH_LIMIT)
{
- MessageBox (g_hwndParent, "PATH env variable too big", 0, MB_OK);
+ MessageBox (g_hwndParent, L"PATH env variable too big", 0, MB_OK);
free (path);
return;
}
-/* MessageBox (g_hwndParent, "XXX 4", 0, MB_OK); */
-
- path_new = malloc (path_new_size);
+ path_new = calloc (path_new_size, sizeof *path_new);
if (!path_new)
{
free (path);
return;
}
-/* MessageBox (g_hwndParent, "XXX 5", 0, MB_OK); */
-
- strcpy (path_new, path);
- strcat (path_new, ";");
- strcat (path_new, dir);
-
-/* MessageBox (g_hwndParent, "XXX 6", 0, MB_OK); */
-/* MessageBox (g_hwndParent, dir, 0, MB_OK); */
-/* MessageBox (g_hwndParent, "XXX 7", 0, MB_OK); */
+ wcscpy (path_new, path);
+ wcscat (path_new, L";");
+ wcscat (path_new, dir);
/* Check if the directory already exists in the path. */
- comp = strtok (path, delims);
+ comp = wcstok (path, delims/*, &tokctx*/);
do
{
-/* MessageBox (g_hwndParent, comp, 0, MB_OK); */
+ /* MessageBox (g_hwndParent, comp, 0, MB_OK); */
if (!comp)
break;
- if (!strcmp (comp, dir))
+ if (!wcscmp (comp, dir))
{
free (path);
free (path_new);
return;
}
- comp = strtok (NULL, delims);
+ comp = wcstok (NULL, delims/*, &tokctx*/);
}
while (comp);
free (path);
/* Update the path key. */
- RegCreateKey (root_key, env_reg, &key_handle);
- RegSetValueEx (key_handle, "Path", 0, REG_EXPAND_SZ,
- path_new, path_new_size);
+ RegCreateKeyW (root_key, env_reg, &key_handle);
+ RegSetValueEx (key_handle, L"Path", 0, REG_EXPAND_SZ,
+ (unsigned char*)path_new,
+ wcslen (path_new) * sizeof *path_new);
RegCloseKey (key_handle);
- SetEnvironmentVariable("PATH", path_new);
+ SetEnvironmentVariableW(L"PATH", path_new);
free (path_new);
/* MessageBox (g_hwndParent, "XXX 9", 0, MB_OK); */
- setuservariable (INST_R0, "1");
+ setuservariable (INST_R0, L"1"); /* success. */
}
void __declspec(dllexport)
-path_remove (HWND hwndParent, int string_size, char *variables,
+path_remove (HWND hwndParent, int string_size, LPTSTR variables,
stack_t **stacktop, extra_parameters_t *extra)
{
- char dir[PATH_LENGTH_LIMIT];
- char is_user_install[2];
- char *path;
- char *path_new;
- int path_new_size;
- char *comp;
- const char delims[] = ";";
+ wchar_t dir[PATH_LENGTH_LIMIT];
+ wchar_t is_user_install[2];
+ wchar_t *path;
+ wchar_t *path_new;
+ size_t path_new_size;
+ wchar_t *comp;
+ const wchar_t delims[] = L";";
HKEY key_handle = 0;
int changed = 0;
int count = 0;
HKEY root_key;
- const char *env_reg;
+ const wchar_t *env_reg;
+ /* wchar_t *tokctx; Context var for wcstok - not yet needed. */
g_hwndParent = hwndParent;
EXDLL_INIT();
- setuservariable (INST_R0, "0");
+ setuservariable (INST_R0, L"0");
/* The expected stack layout: path component. */
- if (popstring (dir, sizeof (dir)))
+ if (popstringn (dir, COUNTOF (dir)))
return;
+ dir[COUNTOF(dir)-1] = 0;
/* The expected stack layout: HKEY component. */
- if (popstring (is_user_install, sizeof (is_user_install)))
+ if (popstringn (is_user_install, COUNTOF (is_user_install)))
return;
+ is_user_install[COUNTOF(is_user_install)-1] = 0;
- if (!strcmp(is_user_install, "1"))
+ if (!wcscmp (is_user_install, L"1"))
{
root_key = ENV_HK_USER;
env_reg = ENV_REG_USER;
}
else
{
root_key = ENV_HK;
env_reg = ENV_REG;
}
- path = read_w32_registry_string (root_key, env_reg, "Path");
-
+ path = read_w32_registry_string (root_key, env_reg, L"Path");
if (!path)
return;
+
/* Old path plus semicolon plus dir plus terminating nul. */
- path_new_size = strlen (path) + 1;
- path_new = malloc (path_new_size);
+ path_new_size = wcslen (path) + 1;
+ path_new = calloc (path_new_size, sizeof *path_new);
if (!path_new)
{
free (path);
return;
}
- path_new[0] = '\0';
/* Compose the new path. */
- comp = strtok (path, delims);
+ comp = wcstok (path, delims/*, &tokctx*/);
do
{
- if (strcmp (comp, dir))
+ if (wcscmp (comp, dir))
{
- if (count != 0)
- strcat (path_new, ";");
- strcat (path_new, comp);
+ if (count)
+ wcscat (path_new, L";");
+ wcscat (path_new, comp);
count++;
}
else
changed = 1;
-
- comp = strtok (NULL, delims);
}
- while (comp);
+ while ((comp = wcstok (NULL, delims/*, &tokctx*/)));
free (path);
- if (! changed)
+ if (!changed)
{
free (path_new);
return;
}
/* Set a key for our CLSID. */
- RegCreateKey (root_key, env_reg, &key_handle);
- RegSetValueEx (key_handle, "Path", 0, REG_EXPAND_SZ,
- path_new, path_new_size);
+ RegCreateKeyW (root_key, env_reg, &key_handle);
+ RegSetValueEx (key_handle, L"Path", 0, REG_EXPAND_SZ,
+ (unsigned char*)path_new,
+ wcslen (path_new) * sizeof *path_new);
RegCloseKey (key_handle);
free (path_new);
- setuservariable (INST_R0, "1");
+ setuservariable (INST_R0, L"1"); /* success */
+}
+
+
+/** @brief Kill processes with the name name.
+ *
+ * This function tries to kill a process using ExitProcess.
+ *
+ * If it does not work it does not work. No return values.
+ * The intention is to make an effort to kill something during
+ * installation / uninstallation.
+ *
+ * The function signature is explained by NSIS.
+ */
+void __declspec(dllexport) __cdecl KillProc(HWND hwndParent,
+ int string_size,
+ char *variables,
+ stack_t **stacktop)
+{
+ HANDLE h;
+ PROCESSENTRY32 pe32;
+
+ if (!stacktop || !*stacktop || !(*stacktop)->text)
+ {
+ ERRORPRINTF ("Invalid call to KillProc.");
+ return;
+ }
+
+
+ h = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ ERRORPRINTF ("Failed to create Toolhelp snapshot");
+ return;
+ }
+ pe32.dwSize = sizeof (PROCESSENTRY32);
+
+ if (!Process32First (h, &pe32))
+ {
+ ERRORPRINTF ("Failed to get first process");
+ CloseHandle (h);
+ return;
+ }
+
+ do
+ {
+ if (!wcscmp ((*stacktop)->text, pe32.szExeFile))
+ {
+ HANDLE hProc = OpenProcess (PROCESS_ALL_ACCESS, FALSE,
+ pe32.th32ProcessID);
+ if (!hProc)
+ {
+ ERRORPRINTF ("Failed to open process handle.");
+ continue;
+ }
+ if (!TerminateProcess (hProc, 1))
+ {
+ ERRORPRINTF ("Failed to terminate process.");
+ }
+ CloseHandle (hProc);
+ }
+ }
+ while (Process32Next (h, &pe32));
+ CloseHandle (h);
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Wed, Dec 24, 10:49 PM (1 d, 22 h)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
03/f5/064295f1c0602b3913fc39b23277
Attached To
rG GnuPG
Event Timeline
Log In to Comment