[vox-tech] help with a makefile

Peter Jay Salzman vox-tech@lists.lugod.org
Tue, 2 Apr 2002 11:20:46 -0800


hi all,

here is a makefile for one of my simulators:


TARGET = ising2-periodic
TIMESTAMP = `/bin/date +'%Y-%b-%d-%H-%M'`
BACKUPDIR = /usr/local/backup/ising2
WARN = -Wall -W -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations
CFLAGS = -O9 -ansi $(WARN)
LFLAGS = -lm -L. -lpising2
OBJS := $(patsubst %.c, %.o, $(wildcard *.c))


$(TARGET): $(OBJS)
	gcc -o $@ $(OBJS) $(LFLAGS)

main.o: main.c pising2.h fsignal.h
fsignal.o: fsignal.c fsignal.h

.PHONY: clean
clean:
   -rm -rf *.o a.out $(TARGET)

backup:
	make clean
	cd ..; tar -jcv ./$(TARGET) > "$(BACKUPDIR)/$(TARGET)-$(TIMESTAMP).tar.bz2"
	echo "Saved to $(BACKUPDIR)/$(TARGET)-$(TIMESTAMP)."
	echo "$(TARGET)-$(TIMESTAMP)" > .version

i would *like* to put all object files in ./objs.   i'm having a hard
time figuring out how to do this.  i know how to have make look for the
object files when it *links* the target:

vpath %.o ./objs

but that doesn't help during the *compilation* process.   is there a way
to tell make:

   listen, make.  i like your implicit rules.  but when you make an
   object file, i'd really appreciate it if you put it in "./objs"
   rather than "."

so in other words, i KNOW how to do this by hard-coding the paths into
the makefile.  what i'm really looking for is some kind of directive to
modify the implicit rule.

kind of like how when you define $(CFLAGS) you don't need to explicitly
say:

   target: foo.c foo.h
   	gcc $(CFLAGS) -o $@ $<

because make is smart enough to use your $(CFLAGS) even when you use an
implicit rule:

   target: foo.c foo.h      # $(CFLAGS) is used here

i hope i explained this ok!  :)

pete