make & liste

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
alexatdebian
Beiträge: 117
Registriert: 19.07.2004 18:17:42

make & liste

Beitrag von alexatdebian » 25.09.2004 22:23:59

Hallo,

ich dreh mich grad im kreis :cry:

ich hab ne liste von objekten ( ${OBJ} s.angefügtes makefile)
dabei sind die objekte ohne pfad angegeben.
bei den abhängigkeiten (also was anderes hängt von den objekten ab) muss ich nun ja 'n verzeichnis davorhängen:

${VERZEICHNIS}/${OBJ}

funktioniert nur für das erste objekt (ist mir irgendwie auch klar, weil das ganze als verzeichnis/obj1 obj2 ... objn interpretiert wird.

gibts ne möglichkeit das verzeichnis elegant vor jedes obj der liste zu hängen?

danke
alex

#####################################################
#
SHELL=/bin/sh
#
COMPILE=ifc7 -c
MYOPT=-O3
LINK=ifc7

ROOTDIR=/home/alexp/physik/zrcluster/code
SOURCEDIR=${ROOTDIR}/src
BINDIR=${ROOTDIR}/bin
OBJDIR=${ROOTDIR}/bin/obj
LFLAGS=-L${OBJDIR}
F90PPDIR=${BINDIR}

LLIBS=

OBJ = mylib.o \
evaltra.o\

BINNAME=evaltra.x



default: ${BINDIR}/${BINNAME}


${BINDIR}/${BINNAME}: ${OBJ}%.o
cd ${OBJDIR};${LINK} ${MYOPT} -o ${BINDIR}/${BINNAME} ${LFLAGS} ${OBJ} ${LLIBS}



${OBJ}: %.o: ${SOURCEDIR}/%.f90
${F90PPDIR}/f90pp $< ${OBJDIR}/$*_d.f90
${COMPILE} ${MYOPT} -o ${OBJDIR}/$@ -module ${OBJDIR} ${OBJDIR}/$*_d.f90


new: touch ${BINDIR}/${BINNAME}

touch:
touch ${SOURCEDIR}/*.f90

x: ${BINDIR}/${BINNAME}
${BINDIR}/${BINNAME}



######################################################

Benutzeravatar
eagle
Beiträge: 2282
Registriert: 05.11.2002 11:20:53
Wohnort: Berlin

Beitrag von eagle » 25.09.2004 23:20:18

Ich glaube du suchst VPATH.
gmake hat geschrieben:4.3.1 VPATH: Search Path for All Prerequisites

The value of the make variable VPATH speci es a list of directories that make should search. Most often, the directories are expected to contain prerequisite les that are not in the current directory; however, VPATH speci es a search list that make applies for all les, including les which are targets of rules.
eagle

[1] http://www.cvc.mun.ca/software/gmake/do ... html#SEC27
"I love deadlines. I love the whooshing sound they make as they fly by." -- Douglas Adams

alexatdebian
Beiträge: 117
Registriert: 19.07.2004 18:17:42

Beitrag von alexatdebian » 26.09.2004 14:26:36

vpath hat mich schon mal weitergebracht,
aber das cd werd ich beim linken nicht los, da wieder nur das erste objekt der liste mit dem (v)pfad vervollständigt wird.
aber zumindest kann ich die directory struktur für die sourcen, objekte und binaries nun sauber einhalten.
wie gesagt: zum finalen linken muss ich in das objdir absteigen.

falls jemand dazu noch was einfällt : für vorschläge wär ich dankbar.

gruß
alex

Code: Alles auswählen

#
SHELL=/bin/sh
#
COMPILE=ifc7 -c
MYOPT=-O3
LINK=ifc7

ROOTDIR=/home/alexp/physik/zrcluster/code
SOURCEDIR=${ROOTDIR}/src
BINDIR=${ROOTDIR}/bin
OBJDIR=${ROOTDIR}/bin/obj
LFLAGS=-L${OBJDIR}
F90PPDIR=${BINDIR}

LLIBS=

OBJ = mylib.o \
	evaltra.o\

BINNAME=evaltra.x

vpath %.o ${OBJDIR}

default: ${BINDIR}/${BINNAME}


${BINDIR}/${BINNAME}: ${OBJ}
	cd ${OBJDIR};\
	${LINK} ${MYOPT} -o ${BINDIR}/${BINNAME} ${LFLAGS} ${OBJ} ${LLIBS}



${OBJ}: %.o: ${SOURCEDIR}/%.f90
	${F90PPDIR}/f90pp $< ${OBJDIR}/$*_d.f90
	${COMPILE} ${MYOPT} -o ${OBJDIR}/$@ -module ${OBJDIR} ${OBJDIR}/$*_d.f90


new:    touch ${BINDIR}/${BINNAME}

touch:
	touch ${SOURCEDIR}/*.f90

x: 	${BINDIR}/${BINNAME}
	${BINDIR}/${BINNAME}

clean: 
	rm -rf ${OBJDIR}/*.o
	rm -rf ${ROOTDIR}/*.o
	rm -rf ${BINDIR}/*.x

########################################################
###      SOME COMMENTS TO THE MAKEFILE-STRUCTUR      ###
########################################################

#+LIST EVERY OBJ IN 'OBJ'

#+THE DEFAULT CALL MAKES THE EXECUTABLE, WHICH ITSELF DEPENDS
#  ON THE OBJECTS, WICH THEMSELFES DEPEND ON THE CORRESPONDING
#  SOURCEFILES

#+I USE THE PREPROCESSOR (A SED SCRIPT TO REPLACE $ BY __)
#  THE SOURCEFILES WERE PREPROCESSED, COMPILED (USE THE 
#  OPTION -c IN 'COMPILE' TO %.o FILES IN THE 'OBJDIR',
#  THE MODULES WERE PLACED IN THE 'MODULEDIR'.

#+'new' DEPENDS ON 'touch' WHICH TOUCHES THE SOURCEFILES
#  AND THE STANDARD TARGET

#+'x' DEPENDS ON THE BINARY ITSELF, COMPILES IT (IF NECESSARY)
#  AND EXECUTES IT

#+THE 'vpath' DIRECTIVE SETS THE SEARCHPATH FOR SPECIFIC FILES (HERE %.o)
#  AND IS NEEDED BECAUSE THE DEPENDENCY: ${BINDIR}/${BINNAME}: ${OBJ}
#  OTHERWISE WOULD NEVER BE FULFILLED, BECAUSE MAKE LOOKS IN THE ACTUAL 
#  DIRECTORY. WITH vpath, IT LOOKS IN THAT PATH

#+OPEN PROBLEMS:
#  I COULD NOT GET RID OF THE 'cd ${OBJDIR};\' STATEMENT, BECAUSE, WHILE 
#  LINKING, ONLY THE FIRST ENTRY IN '${OBJ}' IS FOUND, MAKE SEARCHES THE
#  OTHER OBJECTS IN THE ACTUAL DIRECTORY. 









ulf
Beiträge: 39
Registriert: 22.09.2002 13:00:52

Beitrag von ulf » 26.09.2004 16:11:05

Hilft Dir

Code: Alles auswählen

$(patsubst pattern,replacement,text)
weiter? (Siehe GNU make manual)

Ulf

alexatdebian
Beiträge: 117
Registriert: 19.07.2004 18:17:42

Beitrag von alexatdebian » 27.09.2004 12:58:03

danke für die tip's !
so funktionierts:

Code: Alles auswählen

#
SHELL=/bin/sh
#
COMPILE=ifc7 -c
MYOPT=-O3
LINK=ifc7

#ROOTDIR=/home/alexp/physik/zrcluster/code
ROOTDIR=.
SOURCEDIR=${ROOTDIR}/src
BINDIR=${ROOTDIR}/bin
OBJDIR=${ROOTDIR}/bin/obj
LFLAGS=-L${OBJDIR}
F90PPDIR=${BINDIR}

LLIBS=

OBJ = mylib.o \
	evaltra.o\

BINNAME=evaltra.x

vpath %.o ${OBJDIR}

default: ${BINDIR}/${BINNAME}


${BINDIR}/${BINNAME}: ${OBJ}
	${LINK} ${MYOPT} -o ${BINDIR}/${BINNAME} ${LFLAGS} $(patsubst %.o,${OBJDIR}/%.o,$(OBJ)) ${LLIBS}



${OBJ}: %.o: ${SOURCEDIR}/%.f90
	${F90PPDIR}/f90pp $< ${OBJDIR}/$*_d.f90
	${COMPILE} ${MYOPT} -o ${OBJDIR}/$@ -module ${OBJDIR} ${OBJDIR}/$*_d.f90

setobjpath:
	echo ${OBJ}
	$(patsubst %.o,${OBJDIR}/%.o,$(OBJ))

new:    touch ${BINDIR}/${BINNAME}

touch:
	touch ${SOURCEDIR}/*.f90

x: 	${BINDIR}/${BINNAME}
	${BINDIR}/${BINNAME}

clean: 
	rm -rf ${OBJDIR}/*.o
	rm -rf ${ROOTDIR}/*.o
	rm -rf ${BINDIR}/*.x

ich hab den vpath drin gelassen, sonst müsste ich beim compile-aufruf für die objekte ${OBJ} mit $(patsubst %.o,${OBJDIR}/%.o,$(OBJ)) ersetzten, das ist mir zu lang ;-)

gruß
alex

Antworten