Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Makefile mit Dateien in anderem (Arbeits-)verzeichnis

12 views
Skip to first unread message

Peter Mairhofer

unread,
Sep 20, 2008, 11:46:25 AM9/20/08
to
Hi,

ist es möglich, ein Makefile auf ein anderes Arbeitsverzeichnis als das
aktuelle zu verwenden? Und zwar incl. Makros wie patsubst? Am besten
wäre es, wenn ich das Verzeichnis dann per Parameter dem make selbst
übergeben könnte. Konkret z.B.:

$ pwd
/home/me/scripts
$ ls
[...]
do_dies
do_das
do_was_andres
get_macros
Makefile.macros
$ make -f Makefile.macros /home/me/daten/input

Das soll nun im aktuellen Arbeitsverzeichnis ausgeführt werden, jedoch
mit den Dateien in /home/me/daten/input.

So, und warum würde ich sowas wollen?

Für ein proprietäres Projekt schreibe ich gerade einen komplexen
Scriptchain, der sich in /home/me/scripts befindet. Dort sind
haufenweise PHP und Perlscripts und auch Module die die Perlscripts
verwenden. Den kompletten Toolchain verwalte ich mit SVN (und möchte
auch nur das eine Verzeichnis mit SVN verwalten!)

Die Eingabedateien (RTF-Dateien) für diese Chain legen User auf über ein
Samba-Netzlaufwerk nach /home/me/daten/input. Und die sollen eben
*keinen* Code vom Chain enthalten sondern *nur* die Eingabedaten, die
der User dort hinkopiert.

make möchte ich verwenden, weil die Arbeitsschritte teilweise sehr
arbeitsintensiv sind und für jede Dateien Zwischenergebnisse gemacht
werden sollen. Tritt ein Fehler auf, soll eben nicht von vorn angefangen
werden.

Mein aktuelles Makefile:

GETMACROS = get_macros.pl

FNOTES = $(patsubst %.rtf,%.footnotes,$(wildcard *.rtf))

all: $(FNOTES)

%.footnotes: %.rtf
$(GETMACROS) $< $@

clean:
$(RM) *.footnotes

Wie man dem Skript entnehmen kann, erstellt es für alle RTF-Dateien im
aktuellen Verzeichnis *.footnotes Dateien und zwar mit dem Perlscript
get_macros.pl.

Nun soll sich aber wie gesagt das Makefile dazu in einem anderen
Verzeichnis befinden (im gleichen wie get_macros.pl) und auch von diesem
Arbeitsverzeichnis aus ausgeführt werden (damit die Perlscripts z.B.
ihre ganzen Module finden oder die PHP Scripte ihre relativen Includes)

lg,
Peter

Fr@nk Stef@ni

unread,
Sep 20, 2008, 11:57:28 AM9/20/08
to
Hallo Peter,

Peter Mairhofer schrieb:


> ist es möglich, ein Makefile auf ein anderes Arbeitsverzeichnis als das

> aktuelle zu verwenden? [...]

direkt kann ich dir die Frage nicht beantworten, aber
wäre es ein Problem über einen symbolischen Link (Softlink)
aus dem jeweiligen Verzeichnis zuzugreifen?

HDH,
Frank

Peter Mairhofer

unread,
Sep 20, 2008, 12:01:59 PM9/20/08
to
Fr@nk Stef@ni schrieb:
> Hallo Peter,

Hi,

Wie meinst du das genau?

In das Verzeichnis mit den Daten möchte ich eigentlich nichts reingeben
da da die User Vollzugriff drauf haben (sollen) und ich allen Code in
einem Verzeichnis haben möchte.

Umgekehrt kann ich die RTF-Dateien nicht gut ins Codeverzeichnis
(soft)linken weil das sehr viele sind (>1000).

Ausweg wäre es, zuerst Symlinks im aktuellen Verzeichnis zu erstellen,
dann make ausführen, dann die *.footnotes Dateien wieder ins andere
Verzeichnis zu mv'en und die Symlinks wieder zu löschen.

Aber ob das so schön ist?!

Eigentlich möchte ich make ja nur dazu verwenden um Abhängigkeiten
zwischen Dateien einfach erfassen zu können...

mfg,
Peter

jakob kollmann

unread,
Sep 20, 2008, 6:50:42 PM9/20/08
to
Hallo!

Am Sat, 20 Sep 2008 17:46:25 +0200 schrieb Peter Mairhofer:

> Hi,
>
> ist es möglich, ein Makefile auf ein anderes Arbeitsverzeichnis als das
> aktuelle zu verwenden? Und zwar incl. Makros wie patsubst? Am besten
> wäre es, wenn ich das Verzeichnis dann per Parameter dem make selbst
> übergeben könnte. Konkret z.B.:
>

VPATH könnte das richtige für dich sein:
http://www.gnu.org/software/make/manual/html_node/General-Search.html

Auf der Kommandozeile dann:
make -f Makefile VPATH=/pfad/zum/src

hth, jakob

--
jakob kollmann
www.filofant.org

Peter Mairhofer

unread,
Sep 24, 2008, 10:47:42 AM9/24/08
to
jakob kollmann schrieb:

Juhuu, das kommt dem schon sehr nahe was ich suche, vielen Dank :-)

Allerdings muss folgendes geändert werden:

FNOTES = $(patsubst %.rtf,%.footnotes,$(wildcard *.rtf))

zu

FNOTES = $(patsubst %.rtf,%.footnotes,$(notdir $(wildcard $(VPATH)/*.rtf)))

Weiters werden die Dateien im aktuellen Verzeichnis erstellt :-(

Das könnte ich ja umgehen, indem ich statt

%.footnotes: %.rtf
$(GETMACROS) $< $@

%.footnotes: %.rtf
$(GETMACROS) $< $(VPATH)/$@

schreibe. Aber wenn ich dann abbreche (mit STRG+C) wird die
unvollständige Datei nicht gelöscht :-( Sonst macht das make automatisch
was sehr praktisch ist.

Ich hab in der Zwischenzeit eine alternative Lösung gefunden. Die
Perl-Scripts statte ich mit

use FindBin;
use lib "$FindBin::RealBin";

aus. D.h. obwohl Module im gleichen Verzeichnis liegen kann ich sie auch
absolut aufrufen, ohne im gleichen Verzeichnis zu sein.

Ich rufe make nun so auf:

export BINDIR=...
export RTFDIR=$DATADIR/RTF
[...]

make -f $BINDIR/Makefile.footnotes -C $RTFDIR

und rufe die Perlscripts im Makefile einfach mit $(BINDIR)/... auf...

lg
Peter

0 new messages