当我为我的项目运行cabal build
时,它会将编译后的可执行文件放在
dist-newstyle/build/$PLATFORM/$GHC/$PACKAGE-$VERSION/x/$PACKAGE/build/$PACKAGE/$PACKAGE
当我需要运行可执行文件时,我会根据需要使用Makefile
来运行cabal build
。
因为我在不同的时间使用不同的平台,所以我需要一种方法来告诉我的Makefile
期望的$PLATFORM
值是什么。
我有几种方法可以解决这个问题:
- 无条件地运行一次
cabal build
,然后使用通配符:
BIN := $(wildcard dist-newstyle/build/*/ghc-*/foo-*/x/foo/build/foo/foo)
- 使用
uname
预测平台将是什么
BIN := dist-newstyle/build/$(shell uname -m)-$(shell uname -s | some magic)/ghc-$(shell ghc --version | some magic)/foo-$(VERSION)/x/foo/build/foo/foo
- 给予确保二进制文件在
Makefile
中是最新的,而只是无条件地运行cabal run
这些都可以,但是我想知道我是否可以让cabal
告诉我它希望在哪里放置一个可执行文件。
是否可以运行cabal
命令来告诉我它检测到了什么$PLATFORM
和/或$GHC
值?
3条答案
按热度按时间y3bcpkx11#
假设您刚刚运行了
cabal build
,并在dist-newstyle/
目录中生成了一个foo
二进制文件。这将打印出
foo
可执行文件的绝对路径。**注意:**可能需要运行
cabal exec --verbose=0 which foo
,以便cabal
不会打印出有关软件包或配置得额外信息.为什么会这样?
cabal exec
允许您在运行其他cabal命令(如cabal build
)时使用的相同环境下运行命令。因此,您可以运行printenv
和cabal exec printenv
来查看它如何添加和更改一些环境变量。请注意,它将整个dist-newstyle/
路径添加到您的PATH
变量中!所以说
cabal exec which foo
是有效的,因为它就像运行which foo
一样,只是使用了扩展的PATH
变量。这意味着您可以使用一个更好的命令来提取
dist-newstyle/
路径本身:如果您需要在运行
cabal build
之前知道路径,这可能会很有用,在这种情况下,二进制文件将不存在。5ktev3wc2#
cabal exec which $EXENAME$
将为您提供已编译的可执行文件的完整路径。rsaldnfx3#
从cabal 3.8开始,你可以使用
list-bin
命令:这将打印cabal放置可执行文件的路径。注意,它并不能保证可执行文件被编译,所以根据你的用例,你可能也需要检查一下。