buildsystem tooling
authorJeremy Harris <jgh146exb@wizmail.org>
Tue, 13 Aug 2024 20:19:19 +0000 (21:19 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Wed, 14 Aug 2024 09:51:49 +0000 (10:51 +0100)
src/OS/Makefile-Base
src/scripts/Configure-Makefile
src/scripts/MakeLinks
src/scripts/routers-Makefile [new file with mode: 0755]
src/src/lookups/Makefile
src/src/routers/Makefile
test/runtest

index 5b74b6ac8d24dfd8e5366a918d8b7e025493eb6b..d45524561286e69e3f603857d7971f5a398ff29e 100644 (file)
@@ -968,6 +968,7 @@ buildlookups: config
 
 buildrouters: config
         @cd routers && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \
+          CFLAGS_DYNAMIC="$(CFLAGS_DYNAMIC)" \
           FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" HDRS="$(PHDRS)" \
           INCLUDE="$(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE)"
         @echo " "
@@ -976,6 +977,7 @@ buildrouters: config
 
 buildtransports: config
         @cd transports && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \
+          CFLAGS_DYNAMIC="$(CFLAGS_DYNAMIC)" \
           FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" HDRS="$(PHDRS)" \
           INCLUDE="$(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE)"
         @echo " "
@@ -984,6 +986,7 @@ buildtransports: config
 
 buildauths: config
         @cd auths && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \
+          CFLAGS_DYNAMIC="$(CFLAGS_DYNAMIC)" \
           FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" HDRS="$(PHDRS)" \
           INCLUDE="$(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE)"
         @echo " "
index 129f2a073ebb086db2f1ac6ee161763ecd0411b1..3b0528940ff311a0f73e6d2f86b04830f409006e 100755 (executable)
@@ -4,7 +4,7 @@
 # just got too horrendous to get it right in "make", because of the optionally
 # existing configuration files.
 #
-# Copyright (c) The Exim Maintainers 1995 - 2021
+# Copyright (c) The Exim Maintainers 1995 - 2024
 # SPDX-License-Identifier: GPL-2.0-or-later
 
 
@@ -291,6 +291,13 @@ rm -f $mftt
 cp ../src/lookups/Makefile $look_mf_pre
 ../scripts/lookups-Makefile
 
+class="routers"
+cp ../src/$class/Makefile $class/Makefile.predynamic
+../scripts/$class-Makefile
+mv routers/Makefile.postdynamic $class/Makefile
+rm $class/Makefile.predynamic
+class=
+
 # 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
index 355f4d6e9eeddc9d76cbc4208d312a9df60c0c85..f413c625edb11a1bd763a97089f372d4771d86e3 100755 (executable)
@@ -46,7 +46,8 @@ cd ..
 d="routers"
 mkdir $d
 cd $d
-for f in README Makefile accept.h accept.c dnslookup.h dnslookup.c \
+# Makefile is generated
+for f in README accept.h accept.c dnslookup.h dnslookup.c \
   ipliteral.h ipliteral.c iplookup.h iplookup.c manualroute.h \
   manualroute.c queryprogram.h queryprogram.c redirect.h redirect.c \
   rf_functions.h rf_change_domain.c rf_expand_data.c rf_get_errors_address.c \
diff --git a/src/scripts/routers-Makefile b/src/scripts/routers-Makefile
new file mode 100755 (executable)
index 0000000..5bb6a78
--- /dev/null
@@ -0,0 +1,180 @@
+#! /bin/sh
+
+# Copyright (c) The Exim Maintainers 1995 - 2021
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+# We turn the configure-built build-$foo/routers/Makefile.predynamic into Makefile
+
+# We always re-exec ourselves at least once, because it's the cleanest and
+# most portable way to turn on various features we expect of POSIX sh.
+if [ -z "$EXIM_ROUTER_MAKEFILE_ADJUSTED" ]
+then
+  SHELL=/bin/sh
+  EXIM_ROUTER_MAKEFILE_ADJUSTED=yes
+  export EXIM_ROUTER_MAKEFILE_ADJUSTED
+
+  # Solaris sh and tr are problematic until we get xpg4 variants
+  if [ -x /usr/xpg4/bin/sh ]
+  then
+    PATH="/usr/xpg4/bin:$PATH"
+    export PATH
+    SHELL=/usr/xpg4/bin/sh
+    export SHELL
+  fi
+
+  # IRIX uses /bin/ksh for sh but in a compatibility mode unless $_XPG == 1,
+  # where said compatibility mode disables $(...)
+  _XPG=1
+  export _XPG
+
+  # We need the _right_ tr, so must do that first; but if a shell which
+  # we're more confident is sane is available, let's try that.  Mostly,
+  # the problem is that "local" is not actually in "the" standard, it's
+  # just in every not-insane shell.  Though arguably, there are no shells
+  # with POSIX-ish syntax which qualify as "not insane".
+  for b in /bin/dash /bin/bash /usr/local/bin/bash
+  do
+    if [ -x "$b" ]
+    then
+      SHELL="$b"
+      break
+    fi
+  done
+  # if we get a report of a system with zsh but not bash, we can add that
+  # to the list, but be sure to enable sh_word_split in that case.
+
+  exec "$SHELL" "$0" "$@"
+fi
+
+input=routers/Makefile.predynamic
+target=routers/Makefile.postdynamic
+defs_source=Makefile-t
+tag_marker='MAGIC-TAG-MODS-OBJ-RULES-GO-HERE'
+
+tab='  '
+
+# We rely on tr(1) for translating case below.  Some people export
+# values of LC_CTYPE and LC_COLLATE which apparently break our assumptions.
+# We're a script expecting certain output based on known inputs and not dealing
+# with UTF8, so we should be safe doing this:
+LC_ALL=C
+export LC_ALL
+
+if [ -f "$defs_source" ]
+then
+  :
+  # we are happy
+else
+  echo >&2 "$0: ERROR: MISSING FILE '${defs_source}'"
+  echo >&2 "$0: SHOULD HAVE BEEN CALLED FROM scripts/Configure-Makefile"
+  exit 1
+fi
+
+# nb: do not permit leading whitespace for this, as CFLAGS_DYNAMIC is exported
+# to the lookups subdir via a line with leading whitespace which otherwise
+# matches
+if grep -q "^CFLAGS_DYNAMIC[ $tab?:]*=" "$defs_source"
+then
+  # we have a definition, we're good to go
+  echo >&2 ">>> Creating routers/Makefile for building dynamic modules"
+  enable_dynamic=yes
+else
+  echo >&2 ">>> Creating routers/Makefile without dynamic module support"
+  enable_dynamic=''
+  # We always do something now, since there should always be a lookup,
+  # and now we need to run in order to put the OBJ=$(OBJ)+ rules in.  So we
+  # continue on.
+fi
+
+# For the want_ checks, we need to let the user override values from the make
+# command-line, not just check the Makefile.
+
+want_dynamic() {
+  local dyn_name="$1"
+  local re="ROUTER_${dyn_name}[ $tab]*=[ $tab]*2"
+  env | grep -q "^$re"
+  if [ $? -eq 0 ]; then return 0; fi
+  grep -q "^[ $tab]*$re" "$defs_source"
+}
+
+want_at_all() {
+  local want_name="$1"
+  local re="ROUTER_${want_name}[ $tab]*=[ $tab]*."
+  env | grep -q "^$re"
+  if [ $? -eq 0 ]; then return 0; fi
+  grep -q "^[ $tab]*$re" "$defs_source"
+}
+
+# Adapted want_at_all above to work for EXPERIMENTAL features
+want_experimental() {
+  local want_name="$1"
+  local re="EXPERIMENTAL_${want_name}[ $tab]*=[ $tab]*."
+  env | grep -q "^$re"
+  if [ $? -eq 0 ]; then return 0; fi
+  grep -q "^[ $tab]*$re" "$defs_source"
+}
+
+# The values of these variables will be emitted into the Makefile.
+
+MODS=""
+OBJ=""
+
+emit_module_rule() {
+  local name="$1"
+  local mod_name pkgconf
+  if [ "${name%:*}" = "$name" ]
+  then
+    # Square brackets are redundant but benign for POSIX compliant tr,
+    # however Solaris /usr/bin/tr requires them. Sometimes Solaris
+    # gets installed without a complete set of xpg4 tools, sigh.
+    mod_name=$(echo $name | tr [A-Z] [a-z])
+  else
+    mod_name="${name#*:}"
+    name="${name%:*}"
+  fi
+
+  if want_dynamic "$name"
+  then
+    if [ -z "$enable_dynamic" ]; then
+      echo >&2 "Missing CFLAGS_DYNAMIC prevents building dynamic $name"
+      exit 1
+    fi
+    MODS="${MODS} ${mod_name}.so"
+#    pkgconf=$(grep "^ROUTER_${name}_PC" "$defs_source")
+#    if [ $? -eq 0 ]; then
+#      pkgconf=$(echo $pkgconf | sed 's/^.*= *//')
+#      echo "ROUTER_${mod_name}_INCLUDE = $(pkg-config --cflags $pkgconf)"
+#      echo "ROUTER_${mod_name}_LIBS = $(pkg-config --libs $pkgconf)"
+#    else
+#      grep "^ROUTER_${name}_" "$defs_source"
+#      echo "ROUTER_${mod_name}_INCLUDE = \$(ROUTER_${name}_INCLUDE)"
+#      echo "ROUTER_${mod_name}_LIBS = \$(ROUTER_${name}_LIBS)"
+#    fi
+  elif want_at_all "$name"
+  then
+    OBJ="${OBJ} ${mod_name}.o"
+  fi
+}
+
+rm -f "$target"
+exec 5>&1
+exec > "$target"
+
+sed -n "1,/$tag_marker/p" < "$input"
+
+for name_mod in \
+    ACCEPT DNSLOOKUP IPLITERAL IPLOOKUP MANUALROUTE QUERYPROGRAM REDIRECT
+do
+  emit_module_rule $name_mod
+done
+
+echo "MODS = $MODS"
+echo "OBJ = $OBJ"
+
+sed -n "/$tag_marker/,\$p" < "$input"
+
+exec >&5
+
+# Configure-Makefile will move $target into place
+
+# vim: set ft=sh sw=2 :
index f305e06550b48586e42972c96f93a7f4dce40818..12d9d88b4c7da9518f8a291d023817d97376bddf 100644 (file)
@@ -12,7 +12,6 @@
 
 
 all:             lookups.a lf_quote.o lf_check_file.o lf_sqlperform.o $(MODS)
-#               for f in *.so; do mv $$f `basename $$f .so`_lookup.so; done
 
 lookups.a:       $(OBJ)
                 @$(RM_COMMAND) -f lookups.a
@@ -31,47 +30,26 @@ lf_check_file.o: $(HDRS) lf_check_file.c  lf_functions.h
 lf_quote.o:      $(HDRS) lf_quote.c       lf_functions.h
 lf_sqlperform.o: $(HDRS) lf_sqlperform.c  lf_functions.h
 
-cdb.o:           $(HDRS) cdb.c
-dbmdb.o:         $(HDRS) dbmdb.c
-dnsdb.o:         $(HDRS) dnsdb.c
-dsearch.o:       $(HDRS) dsearch.c
-ibase.o:         $(HDRS) ibase.c
-ldap.o:          $(HDRS) ldap.c
-lmdb.o:          $(HDRS) lmdb.c
-json.o:          $(HDRS) json.c
-lsearch.o:       $(HDRS) lsearch.c
-mysql.o:         $(HDRS) mysql.c
-nis.o:           $(HDRS) nis.c
-nisplus.o:       $(HDRS) nisplus.c
-oracle.o:        $(HDRS) oracle.c
-passwd.o:        $(HDRS) passwd.c
-pgsql.o:         $(HDRS) pgsql.c
-readsock.o:      $(HDRS) readsock.c
-redis.o:         $(HDRS) redis.c
-spf.o:           $(HDRS) spf.c
-sqlite.o:        $(HDRS) sqlite.c
-testdb.o:        $(HDRS) testdb.c
-whoson.o:        $(HDRS) whoson.c
-
-cdb.so:           $(HDRS) cdb.c
-dbmdb.so:         $(HDRS) dbmdb.c
-dnsdb.so:         $(HDRS) dnsdb.c
-dsearch.so:       $(HDRS) dsearch.c
-ibase.so:         $(HDRS) ibase.c
-json.so:          $(HDRS) json.c
-ldap.so:          $(HDRS) ldap.c
-lmdb.so:          $(HDRS) lmdb.c
-lsearch.so:       $(HDRS) lsearch.c
-mysql.so:         $(HDRS) mysql.c
-nis.so:           $(HDRS) nis.c
-nisplus.so:       $(HDRS) nisplus.c
-oracle.so:        $(HDRS) oracle.c
-passwd.so:        $(HDRS) passwd.c
-pgsql.so:         $(HDRS) pgsql.c
-redis.so:         $(HDRS) redis.c
-spf.so:           $(HDRS) spf.c
-sqlite.so:        $(HDRS) sqlite.c
-testdb.so:        $(HDRS) testdb.c
-whoson.so:        $(HDRS) whoson.c
+cdb.o cdb.so:           $(HDRS) cdb.c
+dbmdb.o dbmdb.so:       $(HDRS) dbmdb.c
+dnsdb.o dnsdb.so:       $(HDRS) dnsdb.c
+dsearch.o dsearch.so:   $(HDRS) dsearch.c
+ibase.o ibase.so:       $(HDRS) ibase.c
+ldap.o ldap.so:         $(HDRS) ldap.c
+lmdb.o lmdb.so:         $(HDRS) lmdb.c
+json.o json.so:         $(HDRS) json.c
+lsearch.o lsearch.so:   $(HDRS) lsearch.c
+mysql.o mysql.so:       $(HDRS) mysql.c
+nis.o nis.so:           $(HDRS) nis.c
+nisplus.o nisplus.so:   $(HDRS) nisplus.c
+oracle.o oracle.so:     $(HDRS) oracle.c
+passwd.o passwd.so:     $(HDRS) passwd.c
+pgsql.o pgsql.so:       $(HDRS) pgsql.c
+readsock.o readsock.so: $(HDRS) readsock.c
+redis.o redis.so:       $(HDRS) redis.c
+spf.o spf.so:           $(HDRS) spf.c
+sqlite.o sqlite.so:     $(HDRS) sqlite.c
+testdb.o testdb.so:     $(HDRS) testdb.c
+whoson.o whoson.so:     $(HDRS) whoson.c
 
 # End
index 8f2432d5eb58356b88db293364072b2eba60c399..d13a493e9d4f8b448f815242b9c9311f9615d2db 100644 (file)
@@ -2,42 +2,59 @@
 # calling it routers.a. This is called from the main make file, after cd'ing
 # to the directors subdirectory. The library also contains functions that
 # are called only from within the individual routers.
+#
+# Copyright (c) The Exim Maintainers 2021 - 2024
 
-OBJ = accept.o dnslookup.o ipliteral.o iplookup.o manualroute.o \
-      queryprogram.o redirect.o \
-      rf_change_domain.o rf_expand_data.o rf_get_errors_address.o \
+# nb: at build time, the version of this file used will have had some
+#     extra variable definitions and prepended to it and module build rules
+#     interpolated below. This is done by scripts/routers-Makefile.
+
+# MAGIC-TAG-MODS-OBJ-RULES-GO-HERE
+
+RF_OBJ = rf_change_domain.o rf_expand_data.o rf_get_errors_address.o \
       rf_get_munge_headers.o rf_get_transport.o rf_get_ugid.o \
       rf_lookup_hostlist.o \
       rf_queue_add.o rf_self_action.o \
       rf_set_ugid.o
 
+OBJ += $(RF_OBJ)
+
+all:             routers.a $(MODS)
+
 routers.a:       $(OBJ)
                 @$(RM_COMMAND) -f routers.a
                 @echo "$(AR) routers.a"
                 @$(AR) routers.a $(OBJ)
                 $(RANLIB) $@
 
-.SUFFIXES:       .o .c
+.SUFFIXES:       .o .c .so
 .c.o:;           @echo "$(CC) $*.c"
                 $(FE)$(CC) -c $(CFLAGS) $(INCLUDE) $*.c
 
-rf_change_domain.o:      $(HDRS) rf_change_domain.c      rf_functions.h
-rf_expand_data.o:        $(HDRS) rf_expand_data.c        rf_functions.h
-rf_get_errors_address.o: $(HDRS) rf_get_errors_address.c rf_functions.h
-rf_get_munge_headers.o:  $(HDRS) rf_get_munge_headers.c  rf_functions.h
-rf_get_transport.o:      $(HDRS) rf_get_transport.c      rf_functions.h
-rf_get_ugid.o:           $(HDRS) rf_get_ugid.c           rf_functions.h
-rf_lookup_hostlist.o:    $(HDRS) rf_lookup_hostlist.c    rf_functions.h
-rf_queue_add.o:          $(HDRS) rf_queue_add.c          rf_functions.h
-rf_self_action.o:        $(HDRS) rf_self_action.c        rf_functions.h
-rf_set_ugid.o:           $(HDRS) rf_set_ugid.c           rf_functions.h
-
-accept.o:        $(HDRS) accept.c       rf_functions.h accept.h
-dnslookup.o:     $(HDRS) dnslookup.c    rf_functions.h dnslookup.h
-ipliteral.o:     $(HDRS) ipliteral.c    rf_functions.h ipliteral.h
-iplookup.o:      $(HDRS) iplookup.c     rf_functions.h iplookup.h
-manualroute.o:   $(HDRS) manualroute.c  rf_functions.h manualroute.h
-queryprogram.o:  $(HDRS) queryprogram.c rf_functions.h queryprogram.h
-redirect.o:      $(HDRS) redirect.c     rf_functions.h redirect.h
+.c.so:;          @echo "$(CC) -shared $*.c"
+                $(FE)$(CC) -DDYNLOOKUP $(CFLAGS_DYNAMIC) $(CFLAGS) $(INCLUDE) $(DLFLAGS) $*.c -o $@
+
+
+
+$(OBJ) $(MOD): $(HDRS) rf_functions.h
+
+rf_change_domain.o:      rf_change_domain.c
+rf_expand_data.o:        rf_expand_data.c
+rf_get_errors_address.o: rf_get_errors_address.c
+rf_get_munge_headers.o:  rf_get_munge_headers.c
+rf_get_transport.o:      rf_get_transport.c
+rf_get_ugid.o:           rf_get_ugid.c
+rf_lookup_hostlist.o:    rf_lookup_hostlist.c
+rf_queue_add.o:          rf_queue_add.c
+rf_self_action.o:        rf_self_action.c
+rf_set_ugid.o:           rf_set_ugid.c
+
+accept.o accept.so:             accept.c       accept.h
+dnslookup.o dnslookup.so:       dnslookup.c    dnslookup.h
+ipliteral.o ipliteral.so:       ipliteral.c    ipliteral.h
+iplookup.o iplookup.so:         iplookup.c     iplookup.h
+manualroute.o manualroute.so:   manualroute.c  manualroute.h
+queryprogram.o queryprogram.so: queryprogram.c queryprogram.h
+redirect.o redirect.so:         redirect.c     redirect.h
 
 # End
index 1d7589a694010826698f1f987c58f5178b437cd3..2922335511654bc68864ddb9a7efe6c3e48d5375 100755 (executable)
@@ -1298,11 +1298,15 @@ RESET_AFTER_EXTRA_LINE_READ:
 
     # drop lookups
     next if /^$time_pid?(?: Lookups\ \((?:built-in|dynamic)\):
-                                       |Loaded\ "[^.]+\.so"\ \(\d+\ lookup\ types\)
+                                       | Loaded\ "[^.]+\.so"\ \(\d+\ lookup\ types\)
                                        | Loading\ lookup\ modules\ from
                                        | Loaded\ \d+\ lookup\ modules
                                        | Total\ \d+\ lookups)/x;
 
+    # drop loads of dyn-module drivers
+    next if /^$time_pid?(?:Loading\ \w+\ (?:router|transport|auth)\ driver\ from
+                         | Loaded\ \w+\ (?:router|transport|auth)$)/x;
+
     # drop compiler information
     next if /^$time_pid?Compiler:/;