9

我有一个可用的 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 调用。如何在编译时指定 sdl-config 的选项应输入 GHC wrapper.o

4

2 回答 2

8

使用configureCabal 中的样式,您可以编写一个小配置脚本,用一个变量替换 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 

哪个阴谋集团将包括在构建中。

完毕。

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

对于支持pkg-config 配置风格的工具,例如sdlorcairo和其他,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
于 2011-05-17T17:44:12.530 回答
3

使用文件Configure中的构建类型并使用脚本从模板$PROJ_NAME.cabal生成文件。以 Hackage 上的SDL库的源代码为例。Cabal 用户指南的这一部分提供了更多详细信息。$PROJ_NAME.buidinfo$PROJ_NAME.buildinfo.inconfigure

一个提示:不要忘记在现场提及$PROJ_NAME.buildinfo.in和。configureextra-source-files

于 2011-05-17T17:40:02.987 回答