GNU允许1)并行执行,2)在同一调用中指定多个目标:
make -j4 clean all
但是,当GNU使目标并行化时,可能会出现一些竞赛条件。说明:
$ cat Makefile
clean:
@sleep 1 && rm -f foo
all: foo
@sleep 2 && cat foo
foo:
@echo '$@' > $@
$ make -j4 clean ; make -j4 all
foo
$ make -j4 clean all
cat: foo: No such file or dire
我正在寻找一种优雅的方式在GNU make中实现作业的并行化。这是我到目前为止所做的一个示例。Make以串行方式处理目录dir-1、dir-2和dir-3,这符合逻辑,但不是我的意图:
SUBDIRS=dir-1 dir-2 dir-3
default: all
all:
@for dir in $(SUBDIRS); do (cd $$dir; $(MAKE)); done
.PHONY: clean
clean:
@for dir in $(SUBDIRS); do (cd $$dir; $(MAKE) clean); done
有没有办法在不为每个目录指定特定目标的情况下
我这里有个问题,我想安装拖拉机。我在终端上写的
cd /home/hl/Documenten/qtractor-0.6.0
在那之后,我写了并输入了:
sh ./configure
这就是我得到的。
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross comp
最初,当我提出这个问题时,我把这个问题归咎于通配符,一个问题,但一个更大的问题显然正在逼近。如果我理解正确的错误,GNU make没有make子处理,所以必须切换到Boor make的导数。我可能理解错了,但我试着让这个问题更容易理解。
makefile : makefile试图多次执行自身的部分,我的意思是对进行子处理
all:
make clean
make $$(.??*)
#I want to replace below-like-things with a wildcard above
# make .lambda
# mak
这是我第一次使用GNU make来尝试做一些不那么基本的事情。我希望Makefile的默认目标查找多个匹配的文件名中的任何一个,这是我认为是根tex文件的命名方案,其表示方式如下:
#!/usr/bin/env bash
# this is just a sketch, I know this is inaccurate
# and simplified by make's standard...
# mainfiles := main letter report course
mainfiles=(main letter report course)
_readable(){
我试着在Makefile的末尾放一个很长的对象列表。我不能让这段代码工作。我可以在ASSIGN_LIST宏中看到$(LIST)被赋值,但是,对于stuff.txt,$(LIST)似乎是空的。我是Make的新手,所以也许我说得不对。(使用Red Hat Linux,GNU Make v3.81。) > cat makefile
define ASSIGN_LIST
LIST = $1
endef
stuff.txt: $(LIST)
echo $(LIST)
# MUCH MORE CODE HERE
# THIS CODE CONTAINING THE LIST IS A
刚开始的时候我很喜欢!我目前正在Ubuntu14.04下测试它。
我能够毫不费力地编译love 0.8.0,但是我在编译bitbucket的0.9.2时遇到了问题。看起来,我可能是
由于libturbojpeg,链接时出现了这个错误
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libturbojpeg.a(libturbojpeg_la-turbojpeg.o): relocation R_X86_64_32 against `.data' can not be used when m
当我执行这个GNU Makefile时:
foo: BUILD_DIR = foo_dir
bar: BUILD_DIR = bar_dir
BINARY = $(BUILD_DIR)/my_binary
.PHONY: foo
foo: $(BINARY)
.PHONY: bar
bar: $(BINARY)
$(BINARY):
@echo $(BINARY)
@echo $@
我得到:
$ make foo
foo_dir/my_binary # <= this is what I want
/my_binary # <= this is
我在这里慢慢失去理智了。首先,让我来描述一下我想做什么。我们有一个编译器,它释放出格式怪异的依赖文件。要将这些makefile转换成GNU可以理解的格式,它们需要首先由Perl脚本处理。从技术上讲,Perl脚本不会转换它所传递的输入依赖文件;相反,它会为每个输入依赖文件创建一个新的、格式正确的依赖文件。
现在,为了让GNU知道哪些翻译单元需要重新编译,哪些不需要编译,显然在尝试使翻译单元成为目标之前,它一定已经看到了这些依赖文件,所以我们的主makefile中有以下一行:
include $(PROCESSED_EXISTING_DEPENDENCY_FILES)
其中$(PROCESSED_