Hallo,
ich dreh mich grad im kreis
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}
######################################################
make & liste
Ich glaube du suchst VPATH.
[1] http://www.cvc.mun.ca/software/gmake/do ... html#SEC27
eaglegmake 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.
[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
-
- Beiträge: 117
- Registriert: 19.07.2004 18:17:42
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
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.
Hilft Dir
weiter? (Siehe GNU make manual)
Ulf
Code: Alles auswählen
$(patsubst pattern,replacement,text)
Ulf
-
- Beiträge: 117
- Registriert: 19.07.2004 18:17:42
danke für die tip's !
so funktionierts:
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
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