Tag: gnu make

通配符目标在一个Makefile中

我怎样才能压缩下面的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 – 使用GNU Make 3.81 。

从make文件中禁用make内build规则和variables

我想要从make文件中通过-r和-R选项到GNU make来禁用内置规则和variables。 其他解决scheme,让我这样做隐式和透明地也是受欢迎的。 我发现使用MAKEFLAGS 几个参考 ,并有类似的问题。

如何强制gnumake文件中的错误

我想在我的生成文件中检测到一个工具是错误版本的情况,并强制make失败,并显示错误消息,指出该项目不是正确的版本。 任何人都可以举个例子吗? 我尝试了以下,但它不是正确的语法: ifeq "$(shell svnversion –version | sed s/[^0-9\.]*://)" "1.4" $error("Bad svnversion v1.4, please install v1.6") endif 谢谢。

为什么使用像Autotools这样的构build工具,我们可以编写自己的makefile?

最近,我把我的开发环境从Windows切换到了Linux。 到目前为止,我只用Visual Studio进行C ++开发,所以很多概念,比如make和Autotools ,对我来说都是新的。 我已经阅读了GNU makefile文档,并得到了几乎一个想法。 但是我对Autotools感到困惑。 据我所知,makefile用于使构build过程更容易。 为什么我们需要像Autotools这样的工具来创buildmakefile? 由于所有人都知道如何创build一个makefile,所以我没有真正使用Autotools。 标准是什么? 我们是否需要使用这样的工具,或只是手写的makefiles呢?

GNU make的-j选项

自从我了解到-j我已经很快地使用了-j8。 有一天,我正在编译一个地图集安装和制作失败。 最终,我把它追踪到了无序的事情上 – 而且一旦我回到单线程构造中,它就运行良好。 这让我紧张。 在编写我自己的make文件时,我需要注意什么样的条件,以避免使用make -j做一些意想不到的事情?

在Makefile中的函数

我正在写一个有很多重复的东西的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 在定义了目标'syst'的地方,定义了variables'UNAME'(通常是Linux,但也可能是Cygwin或OSF1),variables'difort'和'err_arch'也被定义。 这段代码被用于很多次,用于不同的编译目标(使用名称约定“ “)。 由于这是大量的冗余代码,我希望能够以更简单的方式编写它。 例如,我想要做这样的事情: debug_ifort_Linux: compile(uname,compiler,flags,petsc_flags,target,lext) 其中compile可以是一个基于参数执行上面的代码的函数。 有没有人有任何想法我可以做到这一点?

在执行之前进行cmake打印命令

我正在开发一个用cmake在linux上构build的大型C ++项目。 Cmake运行正常,在模块和应用程序树中生成了一大堆Makefiles。 运行gnu会导致链接器错误。 在运行之前,怎样才能打印出确切的命令? -d选项不会打印命令,但大量信息没有帮助。 -n选项打印所有的命令,但不运行它们,所以我不能告诉是什么问题。 从make -n检查stdout,我没有看到任何相关的命令。 我怀疑有些命令会根据早期命令的结果而改变,而Makefiles的层次结构使得很难分辨真正发生的事情。 在make的手册页中我没有看到任何其他的选项。

通过命令行附加到GNU makevariables

我正在使用一个GNU make Makefile来构build一个包含多个目标( all , clean ,和一些项目特定目标)的C项目。 在debugging的过程中,我想将一些标志附加到单个版本,而不需要永久编辑Makefile(例如,添加debugging符号或设置预处理器标志)。 在过去,我已经做了如下(使用debugging符号的例子): make target CFLAGS+=-g 不幸的是,这不是追加到CFLAGSvariables,而是清除它,并停止编译。 有没有一个干净的方式做这个没有定义某种虚拟variables附加到CFLAGS和LDFLAGS的末尾?

在Makefile中=和=有什么区别?

对于Make(或Microsoft nmake)中的variables赋值,我看到:=和=运算符。 他们之间有什么区别?

如何在GNU make中使用多个扩展名来更改列表中每个文件的扩展名?

在一个GNU makefile中,我想知道是否有可能用一个文件列表input来创build一个带有新扩展名的文件列表输出。 在input中,我得到这个列表: FILES_IN=file1.doc file2.xls 我想从我的生成文件从FILES_INvariablesbuild立这个variables: FILES_OUT=file1.docx file2.xlsx 可能吗 ? 怎么样 ? 这很困难,因为我必须parsing文件列表,并检测每个扩展名(.doc,.xls)以将其replace为正确的扩展名。