qmake path mizéria (per jel/vissza per jel)

 ( csfeco | 2015. július 30., csütörtök - 14:05 )

Sziasztok!

Van egy pár méretes Qt project-em, amit eddig csak linux-on fordítottam, de most windows-on is le kellene fordítani. Sajnos a qmake project fájlba beletört a bicskám.
Az a probléma, hogy bison és m4 is kell egy fordításhoz, és ezek a programok a windows stílusban megadott fájl path neveket nem fogadják el. Az eredeti linux-on működő project fájl részlete a bison-os fordításhoz:

#bison definition
bison.name = Bison
bison.input = BISONSOURCES
bison.output = ${QMAKE_FILE_BASE}_yy.cpp
bison.commands = bison -d -o ${QMAKE_FILE_OUT} -v --report-file=bison_report.txt \
${QMAKE_FILE_IN}
bison.clean =
bison.CONFIG += target_predeps
bison.variable_out = SOURCES
QMAKE_EXTRA_COMPILERS += bison

A bison megkapja a forrás fájl nevet windows stílusban (vissza perjelekkel), amit a GNU bison nem ért.
Mgpróbáltam átkonvertálni a nevet a replace függvénnyel :

bison.commands = bison -d -o ${QMAKE_FILE_OUT} -v --report-file=bison_report.txt \
$$replace(${QMAKE_FILE_IN}, \\, /)

Sajnos ez nem az általam várt eredményt hozza, a $$replace(${QMAKE_FILE_IN}, \\, /) kifejezés eredménye egy nagy semmi.

Van valakinek tippje, hogy mi a megoldás, esetleg beszerezhető olyan bison, és m4, ami elfogadja a windows path neveket?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

$$clean_path()?

(Esetleg $$replace(${QMAKE_FILE_IN}, \, /), vagy $$replace(${QMAKE_FILE_IN}, "\\", /)...)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

A $$replace()-t újra kipróbáltam, de mindkét változatra üres string az eredmény.
A $$clean_path() pedig nem csinál semmit (de legalább nem tünteti el a fájl nevet).
Amúgy gyanús volt, hogy emlékeim szerint a GNU Win32 programok elboldogulnak a path-ban a vissza perjellel, és tényleg. Nem a GNU Win32-es bison és m4 futott, hanem a Git for Windows csomagban lévő (Hogy minek abba bison?), és a Git-beli programok tényleg nem értik a vissza perjelet. Persze ez a felismerés nem old meg semmit, mert a GNU-s progik meg a space-t nem szeretik a path-ban (az ms fejlesztőivel ellentétben), és így a bison elhasal, mert nem találja a saját komponenseit.

Érdekes, mert a $clean_path azt hazudja, hogy azt csinálja amit neked kell:
"Returns path with directory separators normalized (converted to "/")". Szóval bugos a doksi...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Vagy ebben a szövegkörnyezetben nem használható. Pl. nem akkor hajtódik végre a konverzió, amikor gondoljuk: nem a path-t konvertálja, hanem a változó nevet, így végeredményben nem csinál semmit.

s ezek a programok a windows stílusban megadott fájl path neveket nem fogadják el.

Nem értem... akkor miért nem használsz UNIX-stílusban megadott path-okat mindenhol? Egyszerűbb, tisztább, szárazabb érzés...

Egyrészt nem én adom meg a path neveket kézzel, hanem a qmake generálja. A qmake olyan stílusban generálja a path-okat, emilyen stílust a futtató környezet megkövetel.
Másrészről ha egy helyen sem tudok megadni UNIX stílusú path neveket, akkor hogyan is adjak meg mindenhol?
Harmadrészt, tartok tőle, hogy a Visual C fordítója sem fog túl jól reagálni a UNIX stílusú path-okra (igaz, nem próbáltam).
Mielőtt megkérdezed, hogy miért használok környezetidegen programokat windows alatt, elmondom, hogy azért, mert nem ismerek (nem találtam, nem ajánlott senki) olyan bison és m4 alternatívát, ami a windowsban nem környezet idegen. (Fizetős szoftver nem játszik, mivel GPL programról van szó)
Továbbá, mielőtt megkérdeznéd azt is. hogy miért nem használok valami mást a bison (vagy yacc) és m4 helyett valami windows barátibb dolgot, akkor elmondom, azért, mert a multiplatformos fejlesztés nem azt jelenti, hogy minden platformra újraírom a fél programot, főleg akkor nem, ha az több mint 36 ezer soros, és nem én vagyok az öreg időmilliomos fia.

A probléma inverzére én ezeket találtam, remélem közelebb visznek a megoldáshoz.

G.
============================================
"Share what you know. Learn what you don't."

Sajnos ez C++ kód, nekem pedig a qmake project fájlban kellene a konverzió.
Mert a qmake úgy generálja meg a makefile fájl-t, hogy a bison és az m4 is az aktuális oprendszer szerinti path-t kapja meg (nagyon helyesen), kevésbé helyeselhető módon viszont a bison és m4 ezt így nem szereti.
Tehát:
Vagy a bison és m4 -ből kellene egy olyan változat, ami nem tartalmazza ezt a hülyeséget.
Vagy a qmake-nek kellene elmagyarázni, hogy bizonyos helyeken a path nem úgy néz ki. Erre elvileg jó lenne a $$replace(...) függvény, csak az az adott helyen nem működik.

Anno a qtwebengine windows build kapcsán belefutottam ilyesmibe, egyszer így oldottam meg.

win32-*: QMAKE_FILE_IN ~= s,\\\\,/,g

Ha windows akkor a változóban átcseréli a perjelet. A te próbálkozásoddal az lehet a baj, hogy több lépésen keresztül dolgozódik fel a fájl és az escape-elésnek ezt túl kell élnie.

Áh mégsem, ez még gányolás volt... van tisztább megoldás:

CLEAN_QMAKE_FILE_IN = $$clean_path($$QMAKE_FILE_IN)

Érdemes nézegetned a jelenlegi állapotát ennek a fájlnak, mert ebben több win alatt jeletkező problémára van megoldás
http://code.qt.io/cgit/qt/qtwebengine.git/tree/tools/qmake/mkspecs/features/gyp_generator.prf

A $$clean_path-ot ajánlottam én is fentebb, de azt mondja, hogy nem működik...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Ja, utólag láttam. Csak előbb a saját gányolásomat találtam meg és csak aztán néztem, hogy a srácok is clean_path-ra korrigálták később.
https://codereview.qt-project.org/#/c/71586/1//ALL,unified

Ha valami csoda folytán nem megy neki, akkor a gány megoldás is szóba jöhet. Igaz a kérdező nem írta a Qt verzióját, de illene működnie az általad is írt megoldásnak.
Úgy nézem Qt4 alatt még nem volt clean_path, hanem tákolt magának, aki kompatibilis akart lenni:
https://github.com/fougue/fougtools/blob/master/qmake/func_cleanpath.pri

Az egyszerű megoldások nem működnek.
A "macska ráfeküdt a billentyűre" stílusú, qmake-féle nyelveket meg majd megtanulom egyszer, ha nagyon sok időm lesz.
Addig marad a gányolás: mivel csak egy .yy fájl van, a forrás nevét beírtam a parancs mintába, és kész (baromi ronda, de működik).
Ez az undormány megoldás működik az m4 esetén is.

Tudom, hogy ez drasztikus lesz, de nem gondolkodtal meg azon, hogy a QMake helyett valami _ertelmesebbel_ dolgozz, pl. CMake-kel? A CMake tamogatja nem csak a VisualC toolchaint, de a GNU cuccokat is, es olyan makefile-t keszit mindenkinek, amilyet eppen megkivan, csak makefile-bol tud legalabb negyfelet kigeneralni, ezen felul ismeri a VisualStudio sajat projektformatumat, az XCode projektstrukturajat, meg meg egy kazal cuccot.

Az az igazsag, hogy en korabban nezegettem a QMake rendszeret, de nekem nagyon fapadosnak tunt, meg nem volt szamomra eleg testreszabhato.
--
Blog | @hron84
Üzemeltető macik

Azért egy Qt alapú fejlesztésnél a qmake eléggé adja magát.
Inkább szemet hunyok egy(nem)kis gányolás felett, minthogy feláldozzak emiatt valamennyi időt, amivel most egyáltalán nem rendelkezem.