help-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: dependency issues in Make


From: John David Ratliff
Subject: RE: dependency issues in Make
Date: Tue, 12 Oct 2004 09:43:29 -0500

>> your 'all' rule doesn't touch/create a file called 'all', but it 
>> isn't declared .PHONY either. See Paul's Rule 2 
>> (http://make.paulandlesley.org/rules.html#rule2). This may prevent 
>> make from doing what you want.

Hadn't thought of that, but the target is nevertheless being executed. I did
add it to the phony target list though.

>> [Also, you repeat your filenames several times. You might consider 
>> following Paul's rule 4. But as long as your spelling is consistent 
>> of itself, and in sync with your directory structure, this is just a 
>> nuisance for you, not a consideration for make.]

You mean in the dependencies? You think I should create variables for the
filenames? This would lesson the potential for typing mistakes.

And what do you know. Somehow this solves my problem. I wonder why...

>> Last thing that strikes me is your 'strip' command:

>       if [ -e $(EXE).exe ]; then strip $(EXE).exe; else strip $(EXE); fi

>> I'm not familiar with mingw, but if your linker may produce "$(EXE).exe" 
>> in stead of "$(EXE)", your make rule is again not updating the exact 
>> target of your rule, cf. Paul's Rule 2.

>> If the makefile still doesn't work after correcting these issues, 
>> shout again ;-)

Mingw is weird. Well, actually, probably msys is weird. But the fact remains
its weird.

Here is the weirdness.

If you say -o filename, mingw-ld will automatically append a .exe. It used
to create both filename and filename.exe.

This is fine, as Windows needs this. But the problem is, the test command.

test -f filename
and test -f filename.exe

Both return true if filename.exe exists.

I had the hardest time trying to figure out why it thought filename was
being created when it wasn't. I finally figured out I had to do the win32
specific test first. It should work the same way on Linux, too, but I
haven't gotten around to testing yet.

Anyway, the following makefile works great now. Thanks for your help.

############################################################################
# Makefile for wxCHTDecoder
# Created for GNU make. Others may work, but YMMV.
#
# Copyright (C) 2004 emuWorks
# http://games.technoplaza.net
#
# This program is free software; you can redistribute it and/or # modify it
under the terms of the GNU General Public License # as published by the Free
Software Foundation; either version 2 # of the License, or (at your option)
any later version.
#
# This program is distributed in the hope that it will be useful, # but
WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE.  See the # GNU General Public License
for more details.
#
# You should have received a copy of the GNU General Public License # along
with this program; if not, write to the Free Software # Foundation, Inc., 59
Temple Place - Suite 330, Boston, MA  02111-1307, # USA.

############################################################################
# global definitions
#

CXX=g++
CXXFLAGS=-O2 `wx-config --cxxflags`
LIBS=`wx-config --libs`

SRC=src
BIN=.

EXE=$(BIN)/chtdecoder

############################################################################
# source and object files
#

CHTDECODER=$(SRC)/chtdecoder.cc
CHTDECODERH=$(SRC)/chtdecoder.hh
CHTDECODERO=$(SRC)/chtdecoder.o

CHTCODE=$(SRC)/datastructures/chtcode.cc
CHTCODEH=$(SRC)/datastructures/chtcode.hh
CHTCODEO=$(SRC)/datastructures/chtcode.o

CHTCODELIST=$(SRC)/datastructures/chtcodelist.cc
CHTCODELISTH=$(SRC)/datastructures/chtcodelist.hh
CHTCODELISTO=$(SRC)/datastructures/chtcodelist.o

INDEXOUTOFBOUNDSE=$(SRC)/exceptions/indexoutofboundsexception.cc
INDEXOUTOFBOUNDSEH=$(SRC)/exceptions/indexoutofboundsexception.hh
INDEXOUTOFBOUNDSEO=$(SRC)/exceptions/indexoutofboundsexception.o

INVALIDCHTFILEE=$(SRC)/exceptions/invalidchtfileexception.cc
INVALIDCHTFILEEH=$(SRC)/exceptions/invalidchtfileexception.hh
INVALIDCHTFILEEO=$(SRC)/exceptions/invalidchtfileexception.o

CHTFILEREADER=$(SRC)/tools/chtfilereader.cc
CHTFILEREADERH=$(SRC)/tools/chtfilereader.hh
CHTFILEREADERO=$(SRC)/tools/chtfilereader.o

CHTFRAME=$(SRC)/view/chtframe.cc
CHTFRAMEH=$(SRC)/view/chtframe.hh
CHTFRAMEO=$(SRC)/view/chtframe.o

CHTTEXTCTRL=$(SRC)/view/chttextcontrol.cc
CHTTEXTCTRLH=$(SRC)/view/chttextcontrol.hh
CHTTEXTCTRLO=$(SRC)/view/chttextcontrol.o

############################################################################
# the objects to compile
#

OBJS=$(CHTDECODERO) $(CHTCODEO) $(CHTCODELISTO) $(INDEXOUTOFBOUNDSEO) \
  $(INVALIDCHTFILEEO) $(CHTFILEREADERO) $(CHTFRAMEO) $(CHTTEXTCTRLO)

############################################################################
# the targets
#

.PHONY: clean run all

all: $(EXE)

$(EXE): $(OBJS)
        $(CXX) -o $(EXE) $(OBJS) $(LIBS)
        if [ -e $(EXE).exe ]; then strip $(EXE).exe; else strip $(EXE); fi
        
############################################################################
# object dependencies
#

$(CHTDECODERO): $(CHTDECODER) $(CHTDECODERH) $(CHTFRAMEH)
$(CHTCODEO): $(CHTCODE) $(CHTCODEH)
$(CHTCODELISTO): $(CHTCODELIST) $(CHTCODELISTH) $(INDEXOUTOFBOUNDSEH) \
        $(CHTCODEH)
$(INDEXOUTOFBOUNDSEO): $(INDEXOUTOFBOUNDSE) $(INDEXOUTOFBOUNDSEH)
$(INVALIDCHTFILEO): $(INVALIDCHTFILE) $(INVALIDCHTFILEH)
$(CHTFILEREADERO): $(CHTFILEREADER) $(CHTFILEREADERH) $(CHTCODEH) \
        $(INVALIDCHTFILEEH) $(CHTCODELISTH)
$(CHTFRAMEO): $(CHTFRAME) $(CHTFRAMEH) $(CHTDECODERH) $(CHTFILEREADERH) \
        $(CHTCODELISTH) $(CHTCODEH) $(INVALIDCHTFILEEH) $(CHTTEXTCTRLH)
$(CHTTEXTCTRLO): $(CHTTEXTCTRL) $(CHTTEXTCTRLH)

############################################################################
# phony targets
#

clean:
        rm -rf $(OBJS) $(EXE) *.exe
        find . -iname '*~' -exec rm -f {} \;

run: $(EXE)
        @$(EXE)

#
# end of Makefile
############################################################################

--John Ratliff







reply via email to

[Prev in Thread] Current Thread [Next in Thread]