标签: shake-build-system

如何在Shake中编写定点构建规则,例如Latex

使用Shake Haskell构建库,如何使用需要达到固定点的程序编写规则?想象一下,我有一个程序foo,它接受一个文件input并生成一个输出文件,应该foo重复应用,直到输出文件没有改变.我怎么能在Shake中写出来?

这种模式的典型例子是LaTeX.

haskell shake-build-system

16
推荐指数
1
解决办法
952
查看次数

为什么Shake建议禁用空闲垃圾回收?

在Shake文档中,它建议使用标志-with-rtsopts=-I0进行编译以禁用空闲垃圾回收.为什么Shake建议这样做?

haskell shake-build-system

16
推荐指数
1
解决办法
522
查看次数

具有Shake的多输入多输出编译器

我正在尝试使用Shake来构建Java代码,由于javac编译器的不寻常特性,我有点卡住了.通常,对于大型项目的每个模块,将使用该模块的所有源文件作为输入调用编译器,并在一次传递中生成所有输出文件.随后我们通常采用编译器生成的.class文件并将它们组装成JAR(基本上只是一个ZIP).

例如,典型的Java模块项目安排如下:

  • 一个src包含多个.java文件的目录,其中一些嵌套在树的深层.
  • bin包含编译器输出的目录.典型地,这输出遵循相同的目录结构和文件名,以.class取代对每个java文件,但该映射是必然一到一种:单java文件可以产生零到许多.class文件!

因此,我想在Shake中定义的规则如下:

1)如果下面的任何文件src任何文件更新,bin则擦除所有内容bin并重新创建:

javac -d bin <recursive list of .java files under src>

我知道这个规则似乎过多,但是如果不调用编译器,我们就无法知道输出的变化程度,即使是单个输入文件中的一个小变化也是如此.

2)如果任何文件bin比新文件更新,module.jar则重新创建module.jar:

jar cf module.jar -C bin .

非常感谢!

PS响应"只使用Ant/Maven/Gradle /"将不胜感激!我知道这些工具提供开箱即用的Java编译,但它们更难以编写和聚合.这就是为什么我想试验一个基于Haskell/Shake的工具.

haskell shake-build-system

14
推荐指数
1
解决办法
803
查看次数

如何使用Shake编译Haskell程序

我有一个Haskell程序,我想用GHC编译,由Shake构建系统编排.我应该执行哪些命令,以及在什么情况下应该重新运行?

haskell shake-build-system

7
推荐指数
1
解决办法
185
查看次数

SCons和Shake之间的差异

我正在研究Python/Haskell项目,我正在寻找替代方案Makefile.明显的选择是Python SCons和Haskell Shake.由于我对其中任何一个都没有经验,我想问一下他们的缺点和优点是否有任何比较.

更新:该项目对构建有一些复杂的要求:

  • 让用户配置类似构建的选项以启用/禁用,工具路径等.
  • 在编译时生成Haskell和Python文件.他们的依赖应该正常工作.
  • 有多个Haskell程序共享大多数源文件.我想这样:
    • 可以单独构建每个,而不是构建不需要的源;
    • 编译多个程序时,源文件不会多次构建;
    • 如果可能的话,在编译期间实现并行性.
  • 检查目标系统及其路径(如一些安装的程序python,flock等等)
  • 检查目标系统的依赖关系,包括Python,Haskell.
  • 根据依赖关系参数化构建 - 如果缺少测试的依赖关系,仍然可以构建项目,跳过测试(并通知用户).

haskell build scons shake-build-system

6
推荐指数
1
解决办法
685
查看次数

如何检查运行抖动是否会重建目标(实际上没有尝试构建它)?

在某些情况下,我想非常快速地知道某个目标文件是否是最新的,即是否使用摇动构建它会运行任何传递给目标的规则.

摇动实现这一目标的最佳方法是什么?

我的问题与Shake有些相关:表示是否必须重建任何东西.但是,我不想运行实际构建,因为我不想触摸任何构建产品.

haskell shake-build-system

6
推荐指数
1
解决办法
116
查看次数

Shake可以跟踪构建命令使用的线程数,这些命令本身是并行的吗?

在可能的情况下,Shake并行构建事物,但如果单个构建步骤本身可并行化会发生什么?例如,我正在运行BLAST命令.每个命令都比较两个物种的基因组.几个比较可以并行运行,但也有一个标志将比较分成N个块并并行运行.我是否需要选择一种方法来分割作业并坚持下去,或者我可以告诉Shake"整体使用N个线程,以及每个特定任务自己占用N个线程的方式"?

(当比较许多小细菌基因组和一些较大的真核细胞基因组时会出现这种情况)

编辑:问题可以简化为"如何判断Shake当前正在运行/排队的Shake线程数量?"

haskell shake-build-system

6
推荐指数
1
解决办法
84
查看次数

如何使用Shake库构建反应式构建系统?

是否有可能使用inotify(或任何git-annex和Yesod使用)使Shake成为被动的,这样如果文件系统以某种方式改变以暗示该规则应该执行,那么它是否应该尽早实现?

haskell reactive-programming shake-build-system

5
推荐指数
1
解决办法
404
查看次数

如何使用Shake执行sh命令

我正在尝试将现有的makefile迁移到Shake,到目前为止我已尝试过以下内容(只需创建一个包含目录内容的文件)

module Main where
import Development.Shake

main :: IO ()
main = shakeArgs shakeOptions{shakeFiles="_build"} $ do
    let ls = "_build/ls.txt"
    want [ls]
    ls *> \out ->  do
        cmd "ls >  " out
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到以下错误消息:

> runghc test.hs _build/ls.txt
# ls (for _build/ls.txt)
ls: >: No such file or directory
ls: _build/ls.txt: No such file or directory
Error when running Shake build system:
* _build/ls.txt
Development.Shake.cmd, system command failed
Command: ls > _build/ls.txt
Exit code: 1
Stderr:
ls: >: No such file …
Run Code Online (Sandbox Code Playgroud)

haskell shake-build-system

5
推荐指数
1
解决办法
437
查看次数

如何定义抖动规则来构建 docker 镜像?

我有一个震动构建(版本 0.16.4),它从Dockerfiles 和其他支持文件中构建了很多 docker 图像。我想将所有这些构建在一个“规则”中,其输出将是一个 docker 图像。我已经阅读了如何在 Shake 中定义计时器规则关于shake 中的自定义规则,但这并没有解释如何定义自己的输出

我想表达类似的东西

 Image "foo" "latest" %> \ img -> do
     need [ ... ]
     buildDockerImage "docker/foo" img

 Image "bar" "latest" %> \ img -> 
     needImage "foo" "latest"
     ...
Run Code Online (Sandbox Code Playgroud)

然后将图像作为依赖项进行抖动跟踪。我已经在旧版本的shake中实现了那种东西,但我对如何在> 0.16中做到这一点一无所知。

更新

我已经尝试过这个,遵循https://hackage.haskell.org/package/shake-0.17.3/docs/Development-Shake-Rule.html的指导方针

newtype Repo = Repo String
    deriving (Show, Eq, Hashable, Binary, NFData)

newtype Tag = Tag String
    deriving (Show, Eq, Hashable, Binary, NFData)

newtype SHA256 = SHA256 String
    deriving (Show, Eq, …
Run Code Online (Sandbox Code Playgroud)

haskell build shake-build-system docker

5
推荐指数
1
解决办法
179
查看次数