当我为我的项目运行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
值?
假设您刚刚运行了cabal build
,并在dist-newstyle/
目录中的某个位置生成了一个foo
二进制文件。您现在可以运行:
cabal exec which 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 exec --verbose=0 printenv PATH | tr ':' 'n' | grep dist-newstyle | head -1
如果您需要在运行cabal build
之前知道路径,在这种情况下二进制文件还不存在,那么这可能很有用。
由于cabal 3.8,您可以使用list-bin
命令:
$ cabal list-bin my-executable-name
这将打印出阴谋集团放置可执行文件的路径。请注意,它实际上并不能保证生成可执行文件,因此根据您的用例,您可能也需要检查这一点。
cabal exec which $EXENAME$
将为您提供已编译可执行文件的完整路径。