[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [CPROG] Makefile



On 27 Feb 2003, Henrik Brix Andersen wrote:

> gøres dette (hvordan får jeg make til automagisk at finde den relevante
> kommando?)

Make kan ikke gøre det automagisk - automake kan automatisk og make kan 
hvis man fortæller den det med f.eks. en sources variabel. Nedenstående er 
en gammel Makefile fra DIKU jeg brugte før jeg lærte automake. 
Den demonstrerer
- automatisk dependecies
- forskellige erklæringer afhængigt af (unix) platform
- brug af lokal disk til objektfiler. (Kræver "ln -s /usr/tmp tmp" og kun 
  interessant på langsomme nfs systemer)
- forskellige targets i samme fil (ok, ikke noget særligt)


################################################################################
# Makefil 

# Denne makefil demonstrerer hvordan man kan gøre nogen ting lidt hurtigere
# og nemmere på DIKU's systemer.

# Filen bruger en shell kommando til at finde ud hvad OS man oversætter på
# og hvis man har et link der hedder tmp (navnet kan sættes med tmppath), 
# vil alle .o filer blive lagt der i, og oversættelse samt linkning 
# vil virke som forventet.

# Makefilen er oprindeligt skrevet til et program der består af en klient og 
# server. Referencerne er stadig bibeholdt for at man kan se hvordan man 
# f.eks. kan skelne mellem flere forskellige targets.

################################################################################
# Finder hvad (unix) OS det er vi koerer.
os=$(shell uname)

# Finder ud af om der findes et link kaldet tmp
tmppath=tmp
tmplink=$(shell find $(tmppath) -type l 2> /dev/null)

# CXX er oversætteren.
# CPPFLAGS er flag til Preproccesoren.
# CXXFLAGS er flag til compileren. (f.eks. optimering)
# LFLAGS bliver brugt (af os) til linkerens flag.

CXX=g++

# Forskellige erklæringer der afhænger af OS. Her skelnes kun mellem
# linux og OSF1

ifneq ($(os),OSF1)
  CPPFLAGS=-D__LINUX__ -D_GNU_SOURCE -D_REENTRANT -D_THREAD_SAFE
  CXXFLAGS=-Wall -Wno-comment
  CLFLAGS=/lib/libpthread.so.0 -lncurses
else
  CPPFLAGS=-D_REENTRANT
  ifneq ($(CXX),cxx)
    CXXFLAGS=-g -Wall -Wno-comment -D__BOOL_OK__
  endif
  CLFLAGS=-lpthread -lexc
endif

# TCXXFLAGS er CXX flagene for targetsene.
TCXXFLAGS:=$(CXXFLAGS)

# Her undersøges for tmp linket
ifeq ($(tmplink),$(tmppath))
  TEMPREF=$(tmppath)/
  CXXFLAGS += -o $(tmppath)/$(@F) 
  CLEANFLAGS= $(tmppath)/*.o
  DEPENDFLAGS= -p$(tmppath)/
endif

# Det her er ALLE vores source filer, til automatisk generering af afhængiheder
SRCS=binarySemaphore.cc client.cc clientApplication.cc clientCommunicator.cc clientCommunicatorTest.cc clientManager.cc communicator.cc map.cc map_print.cc cell.cc neighbours.cc mapTest.cc player.cc screen.cc server.cc serverApplication.cc serverCommunicator.cc serverCommunicatorTest.cc serverManager.cc thread.cc user.cc manager.cc binarySemaphore.cc world.cc               

# Commonobs, er de objektfiler, som både server og client bruger
COMMONOBS=thread.o map.o map_print.o cell.o neighbours.o binarySemaphore.o player.o communicator.o world.o

# Serverobs, er de objektfiler, som kun serveren bruger.
SERVEROBS=server.o serverApplication.o manager.o serverManager.o serverCommunicator.o

# Clientobs, er de ... osv.
CLIENTOBS=client.o user.o clientApplication.o manager.o clientManager.o clientCommunicator.o screen.o

# Targets. For gmake clean
TARGETS=client server test 

################################################################################
# Make targets

# Default er at lave klient og server. Man kunne også have valgt at bruge
#all:	$(TARGETS)
all:	client server

# Clean target.
clean:	
	rm -f *.o *.d *~ $(TARGETS) $(CLEANFLAGS)

# Dumt backup target. Brug CVS. Hvis du bruger den her skal Pilot ændres.
backup:	clean
	@cd .. && NAME=`date "+%d-%b-%H-%M"` && echo Making backup named $$NAME.tar.gz;tar -cf $$NAME.tar Pilot && echo . && gzip $$NAME.tar && mv $$NAME.tar.gz Backup && cd Backup && ln -fs $$NAME.tar.gz latest.tar.gz && ls -l $$NAME.tar.gz | awk '{print $$5 " " $$9}' && echo Done || echo FEJL UNDER BACKUP

# Hoved targets her
# De mystiske addprefix ting er for at kunne finde vores objekter hvis
# der er i f.eks. /usr/tmp

client:		$(addprefix $(TEMPREF),$(COMMONOBS) $(CLIENTOBS))
	$(CXX) $(CPPFLAGS) $(TCXXFLAGS) $(CLFLAGS) -o client \
               $(addprefix $(TEMPREF),$(COMMONOBS) $(CLIENTOBS))

server:		$(addprefix $(TEMPREF),$(COMMONOBS) $(SERVEROBS))
	$(CXX) $(CPPFLAGS) $(TCXXFLAGS) $(CLFLAGS) -o server \
               $(addprefix $(TEMPREF),$(COMMONOBS) $(SERVEROBS))

# Test targets her

test: $(addprefix $(TEMPREF), noget.o andet.o) 
	$(CXX) $(CPPFLAGS) $(TCXXFLAGS) $(CLFLAGS) -o test noget.o andet.o)

# Install target. 
install:	all
	strip server client && gør noget

# Definer afhængighedsoversættelsen
# Dette er den anbefalede GNU måde. Den genererer en række .d filer 
# for hver .cc fil der beskriver filens afhængigheder. 
# -MM udelukker system filer
# Den skal stå sidst, så vidt jeg kan regne ud
%.d: %.cc
	@$(SHELL) -ec '$(CC) -M $(CPPFLAGS) $< \
        | sed '\''s/\($*\)\.o[ :]*/\1.o $@ : /g'\'' > $@; \
        [ -s $@ ] || rm -f $@'

# Definer objekt oversættelsen 
$(TEMPREF)%.o:	%.cc	
	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<

################################################################################
#
# Vi inkluderer dependency filerne. Sørger for at alle afhængigheder er ok.
include $(SRCS:.cc=.d)


Mads

-- 
Mads Bondo Dydensborg.                               sslug@sslug
If you aim the gun at your foot and pull the trigger, it's UNIX's job to 
ensure reliable delivery of the bullet to where you aimed the gun (in
this case, Mr. Foot). 
                               - Terry Lambert, FreeBSD-Hackers mailing list.



 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:09 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *