web-dev-qa-db-fra.com

Comment empêcher MinGW et MSYS de modifier les noms de chemins donnés en ligne de commande

Sous Windows, je suis en train de compiler un programme pour ARM/Linux à l'aide de la suite de compilateurs croisés de CodeSourcery. J'utilise MinGW MSYS comme interprète de commande et très souvent, il modifie mes chemins et mes chemins. Par exemple, pour construire mon programme, j'appelle

arm-none-linux-gnueabi-gcc.exe -Wall -g \
    -Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \
    -Wl,-rpath=/usr/lib/myrpath \
    -I../targetsysroot/usr/include \
    myprogram.c -o myprogram

Bien sûr, je veux que /usr/lib/myrpath soit inséré mot pour mot dans l'exécutable myprogram - la cible ARM Linux pour laquelle je compile, n'utilise pas MinGW ou MSYS. Mais voici ce qui finit par y entrer:

...
0x0000000f (RPATH)            Library rpath: [C:/MinGW/msys/1.0/lib/myrpath]
...

Pas exactement ce que je voulais. Si j'appelle directement GCC sur la ligne de commande cmd.exe, j'obtiens le bon chemin dans l'exécutable. Si j'appelle GCC sur la ligne de commande MSYS, j'obtiens le rpath mutilé. Si j'appelle GCC avec un fichier Makefile exécuté avec make à partir de la ligne de commande cmd.exe, j'obtiens toujours un rpath mutilé (!)

Des idées sur comment je pourrais désactiver ce comportement ennuyeux?

38
Ted Middleton

Je viens de découvrir un truc intéressant pour éviter que MSYS/MinGW ne traduise les chemins pour vous.

Si vous utilisez une double barre oblique pour démarrer le chemin, MSYS ne traduira pas le chemin au format DOS. Ainsi, dans l'exemple d'OP, le paramètre -rpath devrait être spécifié comme suit:

-Wl,-rpath=//usr/lib/myrpath

Tous les outils Unix/Linux semblent gérer de telles barres obliques sans problème, donc même si le chemin de votre binaire commencera par // usr/... Je pense que le chargeur fera le bon choix.

20
Gurjeet Singh

est un moyen de supprimer la traduction du chemin en définissant MSYS_NO_PATHCONV=1 dans Windows Git MSys ou MSYS2_ARG_CONV_EXCL="*" dans MSYS2 .

Alternativement, vous pouvez définir la variable uniquement temporairement pour cette commande en mettant l'affectation juste avant la commande elle-même:

MSYS_NO_PATHCONV=1 arm-none-linux-gnueabi-gcc.exe -Wall -g \
    -Wl,--dynamic-linker=/usr/lib/myrpath/ld-linux.so.3 \
    -Wl,-rpath=/usr/lib/myrpath \
    -I../targetsysroot/usr/include \
    myprogram.c -o myprogram
59
Igor Mukhin

Je ne pense pas qu'il y ait un moyen de désactiver cela. MSYS est une fourchette d'une ancienne version de Cygwin avec un certain nombre d'ajustements visant à une meilleure intégration de Windows, la conversion de chemin POSIX automatique lors de l'appel de programmes Windows natifs étant sans doute la plus importante. Le problème, c’est qu’il n’est pas toujours possible de savoir si un argument est un chemin ou autre, ou si, comme dans ce cas, c’est un chemin qui ne devrait pas néanmoins être traduit. La traduction est guidée par un ensemble d'heuristiques .

Vous pouvez essayer d’utiliser MinGW make au lieu de MSYS make (oui, ce sont des choses différentes), qui est une version Windows native de make sans prise en charge et conversion du chemin POSIX. Installez avec mingw-get install mingw32-make et appelez en tant que mingw32-make

Ou vous pouvez essayer Cygwin, idéalement avec une compilation Cygwin de la chaîne d’outils.

5
ak2

Malheureusement, mettre deux barres obliques dans cet exemple ne fonctionne pas comme prévu.

rsync -rvztn --delete --exclude="/application/logs/" ...

Je veux que 'rsync' exclue les fichiers uniquement dans/application/logs, qui se trouve au niveau supérieur, d'où la première barre oblique. L'ajout de deux barres obliques n'entraînera pas l'exclusion de ce répertoire. Je dois recourir au --exclude="application/logs/" moins précis.

0
Steven