Fórumok
Ü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.
Ott a pont. Az első pont utáni részt cseréli le, miközben az utolsó pont utánit kéne...
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.
Hol vannak ilyenkor a perl mesterek? :)
Valaki beírhatna valami szép egyszerű megoldást...
Ez nem lesz jó.
Miért nem jó?
Most, hogy rákérdeztél már nem vagyok benne biztos, de az $lfile értéke nem csak a fájl neve lehet? Az nem baj, hogy ott van az elérési út is?
Az object fájl neve eddig is "beállítódott" (.o), és létre is jött, de mivel rejtett fájl lett és a neve egyáltalán nem emlékeztetett a forrásfájl nevére, ezért ez nem tetszett...
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ó?