在一个Makefile中,我看到了这个:
all: .made
# ... some other code
.made: $(Program) bashbug
@echo "$(Program) last made for a $(Machine) running $(OS)" >.made
.made规则是per:的后缀规则吗?
另外,是否所有规则的前后缀都有.的目标呢?
否则,目标最初的意义是什么?在中,这似乎是有意义的
默认情况下,make以第一个目标(而不是名称以‘.’开头的目标)开始。
但它的意义并没有被提及。
另外,如果它是一个后缀规则,为
我不完全理解如何使用特定于目标的变量作为目标本身,拥有自己的依赖性和菜谱。
示例Makefile,它可以工作,但不使用特定于目标的变量:
VAR=progName
ATARGET: $(VAR)
@echo Do actions for $@ based on the completed target $(VAR)
$(VAR):
@echo Do actions on $@
制造ATARGET
在progName上执行操作
基于已完成的目标progName执行ATARGET操作
Makefile,它无法尝试使用特定于目标的变量(请注意在执行make时缺少“在progN
我的Makefile中有用于.c和.o文件的(旧后缀类型)规则。问题是,当我运行make all时,不使用这些规则,而是使用隐式规则。
如果我运行make all -r,它将告诉我make: *** No rule to make target...,这是预期的,因为我故意没有为Program1.3添加明确的规则。
为了解决这个问题,我可以为程序1.3添加明确的规则:
program1: program1.o
所以解决办法不是我想要的。只是一个解释。
all: program1 program2 program3
.o:
@echo What is going on 1
$(C
我正在尝试让世界变得最简单(相对通用)的Makefile。我可以用来驱动一小系列的测试来学习C。由于某些原因,Makefile拒绝理解我的隐含规则,将目标文件从c: %.o: %.c中生成,我得到了test1.exe所需要的no rule to make target %.o。下面是我的完整Makefile:
INC = sglib
CC = gcc
LD = gcc
LDFLAGS =
# On MS-Windows, say "make os=win" to set proper extensions
os =
SO =
EXE =
解释了隐式目标:
有些操作几乎无处不在:例如,您可能有一个.c文件的集合,您可能希望对这些文件执行相同的命令。理想情况下,文件名将是目标;使用隐式目标" .c“,您可以指定一个命令来执行与.c文件名相对应的任何目标(减去.c扩展名)。
然而,当我尝试它时,隐式目标就被忽略了。我的测试makefile如下:
Default: Foo.bar
echo "In default."
.bar:
echo "In .bar."
make: *** No rule to make target `Foo.bar', neede
考虑以下makefile (和任何hi.c):
.PHONY: analyze-%
hi: hi.c
gcc -o $@ $<
%.json: %
touch $@ # actually created by analysis-tool
analyze-%: %.json # why does this not work?
正如我在makefile中的评论所指出的那样,隐式规则不起作用:
$ make analyze-hi
make: *** No rule to make target 'analyze-hi'. Stop.
只有在将其转换为静
我有一个Makefile来编译一些C源文件,并将输出放在不同的构建目录中,它看起来有点像下面的makefile:
OBJDIR=/home/test/alpha
SRCDIR=/home/test/beta
# make variable will be exanded when used (and not at declaration)
OBJECTS:= $(addprefix $(OBJDIR), $(notdir $(patsubst %.c,%.o,$(wildcard $(SRCDIR)/*.c))))
SOURCES:=$(wildcard $(SRCDIR)/*.c)
我有一个复杂的遗留Makefile,我需要在Docker容器中运行它。本质上,我需要Makefile再次调用自己,除非我需要在前面加上"docker run ...“。
最终用户可能会创建多个目标,也可能会指定多个命令行变量和选项,因此我需要复制整个命令行调用来进行make,而不仅仅是调用每个目标。
我期待的是这样的形式:
<BLACK_MAGIC>:
docker run my_image make <COMPLETE_ORIGINAL_MAKE_COMMAND_LINE>
有什么建议吗?
谢谢!
我在这里慢慢失去理智了。首先,让我来描述一下我想做什么。我们有一个编译器,它释放出格式怪异的依赖文件。要将这些makefile转换成GNU可以理解的格式,它们需要首先由Perl脚本处理。从技术上讲,Perl脚本不会转换它所传递的输入依赖文件;相反,它会为每个输入依赖文件创建一个新的、格式正确的依赖文件。
现在,为了让GNU知道哪些翻译单元需要重新编译,哪些不需要编译,显然在尝试使翻译单元成为目标之前,它一定已经看到了这些依赖文件,所以我们的主makefile中有以下一行:
include $(PROCESSED_EXISTING_DEPENDENCY_FILES)
其中$(PROCESSED_