[comp.unix.programmer] The answer to make with multiple executables from same source files

tif@doorstop.austin.ibm.com (Paul Chamberlain) (11/14/90)

I wrote
>I have two executables that depend on the same source files but are
>compiled with different CFLAGS.  Anybody have a good way to make a
>makefile understand this?

Well, I got it figured out.  Below I have included a makefile for
two hypothetical executables that use the same .c's.  A fringe
benefit is that even if you only have one executable, using this
style of make file will allow you to remove all the .o's and it
still won't recompile anything unless a .c or .h changed.

Paul Chamberlain | I do NOT represent IBM.     tif@doorstop, sc30661 at ausvm6
512/838-7008     | ...!cs.utexas.edu!ibmchs!auschs!doorstop.austin.ibm.com!tif

# This is a really bizarre makefile that allows two executables to be made
# from one set of source.  In this example, the exe's are to be compiled
# with slightly different compile lines and libraries.  This should handle
# all manner of interrupted and restarted compiles.

OBJ	= obj1.o obj2.o obj3.o
HFILES	= local1.h local2.h
CFLAGS	= -O $(NAME)
LDFLAGS	= $(OTHER_LIB)

# by default, make both executables
all:	exe1 exe2

clean:
	rm -f *.o making.exe1 making.exe2

# This will prevent recompilation if everything is
# up to date even if no .o's are around.
exe1:	$(OBJ:.o=.c) exe1.c $(HFILES)
	if test ! -f making.exe1;then make clean;fi
	touch making.exe1
	$(MAKE) NAME=-DEXE1 OTHER_LIB=-lx exe1.make

exe1.make:	$(OBJ) exe1.o
	$(CC) $(CFLAGS) $(OBJ) exe1.o $(LDFLAGS) -o exe1

# This will prevent recompilation if everything is
# up to date even if no .o's are around.
exe2:	$(OBJ:.o=.c) exe2.c $(HFILES)
	if test ! -f making.exe2;then make clean;fi
	touch making.exe2
	$(MAKE) NAME=-DEXE2 exe2.make

exe2.make:	$(OBJ) exe2.o
	$(CC) $(CFLAGS) $(OBJ) exe2.o $(LDFLAGS) -o exe2

weave@brahms.udel.edu (Ken Weaverling) (11/14/90)

I didn't respond to original article at first since I usually don't post
but... original article stated:

>I have two executables that depend on the same source files but are
>compiled with different CFLAGS.  Anybody have a good way to make a
>makefile understand this?
>
Then he responds to his own article with...

In article <4223@awdprime.UUCP> tif@doorstop.austin.ibm.com (Paul Chamberlain) writes:
>Well, I got it figured out.  Below I have included a makefile for
>two hypothetical executables that use the same .c's.  A fringe
>benefit is that even if you only have one executable, using this
>style of make file will allow you to remove all the .o's and it
>still won't recompile anything unless a .c or .h changed.
>
 <<< Complex makefile deleted >>>
  
Hmm, I am just a humble computer science student, but my Makefile for my
last project did what you said you wanted but is much more straight forward.
However, it *will* recompile missing .o files... It is below. It produces
two binaries, most of the modules are the same except for different compile
flags. Each one has a different main module.


# Makefile for least-cost communications anaylzer
# (project for Univ of Del, CIS 220 class)

CC = g++

#CFLAGS is *normal* flags for compiling program
#DFLAGS is compiled into the driver programs

CFLAGS = -O -g
DFLAGS = -DDEBUG -g

# OBJS is normal objects, DOBJS is debugging objects for driver program

OBJS = symtable.o main.o fileio.o table.o util.o
DOBJS = dsymtable.o dmain.o fileio.o dtable.o dutil.o

all: prog2 dprog2

prog2: $(OBJS)
	$(CC) $(CFLAGS) $(OBJS) -o prog2

dprog2:	$(DOBJS)
	$(CC) $(DFLAGS) $(DOBJS) -o dprog2

symtable.o: symtable.cc symtable.h general.h
	$(CC) $(CFLAGS) -c symtable.cc

table.o: table.cc table.h general.h
	$(CC) $(CFLAGS) -c table.cc

main.o: main.cc general.h symtable.h table.h util.h
	$(CC) $(CFLAGS) -c main.cc

dsymtable.o: symtable.cc symtable.h general.h
	$(CC) $(DFLAGS) -c symtable.cc -o dsymtable.o

dtable.o: table.cc table.h general.h
	$(CC) $(DFLAGS) -c table.cc -o dtable.o

dmain.o: driver.cc driver.h general.h
	$(CC) $(DFLAGS) -c driver.cc -o dmain.o

fileio.o: fileio.cc fileio.h general.h
	$(CC) $(CFLAGS) -c fileio.cc

util.o: util.cc util.h general.h fileio.h
	$(CC) $(CFLAGS) -c util.cc

dutil.o: util.cc util.h general.h fileio.h
	$(CC) $(DFLAGS) -c util.cc -o dutil.o

clean:
	rm -rf $(DOBJS) $(OBJS) prog2 dprog2 *~ core

strip:
	strip prog2 dprog2
	chmod 711 prog2 dprog2 .
	rm -rf $(OBJS) *~ core
-- 

Ken Weaverling (insert any job title here, except for official spokesperson)
Delaware Technical & Community College --- weave@brahms.udel.edu