build: Cope with the `subdir-objects' world Automake wants us to live in.
authorMark Wooding <mdw@distorted.org.uk>
Sun, 15 May 2016 13:57:12 +0000 (14:57 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 16 May 2016 08:19:35 +0000 (09:19 +0100)
Essentially, the Automake developers want to put the objects for
`PATH/TO/FILE.c' in `PATH/TO/FILE.o'.  This is wrongheaded, but we don't
seem to get much choice.  Unfortunately, it's also buggered.

This causes trouble for our precomputed source files.  The obvious
trouble happens if the source file we reference is explicitly in the
source tree, so we'll need to refer to the files differently in
`mumble_SOURCES' lines and the machinery which makes the generates the
files.  The obvious answer would be to introduce two variables for
referring to the precomptations tree.  This is where Automake's bugs
start to really bite.

The main problem is with Automake's automatic dependency-tracking
machinery.  For each object `FILE.o' which is going to be built, it
wants to make a `.deps/FILE.Po' file to track the detected dependencies.
Furthermore, the generated makefiles get unhappy if these files don't
already exist, so there's magic hung off the side of `config.status' to
make them.

This would be great, but the Automake machinery doesn't actually work
properly.  If you refer to a source file via a variable reference,
something like `$(things)/file.c', then Automake's `config.status' magic
creates a dependency-tracking file which is literally named
`.deps/$(things)/file.Po', and then the makefile gets upset when it
tries to include `$(things)/.deps/file.Po'.

So we have to write explicit relative paths to precomputed source file
names in `nodist_mumble_SOURCES' lists (because we make our own
arrangements for distributing them).

Even worse, in older Automake versions, the `distclean' rule prematurely
zaps the dependency-tracking files under `precomps/', so I've had to
split the precomputed sources into subdirectories for each main source
directory.

On the plus side, the `symm/' build tree is less of a mess now that all
of the boring per-mode objects are tucked away in their own
subdirectory.

configure.ac
math/Makefile.am
misc/Makefile.am
symm/Makefile.am
vars.am

index 8496cc3..b88f1fd 100644 (file)
@@ -31,7 +31,7 @@ mdw_AUTO_VERSION
 AC_INIT([catacomb], AUTO_VERSION, [mdw@distorted.org.uk])
 AC_CONFIG_SRCDIR([catacomb.pc.in])
 AC_CONFIG_AUX_DIR([config])
-AM_INIT_AUTOMAKE([foreign parallel-tests])
+AM_INIT_AUTOMAKE([foreign parallel-tests subdir-objects])
 mdw_SILENT_RULES
 
 AC_PROG_CC
index 7cabf89..bca64be 100644 (file)
@@ -201,18 +201,19 @@ pkginclude_HEADERS        += limlee.h
 libmath_la_SOURCES     += limlee.c
 
 ## A table of small prime numbers.
-pkginclude_HEADERS     += $(precomp)/primetab.h
-libmath_la_SOURCES     += $(precomp)/primetab.c
-PRECOMPS               += $(precomp)/primetab.h $(precomp)/primetab.c
+pkginclude_HEADERS     += $(precomp)/math/primetab.h
+nodist_libmath_la_SOURCES += ../precomp/math/primetab.c
+PRECOMPS               += $(precomp)/math/primetab.h \
+                          $(precomp)/math/primetab.c
 PRECOMP_PROGS          += genprimes
 genprimes_LDADD                 = $(mLib_LIBS)
 if !CROSS_COMPILING
-$(precomp)/primetab.h: $(precomp)/primetab.c
-$(precomp)/primetab.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/math/primetab.h: $(precomp)/math/primetab.c
+$(precomp)/math/primetab.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/math
        $(AM_V_at)$(MAKE) genprimes$e
        $(AM_V_GEN)./genprimes -sCATACOMB_PRIMETAB_H \
-               -h$(precomp)/primetab.h -c$(precomp)/primetab.c \
+               -h$(precomp)/math/primetab.h -c$(precomp)/math/primetab.c \
                -n256 -t"unsigned short" -iprimetab
 endif
 
@@ -239,7 +240,7 @@ libmath_la_SOURCES  += prim.c
 pkginclude_HEADERS     += primeiter.h
 libmath_la_SOURCES     += primeiter.c
 TESTS                  += primeiter.$t
-primeiter.lo: $(precomp)/wheel.h
+primeiter.lo: $(precomp)/math/wheel.h
 
 ## The Miller--Rabin primality test.
 pkginclude_HEADERS     += rabin.h
@@ -251,18 +252,18 @@ pkginclude_HEADERS        += strongprime.h
 libmath_la_SOURCES     += strongprime.c
 
 ## A `wheel', used by the prime iteration machinery.
-pkginclude_HEADERS     += $(precomp)/wheel.h
-libmath_la_SOURCES     += $(precomp)/wheel.c
-PRECOMPS               += $(precomp)/wheel.h $(precomp)/wheel.c
+pkginclude_HEADERS     += $(precomp)/math/wheel.h
+nodist_libmath_la_SOURCES += ../precomp/math/wheel.c
+PRECOMPS               += $(precomp)/math/wheel.h $(precomp)/math/wheel.c
 PRECOMP_PROGS          += genwheel
 genwheel_LDADD          = $(mLib_LIBS)
 if !CROSS_COMPILING
-$(precomp)/wheel.h: $(precomp)/wheel.c
-$(precomp)/wheel.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/math/wheel.h: $(precomp)/math/wheel.c
+$(precomp)/math/wheel.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/math
        $(AM_V_at)$(MAKE) genwheel$e
        $(AM_V_GEN)./genwheel -sCATACOMB_WHEEL_H \
-               -h$(precomp)/wheel.h -c$(precomp)/wheel.c \
+               -h$(precomp)/math/wheel.h -c$(precomp)/math/wheel.c \
                -n5 -t"unsigned char" -iwheel
 endif
 
@@ -284,15 +285,17 @@ libmath_la_SOURCES        += gfx.c
 TESTS                  += gfx.$t
 libmath_la_SOURCES     += gfx-kmul.c
 TESTS                  += gfx-kmul.$t
-libmath_la_SOURCES     += gfx-sqr.c $(precomp)/gfx-sqrtab.c
-PRECOMPS               += $(precomp)/gfx-sqrtab.c
+libmath_la_SOURCES     += gfx-sqr.c
+nodist_libmath_la_SOURCES += ../precomp/math/gfx-sqrtab.c
+PRECOMPS               += $(precomp)/math/gfx-sqrtab.c
 PRECOMP_PROGS          += gfx-sqr-mktab
 if !CROSS_COMPILING
-$(precomp)/gfx-sqrtab.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/math/gfx-sqrtab.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/math
        $(AM_V_at)$(MAKE) gfx-sqr-mktab$e
-       $(AM_V_GEN)./gfx-sqr-mktab >$(precomp)/gfx-sqrtab.c.new && \
-               mv $(precomp)/gfx-sqrtab.c.new $(precomp)/gfx-sqrtab.c
+       $(AM_V_GEN)./gfx-sqr-mktab >$(precomp)/math/gfx-sqrtab.c.new && \
+               mv $(precomp)/math/gfx-sqrtab.c.new \
+                       $(precomp)/math/gfx-sqrtab.c
 endif
 TESTS                  += gfx-sqr.$t
 EXTRA_DIST             += t/gfx
index 54be12a..dc758f0 100644 (file)
@@ -28,6 +28,7 @@ include $(top_srcdir)/vars.am
 
 noinst_LTLIBRARIES      = libmisc.la
 libmisc_la_SOURCES      =
+nodist_libmisc_la_SOURCES =
 
 TEST_LIBS               = libmisc.la
 
@@ -37,15 +38,16 @@ TEST_LIBS            = libmisc.la
 ## Efficient sharing over GF(2^8).
 pkginclude_HEADERS     += gfshare.h
 libmisc_la_SOURCES     += gfshare.c
-libmisc_la_SOURCES     += $(precomp)/gfshare-tab.c
-PRECOMPS               += $(precomp)/gfshare-tab.c
+nodist_libmisc_la_SOURCES += ../precomp/misc/gfshare-tab.c
+PRECOMPS               += $(precomp)/misc/gfshare-tab.c
 PRECOMP_PROGS          += gfshare-mktab
 if !CROSS_COMPILING
-$(precomp)/gfshare-tab.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/misc/gfshare-tab.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/misc
        $(AM_V_at)$(MAKE) gfshare-mktab$e
-       $(AM_V_GEN)./gfshare-mktab >$(precomp)/gfshare-tab.c.new && \
-               mv $(precomp)/gfshare-tab.c.new $(precomp)/gfshare-tab.c
+       $(AM_V_GEN)./gfshare-mktab >$(precomp)/misc/gfshare-tab.c.new && \
+               mv $(precomp)/misc/gfshare-tab.c.new \
+                       $(precomp)/misc/gfshare-tab.c
 endif
 TESTS                  += gfshare.$t
 
index 63bf26b..7deed65 100644 (file)
@@ -102,16 +102,17 @@ pkginclude_HEADERS        += $(BLKC_H)
 
 ## Schneier's `Blowfish' block cipher.
 BLKCS                  += blowfish
-libsymm_la_SOURCES     += $(precomp)/blowfish-tab.c
-PRECOMPS               += $(precomp)/blowfish-tab.c
+nodist_libsymm_la_SOURCES += ../precomp/symm/blowfish-tab.c
+PRECOMPS               += $(precomp)/symm/blowfish-tab.c
 PRECOMP_PROGS          += blowfish-mktab
 blowfish_mktab_CPPFLAGS         = $(AM_CPPFLAGS) -DQUIET
 if !CROSS_COMPILING
-$(precomp)/blowfish-tab.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/symm/blowfish-tab.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/symm
        $(AM_V_at)$(MAKE) blowfish-mktab$e
-       $(AM_V_GEN)./blowfish-mktab >$(precomp)/blowfish-tab.c.new && \
-               mv $(precomp)/blowfish-tab.c.new $(precomp)/blowfish-tab.c
+       $(AM_V_GEN)./blowfish-mktab >$(precomp)/symm/blowfish-tab.c.new && \
+               mv $(precomp)/symm/blowfish-tab.c.new \
+                       $(precomp)/symm/blowfish-tab.c
 endif
 
 ## Adams and Tavares' `CAST' block ciphers.
@@ -128,15 +129,16 @@ t/cast256: t/cast256.aes
 
 ## IBM's `DES' block cipher, by Feistel, Coppersmith, and others.
 BLKCS                  += des des3
-libsymm_la_SOURCES     += des-base.h $(precomp)/des-tab.c
-PRECOMPS               += $(precomp)/des-tab.c
+libsymm_la_SOURCES     += des-base.h
+nodist_libsymm_la_SOURCES += ../precomp/symm/des-tab.c
+PRECOMPS               += $(precomp)/symm/des-tab.c
 PRECOMP_PROGS          += des-mktab
 if !CROSS_COMPILING
-$(precomp)/des-tab.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/symm/des-tab.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/symm
        $(AM_V_at)$(MAKE) des-mktab$e
-       $(AM_V_GEN)./des-mktab >$(precomp)/des-tab.c.new && \
-               mv $(precomp)/des-tab.c.new $(precomp)/des-tab.c
+       $(AM_V_GEN)./des-mktab >$(precomp)/symm/des-tab.c.new && \
+               mv $(precomp)/symm/des-tab.c.new $(precomp)/symm/des-tab.c
 endif
 
 ## Rivest's `DESX' variant, with pre- and post-whitening.
@@ -148,15 +150,15 @@ BLKCS                     += idea
 
 ## IBM's `MARS' block cipher.
 BLKCS                  += mars
-libsymm_la_SOURCES     += $(precomp)/mars-tab.c
-PRECOMPS               += $(precomp)/mars-tab.c
+nodist_libsymm_la_SOURCES += ../precomp/symm/mars-tab.c
+PRECOMPS               += $(precomp)/symm/mars-tab.c
 PRECOMP_PROGS          += mars-mktab
 if !CROSS_COMPILING
-$(precomp)/mars-tab.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/symm/mars-tab.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/symm
        $(AM_V_at)$(MAKE) mars-mktab$e
-       $(AM_V_GEN)./mars-mktab >$(precomp)/mars-tab.c.new && \
-               mv $(precomp)/mars-tab.c.new $(precomp)/mars-tab.c
+       $(AM_V_GEN)./mars-mktab >$(precomp)/symm/mars-tab.c.new && \
+               mv $(precomp)/symm/mars-tab.c.new $(precomp)/symm/mars-tab.c
 endif
 mars.$t: t/mars
 EXTRA_DIST             += t/mars.aes
@@ -180,15 +182,16 @@ BLKCS                     += rc5
 ## Daemen and Rijmen's `Rijndael' block cipher, selected as AES.
 BLKCS                  += rijndael rijndael192 rijndael256
 libsymm_la_SOURCES     += rijndael-base.h rijndael-base.c
-libsymm_la_SOURCES     += $(precomp)/rijndael-tab.c
-PRECOMPS               += $(precomp)/rijndael-tab.c
+nodist_libsymm_la_SOURCES += ../precomp/symm/rijndael-tab.c
+PRECOMPS               += $(precomp)/symm/rijndael-tab.c
 PRECOMP_PROGS          += rijndael-mktab
 if !CROSS_COMPILING
-$(precomp)/rijndael-tab.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/symm/rijndael-tab.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/symm
        $(AM_V_at)$(MAKE) rijndael-mktab$e
-       $(AM_V_GEN)./rijndael-mktab >$(precomp)/rijndael-tab.c.new && \
-               mv $(precomp)/rijndael-tab.c.new $(precomp)/rijndael-tab.c
+       $(AM_V_GEN)./rijndael-mktab >$(precomp)/symm/rijndael-tab.c.new && \
+               mv $(precomp)/symm/rijndael-tab.c.new \
+                       $(precomp)/symm/rijndael-tab.c
 endif
 rijndael.$t: t/rijndael
 EXTRA_DIST             += t/rijndael.aes
@@ -201,16 +204,17 @@ t/rijndael: t/rijndael.aes
 
 ## Massey's `SAFER' block ciphers.
 BLKCS                  += safer safersk
-libsymm_la_SOURCES     += $(precomp)/safer-tab.c
-PRECOMPS               += $(precomp)/safer-tab.c
+nodist_libsymm_la_SOURCES += ../precomp/symm/safer-tab.c
+PRECOMPS               += $(precomp)/symm/safer-tab.c
 PRECOMP_PROGS          += safer-mktab
 STUBS_HDR              += SAFER-SK,safersk,safer
 if !CROSS_COMPILING
-$(precomp)/safer-tab.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/symm/safer-tab.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/symm
        $(AM_V_at)$(MAKE) safer-mktab$e
-       $(AM_V_GEN)./safer-mktab >$(precomp)/safer-tab.c.new && \
-               mv $(precomp)/safer-tab.c.new $(precomp)/safer-tab.c
+       $(AM_V_GEN)./safer-mktab >$(precomp)/symm/safer-tab.c.new && \
+               mv $(precomp)/symm/safer-tab.c.new \
+                       $(precomp)/symm/safer-tab.c
 endif
 
 ## Anderson, Biham and Knudsen's `Serpent' block cipher.
@@ -234,15 +238,16 @@ libsymm_la_SOURCES        += skipjack-tab.c
 
 ## Daemen and Rijmen's `Square' block cipher.
 BLKCS                  += square
-libsymm_la_SOURCES     += $(precomp)/square-tab.c
-PRECOMPS               += $(precomp)/square-tab.c
+nodist_libsymm_la_SOURCES += ../precomp/symm/square-tab.c
+PRECOMPS               += $(precomp)/symm/square-tab.c
 PRECOMP_PROGS          += square-mktab
 if !CROSS_COMPILING
-$(precomp)/square-tab.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/symm/square-tab.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/symm
        $(AM_V_at)$(MAKE) square-mktab$e
-       $(AM_V_GEN)./square-mktab >$(precomp)/square-tab.c.new && \
-               mv $(precomp)/square-tab.c.new $(precomp)/square-tab.c
+       $(AM_V_GEN)./square-mktab >$(precomp)/symm/square-tab.c.new && \
+               mv $(precomp)/symm/square-tab.c.new \
+                       $(precomp)/symm/square-tab.c
 endif
 
 ## Wheeler and Needham's `TEA' and `XTEA' block ciphers.
@@ -251,15 +256,16 @@ BLKCS                     += tea xtea
 ## Schneier, Kelsey, Whiting, Wagner, Hall and Ferguson's `Twofish' block
 ## cipher.
 BLKCS                  += twofish
-libsymm_la_SOURCES     += $(precomp)/twofish-tab.c
-PRECOMPS               += $(precomp)/twofish-tab.c
+nodist_libsymm_la_SOURCES += ../precomp/symm/twofish-tab.c
+PRECOMPS               += $(precomp)/symm/twofish-tab.c
 PRECOMP_PROGS          += twofish-mktab
 if !CROSS_COMPILING
-$(precomp)/twofish-tab.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/symm/twofish-tab.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/symm
        $(AM_V_at)$(MAKE) twofish-mktab$e
-       $(AM_V_GEN)./twofish-mktab >$(precomp)/twofish-tab.c.new && \
-               mv $(precomp)/twofish-tab.c.new $(precomp)/twofish-tab.c
+       $(AM_V_GEN)./twofish-mktab >$(precomp)/symm/twofish-tab.c.new && \
+               mv $(precomp)/symm/twofish-tab.c.new \
+                       $(precomp)/symm/twofish-tab.c
 endif
 twofish.$t: t/twofish
 EXTRA_DIST             += t/twofish.aes
@@ -316,29 +322,33 @@ STUBS_HDR         += SHA-384,sha384,sha512
 
 ## Anderson and Biham's `Tiger' hash function.
 HASHES                 += tiger
-libsymm_la_SOURCES     += tiger-base.h $(precomp)/tiger-tab.c
-PRECOMPS               += $(precomp)/tiger-tab.c
+libsymm_la_SOURCES     += tiger-base.h
+nodist_libsymm_la_SOURCES += ../precomp/symm/tiger-tab.c
+PRECOMPS               += $(precomp)/symm/tiger-tab.c
 PRECOMP_PROGS          += tiger-mktab
 if !CROSS_COMPILING
-$(precomp)/tiger-tab.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/symm/tiger-tab.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/symm
        $(AM_V_at)$(MAKE) tiger-mktab$e
-       $(AM_V_GEN)./tiger-mktab >$(precomp)/tiger-tab.c.new && \
-               mv $(precomp)/tiger-tab.c.new $(precomp)/tiger-tab.c
+       $(AM_V_GEN)./tiger-mktab >$(precomp)/symm/tiger-tab.c.new && \
+               mv $(precomp)/symm/tiger-tab.c.new \
+                       $(precomp)/symm/tiger-tab.c
 endif
 
 ## Barreto and Rijmen's `Whirlpool' hash function.
 HASHES                 += whirlpool whirlpool256
-libsymm_la_SOURCES     += $(precomp)/whirlpool-tab.c
-PRECOMPS               += $(precomp)/whirlpool-tab.c
+nodist_libsymm_la_SOURCES += ../precomp/symm/whirlpool-tab.c
+PRECOMPS               += $(precomp)/symm/whirlpool-tab.c
 PRECOMP_PROGS          += whirlpool-mktab
 STUBS_HDR              += Whirlpool-256,whirlpool256,whirlpool
 if !CROSS_COMPILING
-$(precomp)/whirlpool-tab.c:
-       $(AM_V_at)$(MKDIR_P) $(precomp)
+$(precomp)/symm/whirlpool-tab.c:
+       $(AM_V_at)$(MKDIR_P) $(precomp)/symm
        $(AM_V_at)$(MAKE) whirlpool-mktab$e
-       $(AM_V_GEN)./whirlpool-mktab >$(precomp)/whirlpool-tab.c.new && \
-               mv $(precomp)/whirlpool-tab.c.new $(precomp)/whirlpool-tab.c
+       $(AM_V_GEN)./whirlpool-mktab \
+                       >$(precomp)/symm/whirlpool-tab.c.new && \
+               mv $(precomp)/symm/whirlpool-tab.c.new \
+                       $(precomp)/symm/whirlpool-tab.c
 endif
 
 ## Bellare, Canetti and Krawczyk's `HMAC' mode for message authentication.
diff --git a/vars.am b/vars.am
index b0cd53c..5650287 100644 (file)
--- a/vars.am
+++ b/vars.am
@@ -95,7 +95,9 @@ SUBST = $(V_SUBST)$(confsubst)
 
 CATACOMB_INCLUDES       = \
        -I$(top_srcdir) \
-       -I$(precomp) \
+       -I$(precomp)/math \
+       -I$(precomp)/misc \
+       -I$(precomp)/symm \
        -I$(top_srcdir)/base \
        -I$(top_srcdir)/key \
        -I$(top_srcdir)/math \