问题标签 [gnu-make]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
variables - 有条件地附加到 Makefile 目标内的变量
我有一个看起来有点像这样的 GNU Makefile:
这个想法是我要么运行 make targetA 要么运行 targetB。他们俩都做非常相似的事情,但项目列表不同。问题是变量不是有条件地附加到,它总是附加到,这意味着我的输出总是“item1 itemA itemB”。
如何有条件地附加到变量?
gcc - 如果编译一个依赖项失败,如何强制退出?
我已经发布了我的 makefile 的相关位。当我make all
在这个makefile上运行时,编译时出现编译错误debugosd.o
。但是,因为 make 找到了一个以前构建的debugosd.o
,它只是继续构建dialup.otz
。
在不删除所有 .o 的情况下,我如何强制debugosd.o
使其过时 - 因此make
一旦遇到编译错误就强制停止debugosd.o
?
构建 .o 文件的规则是:
makefile 片段是:
实际上,我发现了问题所在。shared1.flw
我正在强制使用虚假目标进行重建。我认为make
无论错误如何,这都会迫使它继续进行。
makefile - 是否可以在 Makefile 中“取消设置”环境变量?
我正在使用 GNU make,并在一个项目中包含一个 3rd 方库,该项目具有一个构建系统,如果CFLAGS
在调用它时在环境中定义它,它就会发疯。CFLAGS
出于其他原因,我喜欢在我的环境中进行定义。库的构建是从另一个 makefile 调用的,所以我说例如:
第三方:
$(MAKE) -f Makefile.3rdparty
但是我想确保CFLAGS
在第 3 方 Makefile 上调用 make 时未设置。我能找到的最接近的事情是:
CFLAGS:=
但这仍然CFLAGS
在环境中设置,它只是一个空字符串。除了做一些可怕的事情,比如说:
第三方:
bash -c "unset CFLAGS; $(MAKE) -f Makefile.3rdparty"
有没有一种简单的方法可以CFLAGS
从我的主生成文件中“取消设置”变量,以便在调用第三方库时它根本不存在于环境中?
makefile - 如何让 GNU make 明确地测试失败?
在多年不使用 make 之后,我发现自己再次需要它,现在是 gnu 版本。我很确定我应该能够做我想做的事,但还没有弄清楚如何做,或者在谷歌等处找到答案。
我正在尝试创建一个测试目标,它将多次执行我的程序,并将结果保存在日志文件中。一些测试应该会导致我的程序中止。不幸的是,我的 makefile 在第一次测试中中止,导致错误。我有类似的东西:
使用上述方法,在 bad_input1 运行后退出,永远不会进入 bad_input2 运行。
c++ - make/gmake 的条件依赖
有没有办法直接 make/gmake 对条件依赖采取行动?
我有这个规则:
一般情况下,每个 .cpp 文件都有一个对应的 .h 文件;但是也有一些例外。有没有办法用gmake实现“如果它存在就依赖它”?如果做不到这一点,这种设置是否有最佳实践?
提前致谢; 干杯!
更新:我正在使用 GCC
makefile - 如何从另一个 Makefile 调用 Makefile?
从另一个makefile调用一个makefile时,我得到了一些意想不到的结果。我有两个 makefile,一个调用/path/to/project/makefile
,一个调用/path/to/project/gtest-1.4.0/make/Makefile
. 我试图让前者调用后者。在 /path/to/project/makefile 中,我有
在/path/to/project/gtest-1.4.0/make/Makefile
我有
发布以下内容:
输出:
但是,当我发出这些命令时:
我懂了:
我不明白:在这两种情况下,/path/to/project/makefile
都告诉我它正在进入当前工作目录。在第一种情况下,它认为它没有工作要做(当它有工作时),在第二种情况下,它能够找到适当的指令(当输出告诉我它在错误的目录中查找时)但它会尝试在 中运行rm
命令/path/to/project
,而不是/path/to/makefile/gtest-1.4.0/make/
.
我是否遗漏了一些基本的相互调用 makefile 的东西?我是否犯了一个严重的概念错误,或者遇到了一个常见的陷阱?如何有效地更改目录并从第一个 makefile 中调用第二个?我的理解是,简单地调用make -f <name>
就足够了。
这是 bash 中的 make/gmake 3.81。
dependencies - 在 make 中纠正自动生成的依赖项(来自 gcc)
我有以下makefile(片段)
当我跑步时,make dev
我看到以下内容
当更改src/socket.h
(其他人都依赖的文件)并运行make
时,我希望它会重建整个项目,但它只发出一个动作
我相信我正确地生成了自动依赖项 - 所以我觉得我根本没有正确使用它们。我哪里出错了?我知道makefile:59:...
错误是一个线索,但我以前从未使用过自动生成的依赖项。
提前致谢; 干杯!
makefile - 当它不需要做任何事情时,我如何闭嘴?
我如何停止说make: Nothing to be done for 'all'.
or make: 'file' is up to date
?我希望我的构建在它不做任何事情时保持沉默——还有其他地方echo
被调用来跟踪构建进度,所以这个消息只是把事情弄得乱七八糟。我目前正在像这样使其静音:
有些东西告诉我一定有更好的方法。有任何想法吗?
编辑:
但是,当它确实需要构建某些东西时,我想保持命令 echo 工作。我希望的一个很好的例子是沿线--no-print-directory
,但我找不到任何其他标志来关闭选定的消息。
makefile - 如何在 Makefile.am 脚本中指定我只想编译对象 .o 文件?
我有一个Makefile.am
负责构建最终应用程序二进制文件:
在 src 目录中还有一个名为的子目录ctrnn
,其中包含一个附加的Makefile.am
:
现在,ctrnn/Makefile.am
应该只生成目标.o
文件,其想法是顶级Makefile.am
应该使用子目录中生成的目标文件ctrnn
来构建二进制文件。
这是ctrnn/Makefile.am
:
基于这个Makefile.am
文件,我想得到 network.o 和 neuron.o。我正在Makefile
使用 Automake 等生成相应的文件,但是当我尝试然后执行 make 文件时,它什么也没做,只是说:
我知道这是为什么,我需要指定构建目标。ctrnn/Makefile.am
但是,鉴于我不想构建需要bin_PROGRAMS
实际目标文件network.o
和的二进制文件,我该如何在脚本中执行此操作neuron.o
?
(请注意,如果我确实指定了 bin_PROGRAMS 名称,它最终会正确地抱怨对 main 的未定义引用)。
我做错了什么?
makefile - gnu make、microsoft nmake 和 posix standard make 的相似/不同之处如何?
gnu make、microsoft nmake 和 posix standard make 的相似/不同之处如何?
显然有诸如“哪个操作系统?”,“哪个编译器?”之类的东西。和“哪个链接器?”,但我特别指的是 makefile 本身的语法、语义和命令行选项。
如果我根据 gnu make 的手册编写 makefile,我需要注意的最重要的可移植性问题是什么?