问题标签 [shake-build-system]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1082 浏览

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

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

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

0 投票
1 回答
272 浏览

shake-build-system - 如何在 Shake 中定义自定义规则:Development.Shake.Core 被隐藏

我正在尝试使用看起来非常有前途的 Shake,但我碰上了一面小墙。我对haskell很陌生,所以也许我遗漏了一些明显的东西,但这是我的问题:

我想在我的摇动程序中定义一种新的规则。该规则将从依赖项中计算一个值,然后让 Shake 将其存储在其数据库中。因此,如果依赖项是最新的,则shake db 值始终有效。

但是,如果我尝试import Development.Shake.Core我有

如果我不导入它,我有

那么如何定义新规则呢?

额外的问题是:我的想法有趣还是有更好的方法?在考虑如何使用抖动时,我有很多规则会产生这种行为。这样可以避免拥有大量临时文件并利用抖动数据库。事实上,我的下一步是尝试为“文件系统自由规则”定义一个通用规则。用户只需要提供一个key → Maybe (Action value)功能。

0 投票
1 回答
104 浏览

shake-build-system - 添加系统的操作应该改变规则历史

我有这样的规则:

它已正确构建,并且运行构建两次不会构建目标。然后我在这个规则中添加一个系统:

现在运行shake 不会重建“foo”目标,因为没有更改依赖项。总之,规则变了。所以我希望新添加的系统动作会改变规则的历史,进而强制重建“foo”,但事实并非如此。通常在 autoconf/automake 系统中,甚至在非平凡的 makefile 中,规则依赖于 Makefile 本身,因此无论何时更改项目都会重新构建。在 Shake 中,我希望它能够工作并且是细粒度的。

在 system' 的源代码中,我看不到任何对正在运行的命令添加隐式依赖的内容。

难道我做错了什么?是有意不支持这种依赖关系,还是根本没有实现?

0 投票
1 回答
140 浏览

shake-build-system - 将抖动扩展到作为配置工具是否也可行?

在木偶/厨师的脉络中;我真的很想将 Shake 用于本地构建之外。我认为 Shake 的原理足够抽象(虽然我没有深入了解),它可以用作更大的配置构建工具的基础。

0 投票
2 回答
434 浏览

haskell - 您如何使用抖动将 PHONY 目标声明为默认操作?

我正在将 Makefile 转换为 Shakefile,但我不确定如何处理 PHONY make 目标(clean、、install等)。我试过类似的东西:

它成功创建符号链接,但报告错误“错误,规则“安装”未能构建文件:安装”。

那么,如果不是使用“想要”操作,我如何声明我要运行的默认目标是假目标?

0 投票
1 回答
106 浏览

shake-build-system - How to write compilation rules for a bootstrapping compiler

I want to write build rules for a self-hosted compiler. Taking the example of GHC, the GHC compiler is written in Haskell, and compiles Haskell. I want to first compile the source using an existing copy of the GHC compiler (phase1), then compile the compiler using the phase1 compiler (phase2) then compile the compiler using the phase2 compiler. How can I encode that in Shake?

0 投票
1 回答
930 浏览

haskell - Multi-input, multi-output compilers with Shake

I'm experimenting with using Shake to build Java code, and am a bit stuck because of the unusual nature of the javac compiler. In general for each module of a large project, the compiler is invoked with all of the source files for that module as input, and produces all of the output files in one pass. Subsequently we typically take the .class files produced by the compiler and assemble them into a JAR (basically just a ZIP).

For example, a typical Java module project is arranged as follows:

  • a src directory that contains multiple .java files, some of them nested many levels deep in a tree.
  • a bin directory that contains the output from the compiler. Typically this output follows the same directory structure and filenames, with .class substituted for each .java file, but the mapping is not necessarily one-to-one: a single .java file can produce zero to many .class files!

The rules I would like to define in Shake are therefore as follows:

1) If any file under src is newer than any file under bin then erase all contents of bin and recreate with:

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

I know this rule seems excessive, but without invoking the compiler we cannot know the extent of changes in output resulting from even a small change in a single input file.

2) if any file under bin is newer than module.jar then recreate module.jar with:

jar cf module.jar -C bin .

Many thanks!

PS Responses in the vein "just use Ant/Maven/Gradle/" will not be appreciated! I know those tools offer Java compilation out-of-the-box, but they are much harder to compose and aggregate. This is why I want to experiment with a Haskell/Shake-based tool.

0 投票
1 回答
442 浏览

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

是否有可能使用 inotify (或任何 git-annex 和 Yesod 使用的)使 Shake 具有反应性,以便如果文件系统发生更改以暗示该规则应该执行,它会尽早这样做?

0 投票
1 回答
449 浏览

shake-build-system - Shake:当我的规则发生变化时,如何可靠地自动强制重建,与shake数据库不同步?

奶昔有shakeVersion :: String

默认为 1。构建规则的版本号。更改版本号以强制完全重建,例如在对需要擦除的规则进行重大更改时。版本号应该在源代码中设置,而不是在命令行中传递。

稍微改进构建系统非常容易,并且不会注意到它们是需要擦除的重大更改。如果您通过版本控制分发它们,可能会导致我的同事和我的持续集成机器人的构建不正确。

虽然我通过删除来修复自己的构建,但将.shake.database其传达给整个公司并不有趣。

我怎样才能自动处理这个?

0 投票
1 回答
142 浏览

haskell - 有条件地使用带有 Shake 构建系统的 .exe 扩展名

使用美妙的 Shake 构建系统,我想以一种与主机操作系统无关的方式编译一个项目。

我无法检测二进制文件的存在,因为它们在系统之间具有不同的扩展名(即:Windows 使用.exe)。

如果我使用need子句来检测是否存在所需的二进制文件,我如何检查主机是 Linux 还是 Windows MainMain.exe