[geeks] Makefile question
Jonathan C Patschke
jp at celestrion.net
Sat Nov 9 02:12:35 CST 2002
On Saturday, November 9, 2002, at 01:00 AM, Joshua D Boyd wrote:
> I've been going back and forth oer the gnu make manual on the gnu.org
> web site, and I just can't figure out how to modify my Makefile to
> allow
> parallel compilation with make -j2.
It should Just Work.
> Here is the simple Makefile.
>
> CC = g++;
>
> muopengl.a: *.o
> $(CC) -shared *.o -o muopengl.a
> mv muopengl.a ../mulib/
> cp include/*.h ../mulib/include/
>
> *.o:
> $(CC) -c src/*.cpp -Iinclude -I../mulib/include -I../mulib
>
> .PHONY: clean
> clean:
> rm *.o
That Makefile doesn't contain any parallelizable steps, since you're
building all the files as one dependency. What you'll want to do is
make a list of your .o files (since *.o doesn't mean anything to Make
when no .o files exist!) like this:
OBJS = foo.o bar.o baz.o bot.o
Then:
muopengl.a: $(OBJS)
$(CXX) -shared $(OBJS) -o ../mulib/muopengl.a
Now, for to build each OBJ file, make sure that CXX, CPPFLAGS and
CXXFLAGS are set properly:
# Note: Traditionally, CXX is the C++ compiler, and CC is the C
compiler.
CXX = g++
CXXFLAGS = -g -O
CPPFLAGS = -Iinclude -I../mulib/include -I../mulib
And create an implicit rule to translate .cpp files into .o files
(Actually, later versions of GNU Make may support .cpp in addition to
.cc and .C):
%.o: %.cpp
$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) $<
Now, insert the rules for each .o file:
foo.o: foo.cpp
bar.o: bar.cpp
baz.o: baz.cpp
bot.o: bat.cpp
Now, the steps for building each of your .o files, and your .a file are
all separate, and gmake will know how to parallelize them.
--
Jonathan C. Patschke
Celestrion Information Systems
Thorndale, TX
More information about the geeks
mailing list