2016-08-05 36 views
0

Es gibt einen Paket-Clipper http://hackage.haskell.org/package/clipper, den ich verwenden möchte, um den Schnittpunkt komplexer Polygone zu erkennen. Es ist ein FFI zu einem C++ Paket. Es funktioniert gut, wenn SieKompilieren des Haskell-Pakets mit C++ und Stack/CABAL

cabal build --with-gcc=/usr/bin/g++

laufen, aber sonst nicht. Gibt es eine Möglichkeit, diese GCC-Option in die Cabal-Datei einzufügen oder mein Stack-Projekt anderweitig dazu zu bringen, die Abhängigkeit mit g ++ aufzubauen?

Einstellung der $ PATH aus irgendeinem Grund nicht funktioniert:

% cabal build --with-gcc=g++ 
Building clipper-0.0.1... 
Preprocessing library clipper-0.0.1... 
[1 of 1] Compiling Algebra.Clipper (dist/build/Algebra/Clipper.hs, dist/build/Algebra/Clipper.o) 
In-place registering clipper-0.0.1... 

% PATH=$(pwd):$PATH gcc 
g++: fatal error: no input files 
compilation terminated. 

% PATH=$(pwd):$PATH cabal build 
Building clipper-0.0.1... 
Preprocessing library clipper-0.0.1... 
In file included from Clipper.hsc:27:0: 
cbits/clipper.hpp:29:18: fatal error: vector: Dosiero aŭ dosierujo ne ekzistas 
compilation terminated. 
compiling dist/build/Algebra/Clipper_hsc_make.c failed (exit code 1) 
command was: /usr/bin/gcc -c dist/build/Algebra/Clipper_hsc_make.c -o dist/build/Algebra/Clipper_hsc_make.o -fno-stack-protector -D__GLASGOW_HASKELL__=710 -Dlinux_BUILD_OS=1 -Dx86_64_BUILD_ARCH=1 -Dlinux_HOST_OS=1 -Dx86_64_HOST_ARCH=1 -Icbits -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/haskell/ghc-7.10.2-x86_64/lib/ghc-7.10.2/base_GDytRqRVSUX7zckgKqJjgw/include -I/usr/local/haskell/ghc-7.10.2-x86_64/lib/ghc-7.10.2/integ_2aU3IZNMF9a7mQ0OzsZ0dS/include -I/usr/local/haskell/ghc-7.10.2-x86_64/lib/ghc-7.10.2/include -I/usr/local/haskell/ghc-7.10.2-x86_64/lib/ghc-7.10.2/include/ 

In ähnlicher Weise die Setup.hs ändern, wie vorgeschlagen, durch das folgende @ErikR nicht helfen.

% runghc Setup.hs build 
"Hello, I am running" 
fomg 
BuildFlags 
    { buildProgramPaths = [] 
    , buildProgramArgs = [] 
    , buildDistPref = Flag "dist" 
    , buildVerbosity = Flag Normal 
    , buildNumJobs = NoFlag 
    , buildArgs = [] 
} 
fimg 
BuildFlags 
    { buildProgramPaths = [ ("gcc" , "/usr/bin/g++") ] 
    , buildProgramArgs = [] 
    , buildDistPref = Flag "dist" 
    , buildVerbosity = Flag Normal 
    , buildNumJobs = NoFlag 
    , buildArgs = [] 
    } 
Building clipper-0.0.1... 
Preprocessing library clipper-0.0.1... 
In file included from Clipper.hsc:27:0: 
(etc) 

Beachten Sie, dass es an der buildHook Linie abstürzt, so um die Fahnen gedruckt zu bekommen ich um die Reihenfolge zu ändern benötigt.

Antwort

0

Versuchen Sie, diese einfachere benutzerdefinierte Setup.hs Datei:

import Distribution.Simple 
import System.Environment 

main = do 
    args <- getArgs 
    defaultMainArgs $ ["--with-gcc=c++"] ++ args 

Original-Antwort

Einige Ideen:

(1) ein Wrapper-Skript erstellen gcc genannt, die g++ aufruft. Platzieren Sie das Skript früh in Ihrem PATH, sodass gcc Ihr Skript anstelle des echten gcc ausgeführt wird. Vielleicht haben Sie dieses Wrapper-Skript nur dann, wenn Sie das Clipper-Paket erstellen.

(2) Schreiben Sie eine benutzerdefinierte Setup.hs.

  1. Ändern Sie den build-type Feld in der clipper.cabal Datei die Setup.hs mit Datei ersetzen Custom statt Simple
  2. zu sein:

    import Distribution.Simple 
    import Distribution.Simple.Setup 
    import Distribution.Simple.LocalBuildInfo 
    import Distribution.PackageDescription 
    import Text.Show.Pretty 
    
    main = do 
        let hooks = simpleUserHooks 
    
         myBuild :: PackageDescription -> LocalBuildInfo -> UserHooks -> BuildFlags -> IO() 
         myBuild pkgd buildinfo uhooks flags = do 
         putStrLn $ ppShow flags 
         let flags' = flags { buildProgramPaths = [("gcc","g++")] ++ (buildProgramPaths flags) } 
         buildHook hooks pkgd buildinfo uhooks flags' 
         putStrLn $ ppShow flags' 
         hooks' = hooks { buildHook = myBuild } 
    
        defaultMainWithHooks hooks' 
    

Hinweis

: Der Import von Text .Show.Pretty ist nicht notwendig, also können Sie es entfernen und die ppShow-Aufrufe, wenn Sie es nicht installiert haben.

Die obige Setup.hs sollte den gleichen Effekt haben wie cabal mit --with-gcc=g++ aufrufen.

+0

Leider haben Ihre Lösungen nicht funktioniert. Ich habe meiner Frage einige Kommentare hinzugefügt, um meine Erfahrung zu beschreiben. – Tristan

+0

Danke, dieser einfachere Vorschlag funktioniert. – Tristan