显然 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=bar,result永远都是false。替换$(var)为foo或bar将产生正确的结果。
为什么这不起作用?有没有更好的解决问题的方法?
使用命令运行以下 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) $ 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
使用 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) 我有一个需要很长时间才能完成的 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 …
我想要一个文件,当我可以列出名称(一行中的一个)时,这样当调用 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命令。
我怎样才能做到这一点?或者也许有更好的方法来做我想做的事?
从 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) 我通常使用高级构建系统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吗?
我正在尝试用 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 …
这是一个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)