标签: gnu-make

用武力制定隐性规则 vs .phony

有人可以阐明这里的区别吗:

$(tsdir)/proj具有先决条件$(tsdir)/proja$(tsdir)/projb. 我希望每次构建时都调用proja's 和's makefile 。如果或已过时且已更新,则它们的 makefile 将分别触及和。如果这些文件比 更新,则重建 proj。projbprojprojaprojb$(tsdir)/proja$(tsdir)/projb$(tsdir)/proj

我通过使用下面的代码和FORCE目标来完成此工作。如果我尝试切换到使用.PHONY目标,这是行不通的。我更喜欢.PHONY,因为这被认为是更“正确”的做法。但它不起作用,我不知道为什么。proja's 和projb's makefile 不使用.PHONY目标调用,而是proj重建。

我正在使用 GNU make 3.81。

谢谢纳楚姆

$(tsdir)/proj: $(tsdir)/proja $(tsdir)/projb
...

$(tsdir)/%: FORCE  
    make -C $(prereqdir)/$*

FORCE:

#or

$(tsdir)/proj: $(tsdir)/proja $(tsdir)/projb
...

.PHONY: $(addprefix $(tsdir)/, $(projects))

$(tsdir)/%:  
    make -C $(prereqdir)/$*
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

3
推荐指数
1
解决办法
2641
查看次数

Qt 和 MOC 的困境与简单的制作

我想这更像是一个 GNU Make 问题,而不是 Qt 和 moc,但这里是。

我有一个包含多个的目录Q_OBJECTS,并且我有一些简单的代码,它收集所有这些,例如

MOCS := $(shell grep -l Q_OBJECT $(HEADERS))
Run Code Online (Sandbox Code Playgroud)

假设HEADERS是“当前位置”中头文件的集合

现在我想做的是指定一个规则,该规则将调用 Qt moc 来构建 .C 文件,然后将其编译为对象。如何指定这样的规则?

我的出发点很愚蠢:

MOC_SOURCES := $(MOCS:%.h=%.C)
MOC_OBJECTS := $(MOC_SOURCES:%.C=%.o)

$(MOC_SOURCES) : $(MOCS)
  @echo "Building Moc: $@ from $<"
  $(MOC) $< -o $@
Run Code Online (Sandbox Code Playgroud)

这是愚蠢的,因为发生的是$<第一个标头,因此所有对象都是使用此标头而不是相关标头来编译的。

有没有办法清理这个问题,以便从正确的标头构建正确的 moc 对象?

qt makefile gnu-make

3
推荐指数
1
解决办法
1867
查看次数

makefile 配方中的 Foreach 模板

给出以下 Makefile 片段:

TOOLS=foo bar

define TOOL_install
install -c $(1) $$(prefix)/bin/$(1)
endef

.PHONY: install
install: all
        $(foreach tool,$(TOOLS),$(eval $(call TOOL_install,$(tool))))
Run Code Online (Sandbox Code Playgroud)

为什么make install打印“对‘安装’无需执行任何操作。” 而不是执行 foreach 指定的命令?(foreach 之前有一个选项卡,我尝试在 TOOL_install 定义中放置一个选项卡;但没有帮助。)

根据make -p安装目标没有命令,这显然不符合预期。

在同一个 makefile 的其他地方,我成功地使用相同的技术来创建整个规则,包括命令配方;我怎样才能在现有规则内实现这项工作?

(如果我替换eval为,info那么它会打印我期望它运行的命令。)

在这个简单的情况下,我可以通过内联命令让它工作:

install: all
        @$(foreach tool,$(TOOLS),install -c $(tool) $(prefix)/bin/$(tool) ; )
Run Code Online (Sandbox Code Playgroud)

但我想知道如何让第一个表单按预期工作,以防我将来需要更复杂的东西。

linux foreach makefile gnu-make

3
推荐指数
2
解决办法
2万
查看次数

GNU Make 规则仅在目标存在时执行?

在相当复杂的 Makefile 中,我偶尔会希望仅在目标确实存在时才调用某些规则。例如,我可能创建了一个本地目录并用于losetup将文件挂载到其中。我想在处理挂载点和目录时将其保持打开状态,但在某些操作之前自动关闭它们。

当需要打包时,我想要sync安装文件,umount然后对底层文件执行一些操作。是否有办法反转规则的含义,以便仅在存在特定目标时才执行规则

makefile gnu-make mount-point

3
推荐指数
1
解决办法
1290
查看次数

makefile: ifeq - what's wrong?

I am looking now for a full hour for the problem... Why is it not IS 0?

I am not a big make guru.

JAVAC := $(shell javac -version 2> /dev/null; echo $$?) 

all:
    @echo $(JAVAC)
ifeq ($(JAVAC), 0)
    @echo "IS 0"
else
    @echo "NOT 0"
endif
Run Code Online (Sandbox Code Playgroud)

Output:

#> make
0
NOT 0
Run Code Online (Sandbox Code Playgroud)

I'm using GNU Make 4.0.

makefile gnu-make

3
推荐指数
1
解决办法
2073
查看次数

如何在Makefile中输入父目录?

我有以下内容Makefile(GNU Make 3.81):

CWD:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))

all:
        pwd
        cd "$(CWD)/.."
        pwd
        cd ".."
        pwd
Run Code Online (Sandbox Code Playgroud)

这是输出:

$ make
pwd
/Users/kenorb/temp/foo
cd "/Users/kenorb/temp/foo/.."
pwd
/Users/kenorb/temp/foo
cd ".."
pwd
/Users/kenorb/temp/foo
Run Code Online (Sandbox Code Playgroud)

看来cd“通过 到父目录”..没有任何效果。

如何将当前工作目录更改为相对于Makefile文件的父目录?

shell makefile gnu-make

3
推荐指数
1
解决办法
4041
查看次数

将命令行参数传递给从 Makefile 调用的 python 脚本

我刚刚开始使用 GNU 的 make 命令来自动化操作。我遇到了问题,需要一些帮助。我有一个 python 脚本(abc.py),它接受带有短符号(“-t”)和长符号(“--type”)的命令行参数,并且可以运行为:

python abc.py --type "blah"
Run Code Online (Sandbox Code Playgroud)

但是,我希望从 Makefile 运行此脚本(abc.py)。所以,现在我的 Makefile 如下所示:

command:
    python abc.py
Run Code Online (Sandbox Code Playgroud)

我现在可以执行代码make command,但如何接受用户输入并将其传递给 abc.py?希望这个问题是正确的。

python makefile gnu-make command-line-arguments

3
推荐指数
1
解决办法
4394
查看次数

如何在 Linux makefile 中初始化然后迭代数组?

我需要创建一个包含目录的数组,然后对其进行 inerate,在每个步骤中再创建一个数组,其中将包括通过每个 derictory 的“find”命令找到的所有文件,并迭代该数组。我试图做这样的事情:

declare -a arr=(a b c) ;\
for key in "$${arr[@]}" ; do \
    ...
  done\
Run Code Online (Sandbox Code Playgroud)

但它不起作用。即使这样也会出错:

all:
        declare -a array=(a b c) ;\
        echo "$${array[1]}" \
Run Code Online (Sandbox Code Playgroud)

得到错误:

/bin/sh: 1: Syntax error: "(" unexpected
Makefile:4: recipe for target 'gg' failed
make: *** [gg] Error 2
Run Code Online (Sandbox Code Playgroud)

unix linux makefile gnu-make

3
推荐指数
1
解决办法
2880
查看次数

GNU makefile 中的 $(shell) 函数导致“对函数 shell 的未终止调用:丢失)”

描述:

我的 GNU 生成文件中有以下代码段:

test:=$(shell grep '#pragma' test_types.h)
$(info test:$(test))
Run Code Online (Sandbox Code Playgroud)

以上导致以下错误消息:

*** 对函数 'shell' 的未终止调用:缺少 ')'。停止

但是,如果我从上面的代码段中删除“#”

test:=$(shell grep 'pragma' test_types.h)
$(info test:$(test))
Run Code Online (Sandbox Code Playgroud)

输出是:

测试:#pragma pack(push, 1) #pragma pack(pop)

如果我直接运行在命令行中执行以下操作:grep '#pragma' test_types.h。输出再次是:

#pragma pack(push, 1) #pragma pack(pop)

题:

将 grep 与#GNU makefile 中的搜索结合使用时,导致 shell 函数行为的原因是什么?

grep gnu-make

3
推荐指数
1
解决办法
1234
查看次数

将 Powershell 核心设置为 Windows/Linux 上的默认 GNU Make shell

在 Windows 上的 makefile 中。

使用以下 make 版本:

PS C:\projects> make --version
GNU Make 4.1
Built for i686-w64-mingw32
Copyright (C) 1988-2014 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)

我试图在没有明确指定 shell 的情况下设置SHELL := pwsh/COMSPEC := pwsh和运行命令:

# COMSPEC := pwsh -c
SHELL := pwsh -c

VAR=asdf/asdf

.PHONY: get_var

get_var:
    @Write-Output $(VAR)
Run Code Online (Sandbox Code Playgroud)

没有成功。我有一个错误:

PS C:\projects\makefile_factory> make -f .\fi.makefile get_var
process_begin: CreateProcess(NULL, Write-Output asdf/asdf, ...) failed.
make (e=2): ?? ??????  ????? ????????? ????.
.\fi.makefile:10: recipe for target 'get_var' failed
make: *** [get_var] …
Run Code Online (Sandbox Code Playgroud)

powershell makefile gnu-make

3
推荐指数
1
解决办法
1245
查看次数