Fortran programfordítási nehézségek

Üdv!

Az egyik ismerősöm Fortranban programoz és van egy kis problémája.

Ha így fordítja a programot:

f77 -O -c ~/Documents/user/foo/bar/a00aaft.f akkor megkapja rendesen az a00aaft.o fájlt.

Viszont, ha csak ennyit "f77 -O -c ../bar/a00aaft.f" ír be akkor egy '.o' fájlt kap név nélkül. A fordítás terminálban zajlik Ubuntu alatt. Szerinte valami gond lehet a környezeti változókkal.

uname -a:
Linux maph 3.0.0-13-generic #22-Ubuntu SMP Wed Nov 2 13:27:26 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

A cél az lenne, hogy ha nem abszolút elérési út van akkor is rendesen adjon nevet a programnak a fordító. Azt tudjuk, hogy a -o-val lehet névvel felparaméterezni a fordítót, de mi neki csak annyi kell, hogy a valami.f legyen a neve.

Hozzászólások

NAG library?

Egyébként nálam is ugyanezt csinálja (debian testing). Okát nem tudom egyelőre.

Az f77 nálam egy perl szkript. Belenézve szerintem az van, hogy az object fájl nevét a forrásfájlból állítja elő és a (.f) -> (.c) -> (.o) sorban a kiterjesztés meghatározásában a pontok fontos szerepet játszanak, így a "../" bezavarhat. De lehet, hogy nem így van, ha valaki jobban otthon van a reguláris kifejezésekben, akkor íme:

$lfile = ($basefile =~ /([^\/\.]*\.).*$/)[0] . "o";

$lfile tartalmazza az object fájlt, $basefile a forrás.

Köszi a gyors választ, valóban ez a gond!

Sajnos én nem vagyok egy perl mester, de egy lehetséges megoldás:

use File::Basename;

$lfile = fileparse($basefile,'\..*') . ".o";

Ehhez viszont be kell húzni, a File:Basename osztályt, vagy mit (nem tudom mi van perl-ben... :) ). Lehet kicsit overkill, szóval ha valaki tud egy egysoros regexp-es megoldást, az ne habozzon. Mondjuk ez azért jó mert a perl saját kódja és biztos működik minden esetben, minden oprendszer alatt.

Amúgy a beépített parser alapján:

$lfile = ($basefile =~ s!^.*/([^/]*)$!\1!);

Ezzel annyi a baj, hogy a fájl nevet kiterjesztéssel adja vissza és hogy az eredményt nem az $lfile-ba pakolja, hanem kicseréli a $basefile értékét. Gondolom ez az s operátor miatt van. De nem tudtam átírni, úgy, hogy csak a fájl nevét adja vissza kiterjesztés nélkül és az értéket az $lfile-ba írja, mert ha az s-t kitörlöm az elejéről syntax error-t kapok.

Nem foglalkoztam a dologgal sokat, csak keresni akartam egy működő megoldást.

Igen, nekem is ez volt a problémám, ezért nyitottam a topicot. Eddig az lfile értéke ".o" volt, a cél az lenne, hogy a fájl neve "a00aaft.o" legyen. A zeller megoldásával viszont az lfile értéke "../bar/a00aaft.o" lesz. Mivel nem használok Fortrant, ezért nem tudom, hogy a fájlnévben benne lehet-e az elérési út is vagy nem. Erre irányult a kérdésem.

Lehet cifrázni, hogy az elejétől az utolsó perjelig (nem, nem a szerzetesi elöljáró) el legyen dobva minden, viszont ebben az esetben az aktuális könyvtárba kerül az object fájl, nem pedig a forrásfájl mellé.
A gcc egyébként a gcc -c ../foo/bar/baz.c esetén az aktuális könyvtárba rakja a baz.o fájlt, úgyhogy tényleg illene lecsapni az útvonalat is.

Fordítás menete:
1. preprocesszor
2. object
3. linkelés

A fordítást make-kel kell automatizálni, btw miért kell .. miért nem lehet a ..-ból fordítani? Intel fordító?