我为生成一个简单的网页创建了一个 makefile。makefile 背后的想法是这样的:
main.sty必须编译的手写笔 cssone位于lib/examples/one.jade模板文件).coffee脚本文件).md降价文件)example.jade模板用于这些组合成一个示例文件
example.jade必须复制到正确的构建示例目录,因为模板语言只能做相对导入。因此,为了导入example/one/code.html,我们必须将模板复制到example/one并包含它code.html。x都将编译为tbuild/examples/x.htmllib/index.jade模板被移动到build(以便它可以包括示例文件)index.jade模板编译为 html这有点简化,但这样更容易理解。简化是每个例子中实际上有两个标记文件(left.html和right.html),并且代码文件都是通过pygments运行并作为脚本使用的,所以code.html和code.coffee都需要使其成为构建。
现在,makefile 看起来像这样:
LIB = lib
BUILD = build
LIBEX = $(LIB)/examples
BUILDEX = $(BUILD)/examples
EXAMPLES = $(addsuffix .html,$(addprefix $(BUILDEX)/,$(shell ls …Run Code Online (Sandbox Code Playgroud) 从本质上讲,类似以下内容是我正在寻找的东西——或者是一个相当干净的技巧来实现它:
GET_TIMESTAMP = $(shell perl -e 'print time()')
START_TIME := ${GET_TIMESTAMP}
all: T1 T2 ... TN
T1:
T2:
...:
TN:
#...
timer:
@perl -e 'printf( "Loaded makefiles in %ds, build completed in %ds\n", $ARGV[1] - $ARGV[0], $ARGV[2] - $ARGV[1] );' ${START_TIME} ${LOAD_COMPLETE} ${GET_TIMESTAMP}
.ATEND: timer
LOAD_COMPLETE := ${GET_TIMESTAMP}
Run Code Online (Sandbox Code Playgroud)
...可以通过多种方式启动:
~ gmake all
(...)
Loaded makefiles in 8s, build completed in 93s
~ gmake T2 T3 T4
(...)
Loaded makefiles in 8s, build completed …Run Code Online (Sandbox Code Playgroud) 我有一个小脚本,可将 Markdown 文件编译为 html,并将其与一些样式表和 javascript 一起插入到模板的主体中。我有一个 GNU makefile 来完成这个:
output.html: content.md compile.py style.css script.js
python compile.py < $< > $@
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到错误:
make: *无规则生成目标
style.css', needed byoutput.html'。停止。
如果我删除compile.py、style.css和script.js,目标将运行,但它不再依赖于文件,因此我可以在 中进行更改style.css,并且不会重新运行目标。
所有这些文件都在同一目录中:
my_project_directory/
content.md
compile.py
style.css
script.js
Run Code Online (Sandbox Code Playgroud)
如何在不导致错误的情况下将所有这些文件声明为依赖项?
.PHONY: b
c: a
@touch c
@echo "Changed"
a: b
b:
@date +%s > a
Run Code Online (Sandbox Code Playgroud)
使用示例 make 文件运行 make 会导致在第一次运行时打印“Changed”;但是“已更改”仅在第 3 次、第 5 次等执行时打印。这是因为 make 似乎没有意识到执行目标“b”的配方会更新 a。
将“a”作为目标的规则更改为空配方会导致每次 make 运行时打印“Changed”(正如您所期望的 - 虚假目标始终被视为“过时”)。例如
a: b ;
Run Code Online (Sandbox Code Playgroud)
Make 应该跳过对 PHONY 目标的隐式规则搜索,但“a”不是 PHONY。如果没有找到“a”的隐含规则,是否正确地不考虑“a”可能已被其 PHONY 依赖“b”改变?
我知道我可以使用$@makefile 中目标内的自动变量来检索当前目标的名称。现在我想知道是否有可能有一个看起来像这样的 makefile:...
$@:
g++ $@ && ./a.out
Run Code Online (Sandbox Code Playgroud)
这个想法是打字make test.cpp应该g++ test.cpp && ./a.out在应该运行的地方make main.cpp运行g++ main.cpp && ./a.out。
我看到通配符可能与我的问题密切相关。但是,像这样的makefile:
*.cpp:
g++ $@ && ./a.out
Run Code Online (Sandbox Code Playgroud)
确实创建了适当的目标,但是make test.cpp使用这样的 makefile运行会产生make: >>test.cpp<< is already up-to-date- 没有进行编译。
鉴于master.makefile调用子makefile,例如:
downloads:
make -f downloads.makefile
Run Code Online (Sandbox Code Playgroud)
还有一个子makefile,downloads.makefile例如:
download: clean
curl -o ./data/<itemname>.png 'http://www.mysite.com/<itemname>.png'
echo "downloaded <itemname>: Done!"
Run Code Online (Sandbox Code Playgroud)
如何itemname在我的主文件中设置一个全局变量,可用于我的子制作文件?
注意:我的项目实际上更复杂,有 12 个不同的子 makefile,它们应该重用来自主文件的相同参数/变量。masterfile 应该分配值,而 sub-makefile 应该检索我放置的变量的值<itemname>。
我想根据当前目录中的默认 makefile 是否包含某个目标在 shell 中运行某些操作。
#!/bin/sh
make -q some_target
if test $? -le 1 ; then
true # do something
else
false # do something else
fi
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为如果目标不存在,GNU make 会返回错误代码 2,否则返回 0 或 1。问题是没有以这种方式记录。这是男人的一部分:
-q, --question
``Question mode''. Do not run any commands, or print anything;
just return an exit status that is zero if the specified targets
are already up to date, nonzero otherwise.
Run Code Online (Sandbox Code Playgroud)
仅区分零/非零。这样做的正确方法是什么?
是否可以“安全地”扩展 makefile 中的变量,转义 makefile 认为特殊的所有字符?
例如,假设一个变量被用作目标:
${external_chaos}:
dd if=/dev/zero of=${external_chaos}
Run Code Online (Sandbox Code Playgroud)
(例如故意的戏剧)
如果external_chaos包含空格、;、#、:、,或其他 makefile 重要字符,那么整个规则就会混乱。
我想象的解决方案是一些应该执行此操作的 Make 内置函数,例如${escape external_chaos}(想象中的奢侈品)。
${value external_chaos} 不这样做。
我在一个文件夹中有一个 GNUMakeFile(具有该名称),还有一个run.bat写入标准输出的批处理文件。
如何从 GNUMakeFile 调用该批处理文件?
我试过了,@CALL run.bat但似乎不支持 CALL 命令。
cmd run.bat 只是将 cwgwin 终端置于一种“混合 DOS 状态”。
是否有输出“预处理”makefile 的-E选项,相当于 GCC 的选项?
我有一个项目由几十个模块的层次结构组成,每个模块都有自己的 makefile。构建是从主生成文件调用的。该主 makefile 包含包含、变量定义、命令行选项因变量等。
所以,本质上,我正在寻找处理过的 makefile,包括所有替换。