From c9cfa678c1bc391d0c270df6fdab7e9d50949b1f Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sun, 15 May 2016 14:57:12 +0100 Subject: [PATCH] build: Cope with the `subdir-objects' world Automake wants us to live in. 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 | 2 +- math/Makefile.am | 45 +++++++++++---------- misc/Makefile.am | 14 ++++--- symm/Makefile.am | 118 ++++++++++++++++++++++++++++++------------------------- vars.am | 4 +- 5 files changed, 100 insertions(+), 83 deletions(-) diff --git a/configure.ac b/configure.ac index 8496cc3a..b88f1fd5 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/math/Makefile.am b/math/Makefile.am index 7cabf891..bca64be3 100644 --- a/math/Makefile.am +++ b/math/Makefile.am @@ -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 diff --git a/misc/Makefile.am b/misc/Makefile.am index 54be12ae..dc758f06 100644 --- a/misc/Makefile.am +++ b/misc/Makefile.am @@ -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 diff --git a/symm/Makefile.am b/symm/Makefile.am index 63bf26b7..7deed65c 100644 --- a/symm/Makefile.am +++ b/symm/Makefile.am @@ -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 b0cd53ce..56502879 100644 --- 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 \ -- 2.11.0