我只知道非常基本的makefile语法,并且正在阅读另一个项目makefile并且遇到:=了宏声明.他们为什么要用它?
换句话说,两者之间是否有任何区别
MYMACRO = hi i'm a macro
Run Code Online (Sandbox Code Playgroud)
和
MYMACRO := hi i'm a macro
Run Code Online (Sandbox Code Playgroud)
?
自从我了解了-j后,我就轻松地使用了-j8.前几天我正在编译一个地图集安装,但是make失败了.最终我将其追踪到了无序的事情 - 一旦我回到单线程制作,它就能正常工作.这让我很紧张.在编写自己的make文件时,我需要注意哪些条件,以避免使用make -j做出意外的事情?
我正在编写一个包含大量重复内容的Makefile,例如
debug_ifort_Linux:
if [ $(UNAME) = Linux ]; then \
$(MAKE) FC=ifort FFLAGS=$(difort) PETSC_FFLAGS="..." \
TARGET=$@ LEXT="ifort_$(UNAME)" -e syst; \
else \
echo $(err_arch); \
exit 1; \
fi
Run Code Online (Sandbox Code Playgroud)
在定义目标'syst'的地方,定义了变量'UNAME'(通常是Linux,但也可能是Cygwin或OSF1),并且还定义了变量'difort'和'err_arch'.这段代码对于不同的编译器目标使用了很多次(使用名称约定'").由于这是一个庞大的冗余代码,我希望能够以更简单的方式编写它.例如,我想做这样的事情:
debug_ifort_Linux:
compile(uname,compiler,flags,petsc_flags,target,lext)
Run Code Online (Sandbox Code Playgroud)
其中compile可以是一个基于参数执行上述代码的函数.有谁知道我怎么能做到这一点?
如何压缩以下Makefile目标?
$(GRAPHDIR)/Complex.png: $(GRAPHDIR)/Complex.dot
dot $(GRAPHDIR)/Complex.dot -Tpng -o $(GRAPHDIR)/Complex.png
$(GRAPHDIR)/Simple.png: $(GRAPHDIR)/Simple.dot
dot $(GRAPHDIR)/Simple.dot -Tpng -o $(GRAPHDIR)/Simple.png
$(GRAPHDIR)/IFileReader.png: $(GRAPHDIR)/IFileReader.dot
dot $(GRAPHDIR)/IFileReader.dot -Tpng -o $(GRAPHDIR)/IFileReader.png
$(GRAPHDIR)/McCabe-linear.png: $(GRAPHDIR)/McCabe-linear.dot
dot $(GRAPHDIR)/McCabe-linear.dot -Tpng -o $(GRAPHDIR)/McCabe-linear.png
graphs: $(GRAPHDIR)/Complex.png $(GRAPHDIR)/Simple.png $(GRAPHDIR)/IFileReader.png $(GRAPHDIR)/McCabe-linear.png
Run Code Online (Sandbox Code Playgroud)
-
用GNU Make 3.81.
通常内核源存储在/usr/src/linux-2.6.x/.如果我修改模块的源代码,为了避免重新编译整个内核,我该如何重新编译该模块?
如何获取GNU的调用目标make Makefile?
例如,我make使用以下命令行调用:
make a-target
Run Code Online (Sandbox Code Playgroud)
如何在Makefile中获取调用目标"a-target"并将其分配给变量?
此外,如果在命令行上指定了多个目标:
make target1 target2 ...
Run Code Online (Sandbox Code Playgroud)
我如何获得所有这些?
我知道@前缀会抑制Makefile中shell命令的输出,并且-前缀将忽略shell命令中的错误.有没有办法将两者结合起来,即一个抑制输出的前缀并忽略错误?我不认为@-或-@有效.
我有一个目录(root_dir),其中包含许多子目录(subdir1, subdir2, ...).
我想make在每个目录中运行root_dir,使用放置在其中的Makefile.(显然假设每个subdir...内部都有自己的Makefile).
所以基本上有两个问题:
我知道为了在特定目录中运行make,我应该注意以下事项:
$(MAKE) -C subdir
Run Code Online (Sandbox Code Playgroud) gnu-make ×10
makefile ×8
gnu ×2
linux ×2
autotools ×1
bash ×1
build ×1
colon-equals ×1
function ×1
linux-kernel ×1