标签: gnu-make

为什么 GNU Make 会尝试为没有配方的规则编译一个不存在的目标文件?

如果您运行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规则添加任何内容,则一切都会按预期进行。这是我能想到的最小的失败示例,我不知道为什么你会看到这种行为。有任何想法吗?

linux makefile gnu-make

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

制作 VERBOSE=1 文档吗?

我以为我知道它make VERBOSE=1是什么以及它的作用。

我可以看到https://www.gnu.org/software/make/manual/make.html中明显缺少它。

GNU Make 命令行变量定义VERBOSE=1记录在哪里?

makefile gnu-make

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

为什么makefile shell的结果与shell中的结果不一样?

使用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语法没有按照我的想法进行,但我不明白为什么.

谢谢.

shell makefile gnu-make

0
推荐指数
1
解决办法
520
查看次数

变量赋值后的尾随注释颠覆比较

在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)

comments makefile gnu-make

0
推荐指数
1
解决办法
359
查看次数

如何将命令输出分配给GNU make target规则中的变量?

在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)

sh gnu-make

0
推荐指数
1
解决办法
1688
查看次数

为什么我的makefile中的自动变量找不到任何目标?

我写了这个问候世界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 gnu-make

0
推荐指数
1
解决办法
198
查看次数

需要在Makefile目标中设置环境变量

我正在尝试在运行特定目标时要求在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)

makefile environment-variables gnu-make

0
推荐指数
1
解决办法
852
查看次数

在makefile中打印时间戳

我想测量make文件中每个构建项目的时间,我只是在下面尝试,为什么它不起作用?

mytest:
    $(info 'Now time is $(date --iso=seconds)')

日期不打印,只打印

'Now time is '
.有什么不对?

make --version GNU Make 3.81

makefile gnu-make

0
推荐指数
1
解决办法
4790
查看次数

makefile可以用来插入代码吗?

这是一项家庭作业.我有一个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等,然后将其用于案例?

谢谢!

c makefile gnu-make

0
推荐指数
1
解决办法
71
查看次数

Makefile没有针对目标的规则

当有明确的定义时,请抱怨目标'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)

c makefile gnu-make

0
推荐指数
1
解决办法
175
查看次数

标签 统计

gnu-make ×10

makefile ×9

c ×2

comments ×1

environment-variables ×1

linux ×1

sh ×1

shell ×1