标签: gnu-make

我需要帮助减少 makefile 中的依赖项

我为生成一个简单的网页创建了一个 makefile。makefile 背后的想法是这样的:

  • 我们正在编译一个网页,index.html
  • index.html 需要main.sty必须编译的手写笔 css
  • 页面中使用了许多示例
    • 例如,代码one位于lib/examples/one
    • 每个示例包含三个部分
      • 标记(.jade模板文件)
      • 一些代码(一个.coffee脚本文件)
      • 描述(.md降价文件)
  • 构建脚本必须将每个示例呈现为单个 html 文件
    • Jade、Pygments、Markdown 生成三个html文件
    • 一个example.jade模板用于这些组合成一个示例文件
      • example.jade必须复制到正确的构建示例目录,因为模板语言只能做相对导入。因此,为了导入example/one/code.html,我们必须将模板复制到example/one并包含它code.html
    • 完成后,每个示例x都将编译为tbuild/examples/x.html
  • lib/index.jade模板被移动到build(以便它可以包括示例文件)
  • 然后使用 Jade 将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)

makefile gnu-make

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

GNU make:定时构建,是否可能有一个目标,其配方在所有目标完成后执行

我的问题类似于this onethis one

从本质上讲,类似以下内容是我正在寻找的东西——或者是一个相当干净的技巧来实现它:

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)

gnu-make

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

具有多个依赖项的 Makefile 目标

我有一个小脚本,可将 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.pystyle.cssscript.js,目标将运行,但它不再依赖于文件,因此我可以在 中进行更改style.css,并且不会重新运行目标。

所有这些文件都在同一目录中:

my_project_directory/
    content.md
    compile.py
    style.css
    script.js
Run Code Online (Sandbox Code Playgroud)

如何在不导致错误的情况下将所有这些文件声明为依赖项?

makefile gnu-make

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

当 PHONY 依赖项更新时,为什么 make 不考虑没有配方过时的目标?

.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 gnu-make

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

使用动态目标名称制作

我知道我可以使用$@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- 没有进行编译。

makefile gnu-make

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

Makefile:如何创建可用于子makefile的全局变量?

鉴于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>

variables makefile gnu-make

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

如何检查生成文件中目标的存在

我想根据当前目录中的默认 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 gnu-make

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

转义 makefile 变量(供内部 makefile 使用)

是否可以“安全地”扩展 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} 不这样做。

variables makefile gnu-make

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

从 GNUMakeFile 调用 Windows 批处理文件

我在一个文件夹中有一个 GNUMakeFile(具有该名称),还有一个run.bat写入标准输出的批处理文件。

如何从 GNUMakeFile 调用该批处理文件?

我试过了,@CALL run.bat但似乎不支持 CALL 命令。

cmd run.bat 只是将 cwgwin 终端置于一种“混合 DOS 状态”。

cygwin gnu-make

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

GNU Makefile“预处理器”?

是否有输出“预处理”makefile 的-E选项,相当于 GCC 的选项?

我有一个项目由几十个模块的层次结构组成,每个模块都有自己的 makefile。构建是从主生成文件调用的。该主 makefile 包含包含、变量定义、命令行选项因变量等。

所以,本质上,我正在寻找处理过的 makefile,包括所有替换。

preprocessor makefile gnu-make analyzer

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

标签 统计

gnu-make ×10

makefile ×8

variables ×2

analyzer ×1

cygwin ×1

preprocessor ×1