我有一个工作的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?
答案 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配置的工具,例如sdl
或cairo
等,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
字段中提及configure
和extra-source-files
。