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



当我为我的项目运行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(时使用的相同环境中运行命令。因此,您可以运行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之前知道路径,在这种情况下二进制文件还不存在,那么这可能很有用。

由于cabal 3.8,您可以使用list-bin命令:

$ cabal list-bin my-executable-name

这将打印出阴谋集团放置可执行文件的路径。请注意,它实际上并不能保证生成可执行文件,因此根据您的用例,您可能也需要检查这一点。

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

最新更新