Компиляция пакета Haskell с использованием c ++ и stack / cabal

Есть клиппер пакетов http://hackage.haskell.org/package/clipper, который я хочу используйте для обнаружения пересечения сложных многоугольников. Это FFI для пакета C ++. Он отлично работает, если вы запустите

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

но не иначе. Есть ли способ поместить эту опцию gcc в файл cabal или иным образом заставить мой стековый проект построить зависимость с g ++?

Установка $ PATH по какой-то причине не работает:

%  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/

Точно так же изменение Setup.hs, предложенное @ErikR ниже, не помогло.

% 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)

Обратите внимание, что он вылетает в строке buildHook, поэтому, чтобы напечатать флаги, мне нужно было изменить порядок.


person Tristan    schedule 05.08.2016    source источник


Ответы (1)


Попробуйте этот более простой настраиваемый файл Setup.hs:

import Distribution.Simple
import System.Environment

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

Исходный ответ

Некоторые идеи:

(1) Создайте сценарий оболочки с именем gcc, который вызывает g++. Поместите сценарий в начале пути в PATH, чтобы запуск gcc запускал ваш сценарий вместо реального gcc. Возможно, у вас есть этот сценарий оболочки только тогда, когда вы создаете пакет клиппера.

(2) Напишите собственный файл Setup.hs.

  1. Измените поле build-type в файле clipper.cabal на Custom вместо Simple
  2. Замените файл Setup.hs на:

    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'
    

Примечание. Импорт Text.Show.Pretty не требуется, поэтому вы можете удалить его и вызовы ppShow, если он у вас не установлен.

Вышеупомянутый Setup.hs должен иметь тот же эффект, что и вызов группы с помощью --with-gcc=g++.

person ErikR    schedule 05.08.2016
comment
К сожалению, ваши решения не сработали. Я добавил несколько комментариев к своему вопросу, чтобы описать свой опыт. - person Tristan; 07.08.2016