如何将配置工具(如sdl-config)与cabalized项目一起使用?

时间:2011-05-17 17:11:26

标签: haskell sdl cabal

我有一个工作的SDL / Haskell应用程序,我想使用Cabal而不是当前的Makefile构建(因为这是“Haskell方式”)。 Makefile本身非常简单,我希望默认的cabal构建过程可以允许我重建我的Makefile中指定的构建命令。问题是它使用了“sdl-config”,这个实用程序为您提供了所有必要的cc编译器选项:

wrapper.o: SDLWrapper_stub.h
    ghc -no-hs-main `sdl-config --cflags` -Wall wrapper.c -c

在调用GHC时,Cabal似乎没有将其扩展为shell调用。如何在编译wrapper.o时指定应将sdl-config的选项输入GHC?

2 个答案:

答案 0 :(得分:8)

使用Cabal中的configure样式,您可以编写一个小的配置脚本,用于替换sdl-config命令输出的变量。这些值将在$ foo.buildinfo.in文件中替换,产生$ foo.buildinfo文件,Cabal将在构建过程中包含该文件。

常规解决方案:配置脚本

 #!/bin/sh

 SDLFLAGS=`sdl-config --cflags`
 echo Found "$SDLFLAGS"
 sed 's,@SDLFLAGS@,'"$SDLFLAGS"',' z.buildinfo.in > z.buildinfo       

$ foo.builinfo.in档案

cc-options: @SDLFLAGS@

.cabal文件

Build-type:          Configure

当您运行“cabal configure”时,将创建z.buildinfo中的“cc-options”字段以保存:

cc-options: -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT 

哪个cabal将包含在构建中。

完成。

pkg-config工具的具体解决方案

对于支持pkg-config-style配置的工具,例如sdlcairo等,Cabal已经提供了特定支持:

  

pkgconfig-depends:包列表

     

构建此程序包所需的pkg-config软件包列表。它们可以用版本注释,例如gtk + -2.0> = 2.10,cairo> = 1.0。如果未指定版本约束,则假定任何版本都是可接受的。 Cabal使用pkg-config查找软件包是否在系统上可用,并找到使用软件包所需的额外编译和链接器选项。

     

如果你需要绑定到支持pkg-config的C库(使用pkg-config --list-all来查明它是否受支持),那么最好使用这个字段而不是硬代码选项其他领域。

因此,对于sdl,您只需要:

pkgconfig-depends: sdl

答案 1 :(得分:3)

Configure文件中使用$PROJ_NAME.cabal构建类型,并使用$PROJ_NAME.buidinfo脚本从$PROJ_NAME.buildinfo.in模板生成configure文件。以Hackage上的SDL库的来源为例。 Cabal用户指南的This section提供了更多详细信息。

一个提示:不要忘记在$PROJ_NAME.buildinfo.in字段中提及configureextra-source-files