[lug] OT: Makefile oddity

D. Stimits stimits at idcomm.com
Wed Apr 24 08:24:00 MDT 2002

I've decided it is probably ok to assume GNU make and gcc/g++ on this
project. At least all of the primary authors use g++ and GNU make, and
although a dependency file is a generated file and probably should not
be shipped normally, I think the non-GNU variants could still use a
dependency file that is generated by GNU make, so it probably is not
much of a limitation.

So I have what I hope is one last hurdle here to emerging from the Dark
Ages of non-cvs and tons of sym links in hard-to-package layouts. Using
something like this as an example of generating the dependencies, I have
a problem due to intermediate object files going to a separate

	echo "# make/utils/Makefile.dep" > Makefile.dep
	echo "# This file is a generated file." >> Makefile.dep
	echo "" >> Makefile.dep
	g++ ${CXXFLAGS} \
		${INC} \
		-MM -MG ${SRC_UTILS} >> Makefile.dep
	echo "" >> Makefile.dep

What this above does is 100% correct, with one exception. It assumes my
dependency is for the current directory, e.g., if I have Abc.cxx, the
output is Abc.o (this particular build directory has no linking, it is
all intermediate object code output), but the actual build lines are
using a relative directory, e.g., "../obj/". So instead of a dependency
"Abc.o: Abc.cxx", what I need is a prefix like "../obj/Abc.o: Abc.cxx".
There are lots of ways to do this if it was an actual compile line, but
I'm not sure how to do this in a g++ -MM -MG line. It's rather likely
that if someone bothered to add -MM -MG to g++, then there is also a way
to do this naming a relative path directory as well. Does anyone know if
there is a particularly suitable way to prefix this relative path for my
dependencies? Or is it a case of requiring something additional, such as
pipes to sed or awk or perl?

D. Stimits, stimits at idcomm.com

Ken Weinert wrote:
> Hash: SHA1
> On Saturday 20 Apr 2002 17:43, you wrote:
> > >>>>> ">" == D Stimits <stimits at idcomm.com> writes:
> >
> > Tom> However, there's a bug here.  It is the classic recursive make
> > Tom> bug: you only have a dependency on the .cpp file.  So if you
> > Tom> `touch config.h', nothing will be rebuilt -- which is wrong.
> >
> > >> I don't really consider this a bug, just a limitation of the
> > >> technology.  makedepend would almost work, except it is designed
> > >> for C instead of C++, and fails to deal properly with .cpp or .cxx
> > >> extensions.
>         I see that according to the above paper my method can suffer from some
> problems, but in the general case it works well for me.
>         Here's an excerpt from a Makefile in a current project:
> include ../../make.cfg
> SRC =   attributes.c depth.c logit.c power.c mapstuff.c bprintf.c \
>         walls.c getGameInfo.c getNextLine.c palette.c sph.c \
>         getPlayerInfo.c getUnits.c support.c strupr.c rollDie.c storage.c
> OBJ = $(SRC:.c=.o)
> all $(ADJROOT)/lib/libbattle.a : $(ADJROOT)/lib/libbattle.a($(OBJ))
> clean :
>         rm -f *~ *.o *.d $(ADJROOT)/lib/libbattle.a
> include $(OBJ:.o=.d)
> %.d: %.c
>         $(CC) -M -MG $(CFLAGS) $(INCLUDES) $(LOCAL_DEFINES) $< > $@
>         Yes, it's gcc/g++ dependent - that's a feature, not a bug :)  The -M flag
> works for C++ files and it will include the-not-.h-terminated-filename
> headers (although the -MG explicitly removes the dependency on system
> headers).
> - --
> Ken Weinert   mc at morat.net
> GnuPG KeyID: 9274F1CE           GnuPG available at http://www.gnupg.org/
> GnuPG Key Fingerprint: 1D87 3720 BB77 4489 A928  79D6 F8EC DD76 9274 F1CE
> E Pluribus Modem
> Version: GnuPG v1.0.6 (GNU/Linux)
> Comment: For info see http://www.gnupg.org
> iEYEARECAAYFAjzD9uIACgkQ+OzddpJ08c5XKACfUViC57p5NnVBwPRf2BH12qaj
> Ca8AoJJv5bf15XKqvF8mwkXNit7+YoLi
> =mT08
> _______________________________________________
> Web Page:  http://lug.boulder.co.us
> Mailing List: http://lists.lug.boulder.co.us/mailman/listinfo/lug

More information about the LUG mailing list