标签: gnu-make

makefile中有条件的变量?

显然 GNU Make 条件中没有布尔类型,所以这似乎是最好的解决方案:

$(DEF_TARGET):
    if [ "$(CHECK)" != "y" ]; then \
            var=foo; \
            $(if $(filter foo,$(var)),result=true,result=false); \
    fi
Run Code Online (Sandbox Code Playgroud)

问题是,无论是var=foo还是var=barresult永远都是false。替换$(var)foobar将产生正确的结果。

为什么这不起作用?有没有更好的解决问题的方法?

使用命令运行以下 makefile make -f make.txt

.PHONY: all
all:
     X=aaa; \
     Y=aaa; \
     if [[ '$(filter $(X),$(Y))' ]]; then echo "matched!"; else echo "not matched!"; fi
Run Code Online (Sandbox Code Playgroud)

输出:

X=aaa; \
Y=aaa; \
if [[ '' ]]; then echo "matched!"; else echo "not matched!"; fi
not matched! …
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

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

Mac 上的“生成依赖项”给出 -->“make: lsb_release: Command not found”错误

$ make dependencies 
Run Code Online (Sandbox Code Playgroud)

在我的 Mac 终端中给出

make: lsb_release: Command not found
Run Code Online (Sandbox Code Playgroud)

这是完整的消息:

make: lsb_release: Command not found
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
/bin/bash: md5sum: command not found
mldb/ext/tinyxml2//tinyxml2.mk:1: *** hash_command1 didnt set variable g++_-fPIC_-m64_-fno-omit-frame-pointer_-msse3_-msse4.2_-Imldb_-Wall_-Werror_-Wno-sign-compare_-Woverloaded-virtual_-Wno-deprecated-declarations_-Wno-deprecated_-Winit-self_-Wno-unused-but-set-variable_-Wno-psabi_-Wno-unknown-pragmas_-pipe_-ggdb_-std_c++0x_-D_GLIBCXX_USE_NANOSLEEP_1_-D_GLIBCXX_USE_SCHED_YIELD_1_-fno-builtin-malloc_-fno-builtin-calloc_-fno-builtin-realloc_-fno-builtin-free_-o_build/x86_64/obj/mldb/ext/tinyxml2/tinyxml2.cpp.lo_-c_./mldb/ext/tinyxml2/tinyxml2.cpp_-MP_-MMD_-MF_build/x86_64/obj/mldb/ext/tinyxml2/tinyxml2.cpp.d_-MQ_build/x86_64/obj/mldb/ext/tinyxml2/tinyxml2.cpp.lo_-O3_-DBOOST_DISABLE_ASSERTS_-DNDEBUG_hash.  Stop.
Run Code Online (Sandbox Code Playgroud)

我安装了 GNU Make 3.81。另外,我做了:

$ xcode-select -p
/Applications/Xcode.app/Contents/Developer


$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Run Code Online (Sandbox Code Playgroud)

我在 Mac OS X 上。它可以链接到 zsh,因为我不久前安装了它,我相信我所有与 xcode 相关的工具以前都运行得很好。

感谢您的任何帮助或指示,可以为我指明解决此问题的正确方向。

我尝试构建的更新c++ 代码适用于 ubuntu 14

macos terminal zsh makefile gnu-make

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

如何在makefile中转义括号?

如何在makefile信息中转义括号?看我的例子:

$(info "gcc found :)")
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

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

对 WinMain 的未定义引用失败

使用 GNU Make (v3.82.90) 构建应用程序时,我不断收到此链接器错误。我已经看过关于 SO 的其他答案,但答案仍然让我望而却步。

gcc -o build obj/teos_init.o obj/teos_event.o obj/teos_task.o obj/teos_sem.o obj
/teos_linkedlist.o obj/teos_log.o  -Iinc/pvt  -Iinc/pub -fmax-errors=3 -std=c11
c:/libs/mingw/bin/../lib/gcc/mingw32/4.9.3/../../../libmingw32.a(main.o):(.text.
startup+0xa7): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
makefile:14: recipe for target 'build' failed
make: *** [build] Error 1
Run Code Online (Sandbox Code Playgroud)

我的makefile就是这样...

INCDIR = inc/pvt inc/pub
SRCDIR = src
OBJDIR = obj
LIBDIR = lib

CC=gcc
CFLAGS := $(foreach d, $(INCDIR), -I$d) -fmax-errors=3 -std=c11

_SRC = teos_init.c teos_event.c teos_task.c teos_sem.c teos_linkedlist.c teos_log.c
_OBJ := $(subst $(SRCDIR),$(OBJDIR),$(_SRC:%.c=%.o)) …
Run Code Online (Sandbox Code Playgroud)

c linker-errors gnu-make winmain

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

如何声明一个只计算一次的延迟变量?

我有一个需要很长时间才能完成的 shell 程序。正如所写,执行make build需要 4 x 2 秒才能完成,因为它$(value)是为每个文件计算的。

一个解决方案是使用而不是声明value一个deferred变量。:==

不幸的是,这不是一个解决方案,因为它会减慢make clean任何其他目标的执行速度2 秒,因为value它没有计算。

value = $(shell sleep 2 && echo 42)

in = a b c d
out = $(addsuffix .out,$(in))

build: $(out)

%.out: %
    echo $(value) > $< || [ rm $@ -a true ]

init:
    touch $(in)

clean:
    rm -vf $(out)
Run Code Online (Sandbox Code Playgroud)

如何设置仅在使用时分配但仅计算一次的变量?

换句话说,我想build花 2 秒钟来完成并clean立即完成。

我对涉及条件的解决方案不感兴趣,以便绕过valueif the target is …

makefile gnu-make

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

如何从文件中读取目标名称,向它们附加一些字符串,并从中创建规则?

我想要一个文件,当我可以列出名称(一行中的一个)时,这样当调用 make 时,就会根据这个名称动态生成规则,并附加一些字符串。

例子:

文件内容:

target1
target2
target3
Run Code Online (Sandbox Code Playgroud)

要连接的字符串:my_task_

由此我想有 3 条规则:

my_task_target1:
    <some things to do>

my_task_target2:
    <some things to do>

my_task_target3:
    <some things to do>
Run Code Online (Sandbox Code Playgroud)

我知道,当我拥有包含所有这些目标名称的数组时,我可以在这个答案中这样做,但我需要从文件中读取数据。

我希望它是这样的,因为我将有很多目标,并且每个目标都有不同的任务列表。每个任务都有自己的文件,其中包含目标列表。最后,我还将创建名称在目标之后的规则,但没有前缀,并且此规则将包含分配给某个目标的所有任务,以便我可以调用单独的任务,以及目标所需的所有任务,只需一个 make命令。

我怎样才能做到这一点?或者也许有更好的方法来做我想做的事?

bash shell makefile gnu-make

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

在传递给 docker run 命令的变量中转义 $

从 makefile 执行命令时,我不知道如何转义美元符号以访问在 docker 环境中定义的变量。

这是我的设置的最小表示,我正在尝试回应 /mypath

define create-test
so-test-$1:
    docker run \
        --rm \
        -t \
        --env SRC="/mypath" \
        ubuntu:xenial \
        /bin/bash -c "$2"
endef


$(eval $(call create-test,1,echo $SRC ))
$(eval $(call create-test,2,echo $$SRC ))
$(eval $(call create-test,3,echo $$$$SRC ))
$(eval $(call create-test,4,echo $$$$$$$$SRC ))
Run Code Online (Sandbox Code Playgroud)

输出是

$ make so-test-1
docker run --rm -t --env SRC="/mypath" ubuntu:xenial /bin/bash -c "echo RC "
RC
$ make so-test-2
docker run --rm -t --env SRC="/mypath" ubuntu:xenial /bin/bash -c "echo RC "
RC
$ …
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make variable-expansion docker

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

Makefile:为什么总是使用 `$(MAKE)` 而不是 `make`?

我通常使用高级构建系统cmake来构建我的 C/C++ 代码。但出于各种原因,我使用的是直接的 GNU make

我正在做递归构建,其中每个目录都有一个 makefile。

我最近不得不将我所有的 makefile 从 using 更改make$(MAKE),然后并行构建开始工作。

我读过的文献都说“总是使用$(MAKE)”(O'Reilly 的书,stackoverflow.com 上超过 10-40K 点的人提供了 5 个以上的解决方案)。

在你的 makefile 中,为什么总是使用$(MAKE)而不是make

(显然一个原因是因为$(MAKE)以某种方式启用了并行构建。)

除了简单的替换$(MAKE)with之外,还有更多的事情发生make吗?

makefile gnu-make parallel-builds

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

Makefile在子文件夹中找不到文件

我正在尝试用 C 为我的项目编写 Makefile。
我的.c文件在src
.o文件build夹中,子文件夹中的
.h文件,src/header子文件夹中的文件
和子文件夹.c中的测试tests文件。

在我的 Makefile 中,我使用的是 vpath:

 vpath %.c src:tests
 vpath %.h src/header
 vpath %.o build
Run Code Online (Sandbox Code Playgroud)

当我想编译时file1,Makefilefile1.c在子文件夹中查找并将目标文件编译到子文件夹中没有问题build/file1.o。但是当它把file1编译成可执行文件时,Makefile找不到file1.o

这是我在 Makefile 中针对特定文件的代码:

test_file1: test_file1.o file.o
    $(CC) $^ -o tests/$@

test_file1.o: test_file1.c file1.h  
    $(CC) $(CFLAGS) -c $< -o build/$@

file1.o: file1.c file1.h file2.h file3.h
    $(CC) $(CFLAGS) -c $< -o build/$@
Run Code Online (Sandbox Code Playgroud)

test_file1.o我得到:
gcc -std=c99 -Wall -Wextra …

c gcc makefile gnu-make

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

为什么使用制表符缩进 if-else 会破坏 Makefile?

这是一个Makefile:

.PHONY: all

ifeq ($(OS),Windows_NT)
    DETECTED_OS := Windows

else
    DETECTED_OS := $(shell uname -s)

endif

$(info DETECTED_OS is set to '$(DETECTED_OS)')
Run Code Online (Sandbox Code Playgroud)

当用制表符缩进时,它会打印

DETECTED_OS is set to ''

但是当缩进 0 个或多个空格时,它会打印

DETECTED_OS is set to 'Linux'

但是如果你删除第一行,.PHONY: all它会打印

DETECTED_OS is set to 'Linux'

无论是制表符还是空格。

所以第一个版本被破坏了,因为它DETECTED_OS没有设置。这是为什么?

我的版本:

GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change …
Run Code Online (Sandbox Code Playgroud)

linux makefile gnu-make

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