如果您运行make test以下 Makefile(带有空目录):
test.%:
@echo $*
test: test.dummyextension
Run Code Online (Sandbox Code Playgroud)
你会得到以下输出:
dummyextension
o
cc test.o test.dummyextension -o test
clang: error: no such file or directory: 'test.o'
clang: error: no such file or directory: 'test.dummyextension'
clang: error: no input files
make: *** [test] Error 1
Run Code Online (Sandbox Code Playgroud)
为什么?
我怀疑它与隐式规则有关,但我make -p在我的机器上搜索,找不到任何匹配的隐式规则%: %。我希望输出只是dummyextension,但这几乎就像test.o我的目录中有一个虚拟文件(尽管我检查了十次,但没有)。
;如果您在先决条件之后添加test.dummyextension,或向test规则添加任何内容,则一切都会按预期进行。这是我能想到的最小的失败示例,我不知道为什么你会看到这种行为。有任何想法吗?
我以为我知道它make VERBOSE=1是什么以及它的作用。
我可以看到https://www.gnu.org/software/make/manual/make.html中明显缺少它。
GNU Make 命令行变量定义VERBOSE=1记录在哪里?
使用GNU makefile内容:
SVNVERSION_NUMBER := $(shell svnversion --version | perl -lne 'print $1 if /version (\d+.\d+.\d+)/')
$(error $(SVNVERSION_NUMBER))
Run Code Online (Sandbox Code Playgroud)
我得到的结果是:
Makefile:3: *** svnversion, version 1.6.2 (r37639). Stop.
Run Code Online (Sandbox Code Playgroud)
但是,如果我键入shell:
svnversion --version | perl -lne 'print $1 if /version (\d+.\d+.\d+)/'
Run Code Online (Sandbox Code Playgroud)
我得到了结果:
1.6.2
Run Code Online (Sandbox Code Playgroud)
显然,我的shell语法没有按照我的想法进行,但我不明白为什么.
谢谢.
在GNU make中,附加到变量赋值的尾随注释会阻止后续比较(via ifeq)正常工作.
这是Makefile ......
A = a
B = b ## trailing comment
C = c
RESULT :=
ifeq "$(A)" "a"
RESULT += a
endif
ifeq "$(B)" "b"
RESULT += b
endif
ifeq "$(C)" "c"
RESULT += c
endif
rule:
@echo RESULT=\"$(RESULT)\"
@echo A=\"$(A)\"
@echo B=\"$(B)\"
@echo C=\"$(C)\"
Run Code Online (Sandbox Code Playgroud)
这是输出......
$ make
RESULT=" a c"
A="a"
B="b "
C="c"
Run Code Online (Sandbox Code Playgroud)
正如您从显示的值中看到的那样RESULT,ifeq受到分配中存在的注释的影响B.回应变量B,表明问题不是评论,而是介入空间.
显而易见的解决方案是在比较之前明确剥离空白,如此...
ifeq "$(strip $(B))" "b"
RESULT += …Run Code Online (Sandbox Code Playgroud) 在BASH提示符下,我可以执行以下操作:
~/repo$ HISTORY_LOG=$(git log $(get_old_version)..$(get_new_version)); [[ ! -z ${HISTOR_LOG} ]] && ( echo "Some header"; echo "${HISTORY_LOG}" )
Run Code Online (Sandbox Code Playgroud)
git log我实际拥有的显示简化版本在哪里.
在make文件中,我将以下命令作为目标的一部分:
$(OUTPUT): $(INPUT)
...
echo "Some header" > $(LOG_FILE)
git log $(shell get_old_version)..$(shell get_new_version) >> $(LOG_FILE)
Run Code Online (Sandbox Code Playgroud)
如何重写make目标以使其像bash命令一样?
如果我这样做,则会删除以下换行符:
$(OUTPUT): $(INPUT)
...
HISTORY_LOG="$(shell git log $(shell get_old_version)..$(shell get_new_version))" ; \
[ -z "$${HISTORY_LOG}" ] && \
true || \
(echo "Some header" ; echo "$${HISTORY_LOG}" )
Run Code Online (Sandbox Code Playgroud)
运行时看起来像:
~/repo $ make
commit 2b4d87b0e64d129028c1a7a0b46ccde2f42c5e93 Author: Jamie <Jamie@mymail.com> Date: Mon Jun 25 18:46:27 …Run Code Online (Sandbox Code Playgroud) 我写了这个问候世界hello.c:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
exit( 0 );
}
Run Code Online (Sandbox Code Playgroud)
我Makefile是:
%: %.c
Run Code Online (Sandbox Code Playgroud)
当我运行时,make我会收到此错误:make: *** No targets. Stop.
我正在尝试在运行特定目标时要求在Makefile中设置环境变量.我正在使用该问题的答案中的技术,您可以在其中设置另一个目标,以确保设置环境变量.
我看起来像这样:
require-%:
@ if [ "${${*}}" = "" ]; then \
$(error You must pass the $* environment variable); \
fi
Run Code Online (Sandbox Code Playgroud)
使用该目标设置,这是预期的:
$ make require-FOO
Makefile:3: *** You must pass the FOO environment variable. Stop.
Run Code Online (Sandbox Code Playgroud)
但是,在测试时,我永远不会得到它没有错误:
$ make require-FOO FOO=something
Makefile:3: *** You must pass the FOO environment variable. Stop.
$ make require-FOO FOO=true
Makefile:3: *** You must pass the FOO environment variable. Stop.
$ make require-FOO FOO='a string'
Makefile:3: *** You must pass the FOO environment …Run Code Online (Sandbox Code Playgroud) 我想测量make文件中每个构建项目的时间,我只是在下面尝试,为什么它不起作用?
mytest:
$(info 'Now time is $(date --iso=seconds)')
日期不打印,只打印
'Now time is '.有什么不对?
make --version
GNU Make 3.81
这是一项家庭作业.我有一个makefile,默认使用编译可执行文件
gcc -o myprogram myprogram.c
在分配,我们应该使3个额外的使情况:"这个makefile还有应该支持使用这些3例插入10秒的休眠到程序的3个不同的预定部位make test1,make test2,make test3.
我知道如何使用make从默认情况下有这样的额外情况,但我的问题是在编译可执行文件之前可以使用makefile将代码插入myprogram.c吗?或者我是否必须创建myprogram1.c myprogram2.c等,然后将其用于案例?
谢谢!
当有明确的定义时,请抱怨目标'build/libc/string/strlen.c'没有规则.奇怪的是,它成功地为'build/libc/libc.a'编译了除了一个依赖项之外的所有依赖项.我曾经或者至少试图禁用内置隐式规则和变量,以避免花费数小时调试同时拔出头发,但它似乎没有帮助,因为我完全迷失了.
Makefile文件:
.SUFFIXES:
MAKEFLAGS += -rR
STD = gnu11
CFLAGS = -O2 -g -ffreestanding -fbuiltin -Wall -Wno-div-by-zero -D__is_vos_kernel__ -Iinclude
LFLAGS = -O2 -g -ffreestanding -fbuiltin -Wall -Wextra
LIBC_FLAGS = -O2 -g -D__is_vos_libc__ -Iinclude
LIBK_FLAGS = -O2 -g -ffreestanding -fbuiltin -D__is_vos_libc__ -Iinclude -D__is_vos_kernel__
CC = i386-elf-gcc
LD = i386-elf-ld
AR = i386-elf-ar
AS = /usr/local/bin/nasm
SYSROOT = sysroot
BUILDDIR = builddir
SYSARG = --sysroot=sysroot -isystem=/usr/include
LIBC_OBJECTS = $(wildcard libc/*.c)
LIBC_HEADERS = $(wildcard libc/*.h)
LLIBC_HEADERS = $(wildcard sysroot/usr/include/*.h)
header:=$(shell find libc -type …Run Code Online (Sandbox Code Playgroud)