haskell 我怎么能提前知道阴谋集团会把一个生成的可执行文件放在哪里?

i2byvkas  于 2022-11-14  发布在  其他
关注(0)|答案(3)|浏览(143)

当我为我的项目运行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值?

y3bcpkx1

y3bcpkx11#

假设您刚刚运行了cabal build,并在dist-newstyle/目录中生成了一个foo二进制文件。

cabal exec which foo

这将打印出foo可执行文件的绝对路径。

**注意:**可能需要运行cabal exec --verbose=0 which foo,以便cabal不会打印出有关软件包或配置得额外信息.

为什么会这样?

cabal exec允许您在运行其他cabal命令(如cabal build)时使用的相同环境下运行命令。因此,您可以运行printenvcabal 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之前知道路径,这可能会很有用,在这种情况下,二进制文件将不存在。

5ktev3wc

5ktev3wc2#

cabal exec which $EXENAME$将为您提供已编译的可执行文件的完整路径。

rsaldnfx

rsaldnfx3#

从cabal 3.8开始,你可以使用list-bin命令:

$ cabal list-bin my-executable-name

这将打印cabal放置可执行文件的路径。注意,它并不能保证可执行文件被编译,所以根据你的用例,你可能也需要检查一下。

相关问题