2016-11-05 5 views
1

Je travaille sur un programme Haskell qui est lié à un ancien code C++. J'ai créé une interface C et l'ai fait fonctionner avec ghc seulement. Maintenant, j'ai essayé de convertir le Makefile utilisé dans un projet Cabal et maintenant cabale sur la dernière étape sélectionne le mauvais éditeur de liens.Cabal sélectionne un mauvais éditeur de liens

En raison de certaines dépendances, je dois utiliser un bon vieux GHC et gcc. Alors ce que je fais appelle cabale comme celui-ci (1.24.0.0.):

cabal install --with-ghc=ghc-7.6.3 --with-gcc=/opt/gcc-3.3.6/bin/gcc --with-ld=/opt/gcc-3.3.6/bin/gcc 

Pour configurer compile- et intermédiaire reliant tout est ok, avec -v3 je reçois les lignes suivantes:

Using gcc version 3.3.6 given by user at: /opt/gcc-3.3.6/bin/gcc 
Using ghc version 7.6.3 given by user at: /home/oswald/ghcs/bin/ghc-7.6.3 
... 
Using ld given by user at: /opt/gcc-3.3.6/bin/gcc 

Tout fonctionne bien jusqu'à ce que l'étape de liaison finale:

Linking dist/dist-sandbox-c45ed4c7/build/MISCconfig/MISCconfig ... 
*** C Compiler: 
'/opt/gcc-3.3.6/bin/gcc' '-c' '/tmp/ghc28340_0/ghc28340_0.c' '-o' ...    
*** C Compiler: 
'/opt/gcc-3.3.6/bin/gcc' '-c' '/tmp/ghc28340_0/ghc28340_0.s' '-o' ...  
*** Linker: 
'/usr/bin/gcc' '-fno-stack-protector' '-Wl,--hash-size=31' '-W 

Ainsi, la dernière ligne spécifie /usr/bin/gcc que l'éditeur de liens, qui est le système un et donc je reçois des erreurs de lien wHER e il devrait être /opt/gcc-3.3.6/bin/gcc (doit utiliser un gcc pré-3.4.0 en raison de la compatibilité des liens pour l'une des bibliothèques C++ utilisées et gcc 3.3.6 est le dernier avec l'ancien ABI).

Alors qu'est-ce que je fais mal? Cabal dit qu'il sélectionne l'éditeur de liens de l'ancien gcc mais utilise en fait le plus récent du système?

Lorsque je viens d'utiliser GHC avec le -pgmc /opt/gcc-3.3.6/bin/gcc commutateur dans un makefile tous les travaux, mais je préférerais obtenir un bac à sable ... cabale travailler

+0

Le '*** compilateur C:.' et sortie suivante provient de GHC. Comment la cabale invoque-t-elle ghc? –

+0

(Si vous venez de lancer 'cabal build -v', la dernière ligne vous le dira.) –

+0

Ceci est la sortie: [lien gist] (https://gist.github.com/anonymous/41dd5f00401ce897e5cc7f190bc276ae) – MichaelO

Répondre

2

Cela avait apparemment rien à voir avec Cabal, qui ne donne pas instruction à GHC utilisez le compilateur C spécifié par l'option Cabal --with-gcc.

Utilisez -pgml pour sélectionner l'éditeur de liens comme indiqué sur la page de manuel GHC.

(Un point qui peut causer de la confusion pour les autres et est digne de mention. GHC utilise toujours un compilateur C faire l'étape de liaison finale. Cela signifie -pgml doit se référer à quelque chose comme gcc, pas quelque chose comme ld. Drapeaux Par conséquent destiné à être consommé par ld comme -rpath doit être préfixé par -Wl, avant d'être introduit à -optl)