下面是我与 Cabal 包一起使用的 Makefile 的简化版本,我正在与另一个依赖于 Cabal 包的 Haskell 程序并行开发(我经常并行编辑它们,因此我将 Cabal 包作为构建依赖项程序,使用另一个 Makefile :P)。目标是:
仅cabal
在某些源文件实际更改时运行。我在一个非常慢的上网本上使用这个 Makefile,其中 Cabal 依赖解析步骤需要 10 秒,所以我想尽可能避免运行cabal install
。
在单独的构建目录中进行独立调试和定期构建。默认情况下,如果您使用 profiling ( --ghc-options=-fprof-auto
) 进行 Cabal 构建,然后没有进行 profiling,Cabal 将重新开始,从头开始重新编译所有文件。将构建放在单独的构建目录中可以避免这个问题。
我不确定 (2) 是否对您感兴趣,但 (1) 可能是,而且我看到您只在成功时触摸构建目录,而不是在失败时,我希望这不会正常工作。
这是生成文件:
cabal-install: dist
cabal-install-debug: prof-dist
# You will need to extend this if your cabal build depends on non
# haskell files (here '.lhs' and '.hs' files).
SOURCE = $(shell find src -name '*.lhs' -o -name '*.hs')
# If 'cabal install' fails in building or installing, the
# timestamp on the build dir -- 'dist' or 'prof-dist', stored in
# the make target variable '$@' here -- may still be updated. So,
# we set the timestamp on the build dir to a long time in the past
# with 'touch --date "@0" $@' in case cabal fails.
CABAL_INSTALL = \
cabal install $(CABAL_OPTIONS) \
|| { touch --date "@0" $@ ; \
exit 42 ; }
dist: $(SOURCE)
$(CABAL_INSTALL)
# Build in a non-default dir, so that we can have debug and non-debug
# versions compiled at the same time.
#
# Added '--disable-optimization' because '-O' messes with
# 'Debug.Trace.trace' and other 'unsafePerformIO' hacks.
prof-dist: CABAL_OPTIONS += --ghc-options="-fprof-auto" --builddir=prof-dist --disable-optimization
prof-dist: $(SOURCE)
$(CABAL_INSTALL)