1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
|
# M A K E F I L E
# main programs: class.c cws.c poly.c nef.c mori.c
CC ?= gcc
CPPFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
CFLAGS ?= -O3 -g -W -Wall
# CFLAGS=-O3 -g # add -g for GNU debugger gdb
# CFLAGS=-Ofast -O3 -mips4 -n32 # SGI / 32 bit
# CFLAGS=-Ofast -O3 -mips4 -64 # SGI / 64 bit
# CFLAGS=-O3 -fast -non_shared -arch pca56 # statically linked for alpha_PC
# targets : dependencies ; command
# command
# ...
# The list of programs to build, without the ".x" extension. Having
# these in a variable makes it easy to loop through them. Likewise,
# the list of dimensions (POLY_Dmax) that we want to build executables
# for.
PROGRAMS = poly class cws nef mori
DIMENSIONS = 4 5 6 11
# The "all" target builds only the 6d-optimized versions that have
# historically been built by running "make".
.PHONY: all
all: $(foreach p,$(PROGRAMS),$(p).x)
# The "all-dims" target, however, builds each PROGRAM, once, optimized
# for each dimension listed in DIMENSIONS. Here we have "all-dims"
# depend only on the traditional foo.x names, but the template below
# will add foo-4d.x, foo-5d.x, etc. to the list of prerequisites.
.PHONY: all-dims
all-dims: all
.PHONY: clean
clean: ; rm -f *.o
.PHONY: cleanall
cleanall: ; rm -f *.o *.x palp_* core
define PROG_DIM_template =
#
# Define separate build rules for every combination of PROGRAMS and
# DIMENSIONS. This really is necessary: we can't reuse an object file
# that was compiled with (say) POLY_Dmax=4 to link the executable
# foo-11d.x, because then foo-11d.x will just wind up with the code
# for dimension <= 4. And that's the best case: mixing and matching
# POLY_Dmax across multiple files could easily cause a crash.
#
# Arguments:
#
# $(1) - program name, e.g. "poly" or "mori"
# $(2) - the current value of POLY_Dmax, e.g. "4" or "11"
#
# A list of common objects needed by all executables of this dimension
OBJECTS_$(2) = Coord-$(2)d.o Rat-$(2)d.o Vertex-$(2)d.o Polynf-$(2)d.o
# List the additional objects needed by the individual programs of
# this dimension
poly_OBJ_$(2) = LG-$(2)d.o
class_OBJ_$(2) = Subpoly-$(2)d.o Subadd-$(2)d.o Subdb-$(2)d.o
cws_OBJ_$(2) = LG-$(2)d.o
nef_OBJ_$(2) = E_Poly-$(2)d.o Nefpart-$(2)d.o LG-$(2)d.o
mori_OBJ_$(2) = MoriCone-$(2)d.o SingularInput-$(2)d.o LG-$(2)d.o
# Build the object foo-Nd.o from foo.c. The COMPILE.c macro is built
# in to GNU Make. There's a special case for an empty DIMENSION as an
# indicator that we should not override the value of POLY_Dmax in
# Global.h. This is used to build the foo.x programs using the value
# in Global.h, since editing Global.h has long been documented as the
# way to change POLY_Dmax in foo.x.
ifeq ($(2),)
%-$(2)d.o: %.c
$(COMPILE.c) -o $$@ $$<
else
%-$(2)d.o: %.c
$(COMPILE.c) -DPOLY_Dmax=$(2) -o $$@ $$<
endif
# Link the program foo-Nd.x from foo-Nd.o, OBJECTS_N, and foo_OBJ_N.
# The LINK.c macro is built in to GNU Make.
$(1)-$(2)d.x: $(1)-$(2)d.o $$(OBJECTS_$(2)) $$($(1)_OBJ_$(2))
$(LINK.c) -o $$@ $$^
# Add foo-Nd.x to the "all-dims" target
all-dims: $(1)-$(2)d.x
# Specify some additional dependencies (beyond the corresponding *.c file)
# for our *.o files.
Coord-$(2)d.o: Rat.h Global.h
Polynf-$(2)d.o: Rat.h Global.h
Rat-$(2)d.o: Rat.h Global.h
Subpoly-$(2)d.o: Rat.h Subpoly.h Global.h
Subadd-$(2)d.o: Subpoly.h Global.h
Vertex-$(2)d.o: Rat.h Global.h
Subdb-$(2)d.o: Subpoly.h Global.h
LG-$(2)d.o: Rat.h LG.h Global.h
E_Poly-$(2)d.o: Nef.h Rat.h Global.h
Nefpart-$(2)d.o: Nef.h Global.h
MoriCone-$(2)d.o: Rat.h Mori.h Global.h
SingularInput-$(2)d.o: Mori.h Global.h
poly-$(2)d.o: LG.h Global.h
class-$(2)d.o: Subpoly.h Global.h
cws-$(2)d.o: LG.h Rat.h Global.h
nef-$(2)d.o: Nef.h LG.h Global.h
mori-$(2)d.o: LG.h Mori.h Global.h
endef
# Call the PROG_DIM_template once for each PROGRAM "p" and
# DIMENSION "d".
$(foreach p,$(PROGRAMS),$(foreach d,$(DIMENSIONS),\
$(eval $(call PROG_DIM_template,$(p),$(d)))\
))
# Typically (i.e. by default) foo.x will be identical to foo-6d.x,
# since Global.h defines POLY_Dmax=6. However, the procedure to change
# POLY_Dmax has long been documented as "edit Global.h and re-run
# make." If we simply copy foo-6d.x to foo.x, then changes to Global.h
# will have no effect on the resulting executables. Instead, we build
# a separate copy of each program with DIMENSION set to the empty
# string. This alerts the build rule to omit the -DPOLY_Dmax line that
# overrides the value in Global.h. The resulting foo-d.x executables
# can then be copied to foo.x so that the documented procedure still
# works. The special INTERMEDIATE rule avoids rebuilding foo-d.x after
# we've moved it to foo.x.
$(foreach p,$(PROGRAMS),\
$(eval $(call PROG_DIM_template,$(p),))\
)
.INTERMEDIATE: $(foreach p,$(PROGRAMS),$(p)-d.x)
%.x: %-d.x
mv $< $@
# For lack of anything less silly, define a newline this way.
# We need it to run multiple commands in a $(foreach) loop.
# The $(blank) is apparently required to keep it from eating
# the newline.
blank :=
define newline
$(blank)
endef
# Testing
# #######
#
# Each test script should take the dimension DIM from the environment
# with default 6. Optionally, the LONG variable can be set to a
# non-null value to enable the tests that take a long time. Some
# documentation on this test "protocol" is contained in tests/README.
#
TESTS = $(wildcard tests/*.sh)
# The test suite depends on all of the dimension-optimized programs.
# The main "make check" routine runs each of the tests/*.sh scripts
# with each applicable value of DIM.
.PHONY: check
check: $(foreach p,$(PROGRAMS),$(foreach d,$(DIMENSIONS),$(p)-$(d)d.x))
$(foreach t,$(TESTS),$(foreach d,$(DIMENSIONS),\
$(newline)@DIM=$(d) $(t)\
))
.PHONY: checklong
checklong:
LONG=1 $(MAKE) check
|