2011-02-10 2 views
13

Hackage에서 FFI 바인딩 라이브러리를 유지합니다. 그래서 내 Haskell 라이브러리는 해당 C 라이브러리와 헤더 파일에 의존한다..cabal에서 외부 C 라이브러리에 대한 종속성을 지정하는 방법은 무엇입니까?

PkgConfig-Depends: 
     libfoo >= 1.2 

를 그리고 리눅스에서 나를 위해 잘 작동 : 지금은이 같은 .cabal 파일의 외부 의존성을 지정합니다. '그러나, 나는 Windows에서 pkg-config를 설치하는 것은 다소 복잡 것을보고 라이브러리의 사용자를 가지고 있고, 대신에 그는

Includes: 
     foo.h 
Extra-libraries: 
     foo 

을 선호 내 라이브러리가 가능한 구축하기 쉬운 싶습니다, 그리고 돈 엄격하게 요구되지 않는 빌드 의존성을 강요하고 싶습니다. 그러나 Cabal manualPkgConfig-Depends을 사용하는 것이 좋습니다.

내 질문 :

나는 크로스 플랫폼 패키지를 선호한다 방법
  • ?
  • pkg-config과 같이 작동 할 수있는 방식으로 .cabal 파일을 작성할 수 있습니까?
  • 그리고, 하스켈 플랫폼에는 pkg-config이 포함되어 있습니다 (지금 확인하려면 Windows 컴퓨터가 없습니다)?
+3

pkg-config는 Windows 플랫폼 (2010.2.0.0)에 포함되어 있지 않습니다. –

+0

감사합니다, @ 스티븐. – sastanin

답변

12

pkg-config는 포함 및 라이브러리 파일 (일부 시스템의 비표준 위치에있을 수 있음)을 어디에서 찾을 수 있는지 알고 있기 때문에 pkg-config 방법이 바람직합니다.

두 가지 방법을 모두 사용하도록 .cabal 파일을 작성할 수 있습니다. 여기에 표시된 것처럼 플래그를 사용하면 Cabal이 기본값이 실패 할 경우 다른 플래그 값을 자동으로 시도한다는 장점이 있습니다. (아래 예는 테스트되지 않음)

Flag UsePkgConfig 
    Description: Use pkg-config to check for library dependences 
    Default: True 

Executable hax 
    if flag(UsePkgConfig) 
    PkgConfig-Depends: libfoo >= 1.2 
    else 
    Includes: foo.h 
    Extra-libraries: foo 
+0

감사합니다. 나는 플래그로이 접근법을 선택했다. 대신'Cabal configure -fNoPkgConfig'가'cabal configure -f-UsePkgConfig'보다 읽기 쉽기 때문에 'NoPkgConfig' 플래그를 대신 사용했다. 이 방법은 리눅스 ('pkg-config'가 설치되어 있거나 설치되어 있지 않은 상태)에서 잘 작동합니다.나는 Windows 사용자 피드백이 나중에 무엇인지보고 할 것이다. – sastanin

+0

업데이트 :이 방법은 Windows에서도 잘 작동합니다. – sastanin

5

pkg-config은 하스켈 플랫폼에 포함되어 있지 않으며, 상상할 수도 없습니다.

비교적 간단하다면 보통 includes/Extra-libraries을 사용합니다. 그러나 gtk와 같이 많이 포함 된 라이브러리가있는 복잡한 패키지의 경우 사용 가능한 경우 pkg-config를 사용하는 것이 훨씬 더 좋습니다.

특정 필드의 유무에 관계없이 .cabal 파일을 작성할 수 있습니다. 이 시도 :

if os(windows) 
    Includes: 
     foo.h 
    Extra-libraries: 
     foo 
else 
    PkgConfig-Depends: 
     libfoo >= 1.2 

는 또한 .cabal 어떤 상황에서 도움이되지만 매우 창 친화적하지 수있는 구성 스크립트를 실행할 수 있습니다.

+0

감사합니다. 이런 식으로 생각했지만 아마도 @Heatsink가 제안한 해결책은 더 융통성이 있습니다. 나는 그것을 먼저 시도 할 것이다. – sastanin

+2

@jetxee - 플래그는보다 유연 할 수 있지만 문제가 발생할 수도 있습니다. Cabal은 새 패키지가 다른 플래그 세트로 빌드 될 때 이미 설치된 패키지를 다시 컴파일하려고합니다. 그러면 패키지 db를 일관성없는 상태로 만들 수 있습니다. 나는 단지 패키지 DB를 고쳐야하기 때문에 편향 될 수있다. –

관련 문제