baccala@eng.umd.edu (Brent W. Baccala) (05/05/91)
First, I don't read these newsgroups, so don't followup if you want me to see it. Second, I'm posting an answer to my own question and don't really expect any replys. Somebody's probably done this before, but I've never heard of it, and I'm posting in the hope that you might find this useful. Basically, I wanted Make and RCS (you could use SCCS just as easily) to co-exist nicely. I also wanted to define "nicely" in my own terms. RCS files should stay in an RCS subdirectory; I only check out the ones I'm changing. I'm the only person working on the project, so I don't need to worry about unlocked files being altered. When I run make, I don't want it to clutter up my directory with all the source files; I just want it to re-compile those that I've changed and link with stored objects from other files to build the executable. A normal .c -> .o -> exec chain won't work because make will end up either complaining about non-existant .c files or using a default rule to check 'em all out from RCS. I've broken the chain with an archive. The exec depends on it like this: mst: mst.a $(CC) -o mst $(CFLAGS) mst.a $(LIBS) The trick is to only rebuild the parts of mst.a that you need, leave the unchanged members alone, then compile from the archive. Building the archive isn't trivial, but let me know if you find a simpler way than mine: mst.a: $(CFILES) @for file in $? ; do \ make `basename $$file .c`.o ; \ echo ar r mst.a `basename $$file .c`.o ; \ ar r mst.a `basename $$file .c`.o ; \ rm `basename $$file .c`.o ; \ done ranlib mst.a CFILES is a make variable that must be set to the source files existing in the directory at the time of the make. You can't just use "*.c", because if none exist, Bourne shell leave the wildcard alone and make tries to build a file called "*.c". "test" isn't quite powerful enough to overcome thing. Fortunately, we've got a fairly rich environment here that includes Sun make and perl, so CFILES is: CFILES:sh = perl -e '$,=" "; print <*.c>,"\n"' This sets CFILES to a list of all .c files, or nothing if none exist. If you only want certain .c files considered, it shouldn't be too hard. Of course, I have a default rule to do a check-out, in case include files are needed for the source I do change. An enhancement I don't have now, but plan to add as soon as I need it is a check in the mst.a rule for existance of the mst.a file. If it isn't there, check out all the source files you don't have, recompile everything, then delete the source code checked out (leaving the files that were already there). This lets you quickly switch to a different development track by deleting mst.a, switching the default RCS branch to whatever, and running make. As always, suggestions and comments and (expecially) improvements are welcome. -- -bwb Brent W. Baccala baccala@eng.umd.edu