如何在不安装的情况下编译haskell包?

如何在不安装的情况下编译haskell包?,haskell,cabal,cabal-install,Haskell,Cabal,Cabal Install,我可以使用cabal install安装上述软件包。但是我想运行rawghc命令来编译二进制文件,而不需要安装 有人能告诉我怎么做吗?首先,您需要安装所有依赖项,您可以使用cabal安装来完成这一操作--仅依赖项。然后您需要创建一个包含以下内容的文件path\u ShellCheck.hs: module Paths_ShellCheck where import Data.Version version = Version [0,7,2] [] 然后可以使用此GHC命令: ghc \ -

我可以使用
cabal install
安装上述软件包。但是我想运行raw
ghc
命令来编译二进制文件,而不需要安装


有人能告诉我怎么做吗?

首先,您需要安装所有依赖项,您可以使用
cabal安装来完成这一操作--仅依赖项
。然后您需要创建一个包含以下内容的文件
path\u ShellCheck.hs

module Paths_ShellCheck where
import Data.Version
version = Version [0,7,2] []
然后可以使用此GHC命令:

ghc \
  --make \
  -O \
  -package-db ~/.cabal/store/ghc-8.10.4/package.db \
  -hide-all-packages \
  -package regex-tdfa \
  -package parsec \
  -package containers \
  -package base \
  -package deepseq \
  -package mtl \
  -package QuickCheck \
  -package array \
  -package aeson \
  -package bytestring \
  -package Diff \
  -package filepath \
  -package directory \
  src/ShellCheck/*.hs \
  src/ShellCheck/*/*.hs \
  Paths_ShellCheck.hs \
  shellcheck.hs
它将生成可执行文件
外壳检查
。请注意,这是专门针对GHC 8.10.4的,如果要使用另一个GHC版本,可以对其进行更改


如果您甚至不想运行
cabal install--dependencies only
,那么最简单的方法可能是复制所有依赖项的所有*.hs源文件,将它们添加到末尾的globs中,并删除相应的
-package…
参数。您也许可以保留与GHC捆绑在一起的包:即base、deepseq、mtl、containers、array、bytestring、filepath、parsec和directory。这就剩下了Diff、aeson、QuickCheck和regex-tdfa以及它们的可传递依赖项。

这里是通常的方法。第一步是获得代码的副本。这两种方法中的一种可以做到:

% git clone https://github.com/koalaman/shellcheck
% cabal unpack shellcheck
一旦您进入代码目录,您可以使用
build
命令而不是
install
命令,要求
cabal
在不安装它的情况下构建它

% cabal build
如果您想查看
cabal
为此任务调用的子命令序列,可以要求它通过增加详细程度来显示它们

% cabal build -v3

使用
cabalbuild-v3
,我看不到原始ghc命令,我只看到类似
[2/23]编译ShellCheck.Regex(src/ShellCheck/Regex.hs,…)
。如何查看原始的
ghc
命令?那些
编译…
消息来自
ghc
调用之后/期间,您需要向上滚动一点。@user1424739例如,第3148、3221和3694行是
ghc
调用。您提到的每个ghc。如果ghc单独编译每个hs文件,我希望看到每个hs文件都有一个单独的ghc命令,而不是许多hs文件都有一个ghc命令。@user1424739好吧,你的期望是不正确的。这仍然是更基本命令的包装吗?ghc是否有类似于.c->.o->.bin的每个文件编译(如gcc),以便我可以编译每个文件并链接它们?ghc确实生成所有输入.hs文件的.o文件,您可以在生成这些文件后传递
-c
选项以停止。您可以将.o文件作为输入传递给GHC,然后GHC将链接到最终的可执行文件中。