1
0
Fork 0
exim4/scripts/Configure-Makefile
Daniel Baumann 802ab461a9
Adding upstream version 4.98.2.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-21 14:27:17 +02:00

362 lines
11 KiB
Bash
Executable file

#! /bin/sh
# Shell script to build Makefile in a build directory. It must be called
# from inside the directory. It does its own checking of when to rebuild; it
# just got too horrendous to get it right in "make", because of the optionally
# existing configuration files.
#
# Copyright (c) The Exim Maintainers 1995 - 2021
# SPDX-License-Identifier: GPL-2.0-or-later
LC_ALL=C
export LC_ALL
# First off, get the OS type, and check that there is a make file for it.
ostype=`../scripts/os-type -generic` || exit 1
if [ ! -r ../OS/Makefile-$ostype ] ; then
echo ""
echo "*** Sorry - operating system $ostype is not supported"
echo "*** See OS/Makefile-* for supported systems" 1>&2
echo ""
exit 1
fi
# We also need the architecture type, in order to test for any architecture-
# specific configuration files.
archtype=`../scripts/arch-type` || exit 1
# Now test for either the non-existence of Makefile, or for any of its
# components being newer. Note that the "newer" script gives the right
# answer (for our purposes) when the first file is non-existent.
editme=../Local/Makefile
rebuild=yes
if [ -f Makefile ] ; then
rebuild=no
if ../scripts/newer $editme Makefile || \
../scripts/newer $editme-$ostype Makefile || \
../scripts/newer $editme-$archtype Makefile || \
../scripts/newer $editme-$ostype-$archtype Makefile || \
../scripts/newer ../scripts/Configure-Makefile Makefile || \
../scripts/newer ../OS/Makefile-Base Makefile || \
../scripts/newer ../OS/Makefile-Default Makefile
then
rebuild=yes
fi
fi
# If the "build" variable is set it means that a build name was explicitly
# given. Arrange to pick up a build-specific configuration file.
if [ "X$build" != "X" ] ; then
mfb=Local/Makefile-$build
if ../scripts/newer $editme-$build Makefile ; then
rebuild=yes
fi
else
mfb=
fi
# If Makefile is up-to-date, no need to rebuild it.
if [ $rebuild = no ] ; then
echo "\`Makefile' is up to date."
echo " "
exit
fi
# Makefile needs to be rebuilt in the current directory by joining
# the generic default makefile, the OS base makefile, and then local
# generic, OS-specific, architecture-specific, and OS+architecture-specific
# makefiles, if they exist. These files all contain macro definitions, with
# later definitions overriding earlier ones. Make a temporary file first, in
# case things go wrong. A second temporary is needed for sorting out the
# default Perl stuff. Use short macro names to save typing.
mf=Makefile
mft=$mf-t
mftt=$mf-tt
mftepcp=$mf-tepcp
mftepcp2=$mf-tepcp2
look_mf=lookups/Makefile
look_mf_pre=${look_mf}.predynamic
look_mf_post=${look_mf}.postdynamic
# Ensure the temporary does not exist and start the new one by setting
# the OSTYPE and ARCHTYPE variables.
rm -f $mft $mftt $mftepcp $mftepcp2 $look_mf-t
(echo "OSTYPE=$ostype"; echo "ARCHTYPE=$archtype"; echo "") > $mft || exit 1
# Now concatenate the files to the temporary file. Copy the files using sed to
# remove comments, blank lines, and trailing white space.
# BEWARE: a tab character is needed in the sed command below. It has had
# a nasty tendency to get lost in the past, causing a problem if a tab has
# actually been present in one of the files. Use a variable to hold a space
# and a tab to keep the tab in one place.
st=' '
for f in OS/Makefile-Default \
OS/Makefile-$ostype \
Local/Makefile \
Local/Makefile-$ostype \
Local/Makefile-$archtype \
Local/Makefile-$ostype-$archtype \
$mfb
do if test -r ../$f
then echo "# From $f"
sed "/^#/d;/^[$st]*\$/d;s/[$st]*\$//" ../$f || exit 1
echo "# End of $f"
echo ""
fi
done \
| sed 's/^TMPDIR=/EXIM_&/' \
>> $mft || exit 1
# handle PKG_CONFIG_PATH because we need it in our env, and we want to handle
# wildcards; note that this logic means all setting _appends_ values, never
# replacing; if that's a problem, we can revisit.
sed -n "s/^[$st]*PKG_CONFIG_PATH[$st]*[+]*=[$st]*//p" $mft | \
sed "s/[$st]*\$//" >> $mftepcp
if test -s ./$mftepcp
then
# expand any wildcards and strip spaces, to make it a real PATH-like variable
( IFS=":${IFS-$st}"; for P in `cat ./$mftepcp`; do echo "$P"; done ) | xargs | sed "s/[$st]/:/g" >./$mftepcp2
sed "s/^/PKG_CONFIG_PATH='/" < ./$mftepcp2 | sed "s/\$/'/" > ./$mftepcp
. ./$mftepcp
export PKG_CONFIG_PATH
egrep -v "^[$st]*PKG_CONFIG_PATH[$st]*=" ./$mft > ./$mftt
rm -f ./$mft
(
echo "# Collapsed PKG_CONFIG_PATH in build-prep:"
sed "s/'//g" ./$mftepcp
echo "# End of collapsed PKG_CONFIG_PATH"
echo ""
cat ./$mftt
) > ./$mft
rm -f ./$mftt
fi
rm -f ./$mftepcp ./$mftepcp2
# handle pkg-config
# beware portability of extended regexps with sed.
egrep "^[$st]*(AUTH|LOOKUP)_[A-Z0-9_]*[$st]*=[$st]*" $mft | \
sed "s/[$st]*=/='/" | \
sed "s/\$/'/" > $mftt
egrep "^[$st]*((USE_(OPENSSL|GNUTLS)_PC)|SUPPORT_TLS|USE_GNUTLS|PCRE2?_CONFIG|AVOID_GNUTLS_PKCS11)[$st]*=[$st]*" $mft | \
sed "s/[$st]*=/='/" | \
sed "s/\$/'/" >> $mftt
if test -s $mftt
then
(
echo "# pkg-config fixups"
. ./$mftt
for var in `cut -d = -f 1 < $mftt`; do
case $var in
USE_*_PC)
eval "pc_value=\"\$$var\""
need_this=''
need_core=''
if [ ".$DISABLE_TLS" = .yes ]; then
# no TLS, not referencing
true
elif [ ".$var" = ".USE_GNUTLS_PC" ] && [ ".$USE_GNUTLS" != "." ]; then
need_this=t
need_core="gnutls-special"
elif [ ".$var" = ".USE_OPENSSL_PC" ] && [ ".$USE_GNUTLS" = "." ]; then
need_this=t
need_core=t
fi
if [ ".$need_this" != "." ]; then
tls_include=`pkg-config --cflags $pc_value`
if [ $? -ne 0 ]; then
echo >&2 "*** Missing pkg-config for package $pc_value (for Exim $var build option)"
exit 1
fi
tls_libs=`pkg-config --libs $pc_value`
echo "TLS_INCLUDE=$tls_include"
echo "TLS_LIBS=$tls_libs"
# With hash.h pulling crypto into the core, we need to also handle that
if [ ".$need_this" = ".t" ]; then
echo "CFLAGS += $tls_include"
echo "LDFLAGS += $tls_libs"
elif [ ".$need_this" = ".gnutls-special" ]; then
if pkg-config --atleast-version=2.10 gnutls ; then
echo "CFLAGS += $tls_include"
echo "LDFLAGS += $tls_libs"
else
echo "CFLAGS += `libgcrypt-config --cflags`"
echo "LDFLAGS += `libgcrypt-config --libs`"
fi
fi
fi
;;
*_PC)
eval "pc_value=\"\$$var\""
base=`echo $var | sed 's/_PC$//'`
eval "basevalue=\"\$$base\""
if [ ".$basevalue" = "." ]; then
# not pulling in this module, _PC defined as default? Ignore
true
elif [ $basevalue = 2 ]; then
# module; handled in scripts/lookups-Makefile
true
else
# main binary
cflags=`pkg-config --cflags $pc_value`
if [ $? -ne 0 ]; then
echo >&2 "*** Missing pkg-config for package $pc_value (for Exim $var build option)"
exit 1
fi
libs=`pkg-config --libs $pc_value`
if [ "$var" != "${var#LOOKUP_}" ]; then
echo "LOOKUP_INCLUDE += $cflags"
echo "LOOKUP_LIBS += $libs"
elif [ "$var" != "${var#AUTH_}" ]; then
echo "CFLAGS += $cflags"
echo "AUTH_LIBS += $libs"
else
echo >&2 "Don't know how to handle pkg-config for $var"
fi
fi
;;
PCRE_CONFIG)
case $PCRE_CONFIG in
yes|YES|y|Y)
echo >&2 "pcre is no longer supported; migrate to pcre2"
exit 1
# cflags=`pcre-config --cflags`
# if [ $? -ne 0 ]; then
# echo >&2 "*** Missing pcre-config for regular expression support"
# exit 1
# fi
# libs=`pcre-config --libs`
# if [ ".$cflags" != "." ]; then
# echo "INCLUDE += $cflags"
# fi
# echo "PCRE_LIBS=$libs"
;;
esac
;;
PCRE2_CONFIG)
case $PCRE2_CONFIG in
yes|YES|y|Y)
cflags=`pcre2-config --cflags`
if [ $? -ne 0 ]; then
echo >&2 "*** Missing pcre2-config for regular expression support"
exit 1
fi
libs=`pcre2-config --libs8`
if [ ".$cflags" != "." ]; then
echo "INCLUDE += $cflags"
fi
echo "PCRE_LIBS=$libs"
;;
esac
;;
AVOID_GNUTLS_PKCS11)
echo "$var=yes"
;;
esac
done
echo "# End of pkg-config fixups"
echo
) >> $mft
subexit=$?
if [ $subexit -ne 0 ]; then
exit $subexit
fi
fi
rm -f $mftt
# make the lookups Makefile with the definitions
# the auxiliary script generates $look_mf_post from $look_mf_pre
cp ../src/lookups/Makefile $look_mf_pre
../scripts/lookups-Makefile
# See if there is a definition of EXIM_PERL in what we have built so far.
# If so, run Perl to find the default values for PERL_CC, PERL_CCOPTS,
# and PERL_LIBS. These need to be put at the top of the Makefile, so we rename
# what we have so far and then copy it afterwards. Use the value of PERL_COMMAND
# if it has been defined.
EXIM_PERL=`grep EXIM_PERL $mft`
PERL_COMMAND=`grep PERL_COMMAND $mft | sed -e "\\$!d;s/^[$st]*PERL_COMMAND[$st]*=[$st]*//"`
if [ "${PERL_COMMAND}" = "" ] ; then
PERL_COMMAND='perl'
fi
if [ "${EXIM_PERL}" != "" ] ; then
testperl=`$PERL_COMMAND --version`
if [ "$testperl" = "" ] ; then
echo "*** EXIM_PERL is set, but '$PERL_COMMAND --version' failed"
exit 1
fi
EXTUTILS_EMBED_NOT_INSTALLED=`$PERL_COMMAND -MExtUtils::Embed -e ";" 2>&1`
if [ "${EXTUTILS_EMBED_NOT_INSTALLED}" != "" ] ; then
echo "Please install ExtUtils::Embed for $PERL_COMMAND"
exit 1;
fi
mv $mft $mftt
echo "PERL_CC=`$PERL_COMMAND -MConfig -e 'print $Config{cc}'`" >>$mft
echo "PERL_CCOPTS=`$PERL_COMMAND -MExtUtils::Embed -e ccopts`" >>$mft
echo "PERL_LIBS=`$PERL_COMMAND -MExtUtils::Embed -e ldopts`" >>$mft
echo "" >>$mft
cat $mftt >> $mft
rm -f $mftt
fi
# Record the build variable in the Makefile.
echo "build=$build" >>$mft
echo "" >>$mft
# Finally, join on the generic base make file, which contains the actual
# rules and stuff.
echo "# From ../OS/Makefile-Base" >> $mft
cat ../OS/Makefile-Base >> $mft || exit 1
# If the new makefile is the same as the existing one, say so, and just
# update the timestamp. Otherwise remove the old and install the new.
if [ -s $mf ] && cmp -s $mft $mf && [ -s $look_mf ] && cmp -s $look_mf_post $look_mf
then echo ">>> rebuilt $mf unchanged"
echo " "
touch $mf || exit
rm -f $mft $look_mf_pre $look_mf_post
elif rm -f $mf $look_mf $look_mf_pre
mv $mft $mf
mv $look_mf_post $look_mf
then echo ">>> New $mf & $look_mf installed"
echo '>>> Use "make makefile" if you need to force rebuilding of the makefile'
echo " "
else echo " "
echo "*** Failed to install $mf - see $mft"
echo " (or $look_mft)"
echo " "
exit 1;
fi
# vim: set ft=sh :
# End of Configure-Makefile