昨天我试图从源代码编译ROOT包。由于我是在 6 核怪物机器上编译它,因此我决定继续使用make -j 6. 一开始编译很顺利,速度也很快,但在某个时候make,只在一个内核上使用了 100% 的 CPU。
我做了一些谷歌搜索,并在 ROOT 留言板上找到了这篇文章。自从我自己组装了这台电脑,我担心我没有正确应用散热器和CPU过热什么的。不幸的是,我在工作时没有可以把它塞进去的冰箱。;-)
我安装了lm-sensors软件包并make -j 6再次运行,这次是监控 CPU 温度。尽管它变得很高(接近 60 C),但它从未超过高温或临界温度。
我尝试运行make -j 4但make在编译过程中的某个时候再次挂起,这次是在不同的位置。
最后,我编译运行make并运行良好。我的问题是:它为什么挂了?由于它停在两个不同的位置,我猜这是由于某种竞争条件,但我认为make应该足够聪明,以正确的顺序排列所有东西,因为它提供了-j选项。
在 Gentoo Linux 中,可以设置MAKEOPTS变量/etc/portage/make.conf来告诉make在构建包时它应该并行运行多少作业。因为我有一个双核 CPU,我天真地选择了使用这个-j2选项:一个核心一个工作,所以两者都有事可做。“问题”是有很多参考资料告诉拥有双核 CPU 的用户改为设置该-j3选项。他们之中有一些是:
例如,Gentoo 手册说:
一个不错的选择是系统中的 CPU(或 CPU 内核)数加一,但此指南并不总是完美的。
但是“CPU + 1”规则的基本原理是什么?为什么要加班?
make.conf(5) 手册页甚至说:
建议的设置介于 CPUs+1 和 2*CPUs+1 之间。
我还在make信息页面和make手册页解释中阅读了该-j选项的第 5.4 节(并行执行),但似乎没有答案。
我正在尝试运行一个简单的脚本-将 git 存储库克隆到某个目录,然后cd到该目录以执行安装脚本。
此脚本位于 Makefile 中。
但cd似乎不起作用。它没有找到我的安装脚本。
我cd在脚本中的之后添加了一个密码,它向我显示了我执行脚本的目录,而不是我cd进入的目录。
有什么问题?
git clone http://somerepo ~/some_dir
cd ~/some_dir/
pwd
python myscript.py install
Run Code Online (Sandbox Code Playgroud)
=>
pwd: /hereIsPathToDirectoryFromWhichIRunTheScript
python:无法打开文件“setup.py”:[Errno 2] 没有这样的文件或目录
它也不适用于./setup.py.
如果我输入绝对路径~/some_dir/setup.py,脚本稍后会失败,因为它试图访问同一文件夹中的资源。
假设我有一个mymod包含源文件的模块,如下所示:
src/mod/mymod.c
src/inc/mymod.h
我尝试包含 mymod.h 如下
#include <mymod.h>
Run Code Online (Sandbox Code Playgroud)
我的 makefile 包含EXTRA_CFLAGS= -I$(shell pwd)/../inc/但在制作内核时,我收到一条错误消息:
未找到 mymod.h
原因似乎是在制作内核模块时,此命令从 makefile 运行:(使用makeV1):
make -C <path/to/linux/src> M=<path/to/mymod> modules
Run Code Online (Sandbox Code Playgroud)
在其他作品中,我$(shell pwd)扩展到<path/to/linux>. 这不是我想要的。如何指定-I要指向src/inc我的mymod源树的参数?
我有一种情况,我有两个内核配置文件(对于相同的内核源)。它们都具有我需要的一部分功能(一方面,USB 工作正常,另一方面,第二个 I2C)。
我知道,从 menuconfig 的角度来看,这两个配置文件之间的差异仅包括几个选定的选项。(但不知道是哪个)
然而,当手动比较配置文件(在两个 .config 文件之间融合)时,差异并不容易识别。我尝试手动合并它们但没有成功。我相信我最终会成功,但相信如果以它们出现在 menuconfig 中的方式比较文件,这个过程可能会更轻松。
这可以实现吗,如果可以,如何实现?
它是写在linux内核Makefile中的
clean - Remove most generated files but keep the config and
enough build support to build external modules
mrproper - Remove all generated files + config + various backup files
Run Code Online (Sandbox Code Playgroud)
并且在arch 文档中指出
要完成准备工作,请确保内核树绝对干净;
$ make clean && make mrproper
那么如果make mrproper进行更彻底的删除,为什么make clean使用?
我在玩makefile,遇到了%.o或%.c。据我了解,它指定了所有c或o文件。但为什么这项工作:
%.o: %.c
$(CC) -c $^ -o $@
Run Code Online (Sandbox Code Playgroud)
这不起作用
SOURCE := $(wildcard *.c)
$(SOURCE:.c=.o): SOURCE
$(CC) -c $^ -o $@
Run Code Online (Sandbox Code Playgroud)
这两个表达式都指定了所有文件。那么%.o: make 文件中的符号有什么作用呢?
我有一个 Makefile。在 makefile 中的某个地方定义了一个变量:
FOO=hello
Run Code Online (Sandbox Code Playgroud)
稍后我需要在FOO的内容中附加一些文本。我是这样试的:
FOO=$(FOO)_world
Run Code Online (Sandbox Code Playgroud)
我建议echo $(FOO)将输出hello_world. 相反,我收到一个错误:
*** Recursive variable 'FOO' references itself (eventually). Stop.
Run Code Online (Sandbox Code Playgroud)
不能使用+=运算符,因为这会在它们之间添加一个空格。
我们有以下任务Makefile:
test:
export SOME_ENV=someTest
go test -tags=integration -v -race ./tests/integrationtest/...
Run Code Online (Sandbox Code Playgroud)
在 shell 提示符下,设置 SOME_ENV 并且下一个命令(go test)在内部选择.someTest.env文件
$ export SOME_ENV=someTest
$ go test -tags=integration -v -race ./tests/integrationtest/...
Run Code Online (Sandbox Code Playgroud)
但 Makefile 方法不起作用
为什么没有使用Makefile方法设置环境变量?
注意:我们在 Makefile 中有另一个任务,不应受到此导出的影响
有没有已知的方法可以让 Linuxmake拒绝意外使用 GNU?在 Linux 中编辑或使用其他人的 Makefile 时,在 Makefile 中进行特定扩展?我的意思是,限制 GNU?Makemake按照 POSIX 中指定的方式运行并拒绝任何 GNU?Make 特定扩展?
该.POSIX专项的目标是不够的,按照“ 4.9特别内置目标名(gnu.org) ”。手册页没有提到这个命令行选项。
使用其他make实用程序可能是一种选择。
— 更新 2018-10-19 —
我仍然没有找到我的问题的直接答案,但这里至少有一个关于这个问题的文档,这个文档在我提出这个问题时并不存在: A Tutorial on Portable Makefiles (nullprogram.com)。