我正在笔记本电脑(运行 debian 7)上为我的 Raspberry Pi 交叉编译 Linux 内核(按照Raspberry Pi Kernel Compilation 中的说明进行操作);但是在编译时
make ARCH=arm CROSS_COMPILE=${CCPREFIX}
Run Code Online (Sandbox Code Playgroud)
我收到以下消息:
CHK include/linux/version.h
CHK include/generated/utsrelease.h
make[1]: `include/generated/mach-types.h' is up to date.
CC kernel/bounds.s
gcc: error trying to exec 'cc1': execvp: No such file or directory
make[1]: *** [kernel/bounds.s] Error 1
make: *** [prepare0] Error 2
Run Code Online (Sandbox Code Playgroud)
我认为问题是找不到 cc1 或者gcc没有正确安装(所以我重新安装了 gccapt-get --reinstall install gcc但没有运气)。
gcc -v 给出:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i486-linux-gnu/4.7/lto-wrapper
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-5' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs …Run Code Online (Sandbox Code Playgroud) 我想自动化一个 Linux 构建,但最终我需要运行一个看起来非常手动的步骤:make menuconfig. 这似乎在操作系统和内核配置之间同步配置?
cp git-tracked-config .config
make defconfig
make menuconfig # <- how to automate/script this?
make V=s
Run Code Online (Sandbox Code Playgroud)
基本上,如何删除对make menuconfig构建脚本的调用?
顺便说一句,这是对构建错误的反应,该错误似乎在我从未调用 make menuconfig 的情况下运行时发生:
make[1]: *** No rule to make target `include/config/auto.conf', needed by `include/config/kernel.release'. Stop.
Run Code Online (Sandbox Code Playgroud)
似乎在 makefile 中缺少规则,可能是因为 makefile 本身不存在,或者 makefile 尚未生成/变形以包含该规则,但这是一个单独的问题。
可能有一种更聪明的方法来解决这个问题。是否还有其他我没有跟踪但应该跟踪的配置(例如 oldconfig)?
我知道我可以make随时中断进程,而无需再次重新编译整个源代码树。据我所知,make只有在尚未编译的情况下才编译目标,或者在上次编译后修改了源代码。
但是如果我中断make,肯定会有一个或多个(取决于并发级别)半就绪的二进制文件。下次我跑步时,它们对我有make什么作用?或者当我按Ctrl+C以避免部分编译的二进制文件时它是否完成了当前目标?
这段代码摘自 GNU makefile 手册的第 8.6 章。
makefile 中文件函数 arg 的 @$@.in 是什么意思?以及为什么像 rm 这样的 shell 命令以“@”符号为前缀
program: $(OBJECTS)
$(file >$@.in,$^)
$(CMD) $(CMDFLAGS) @$@.in
@rm $@.in
Run Code Online (Sandbox Code Playgroud)
文件函数语法是
$(file op filename[,text])
Run Code Online (Sandbox Code Playgroud) 我想知道make-kpkg和之间的确切区别make deb-pkg。这个问题问了几乎相同的问题,但没有令人满意的答案。以前我使用
make -j `getconf _NPROCESSORS_ONLN` deb-pkg
Run Code Online (Sandbox Code Playgroud)
编译内核源代码树并生成 header+kernel-image debian 包。我发现它非常慢,因为在我的第二代 Intel i3 CPU 上编译需要 1 个多小时。然后我找到了另一种方法,make-kpkg它比deb-pkg我以前使用的方法快 5-6 倍。我运行的代码
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers -j `getconf _NPROCESSORS_ONLN`
Run Code Online (Sandbox Code Playgroud)
编译和生成 deb 包只需要 10-15 分钟。在这两个编译过程中,作业是分开的,_NPROCESSORS_ONLN那么有什么区别呢?提前致谢。
我写了一个Makefile,发现在执行make命令时,rm在Mmakefile中的所有命令都完成后执行了一个意外。但是我没有rm在Makefile中写命令。
run-%: d/%.out
$<
d/%.out: d/%.c
gcc -o $(subst .c,.out,$<) $<
Run Code Online (Sandbox Code Playgroud)
运行输出make run-a:
gcc -o d/a.out d/a.c
d/a.out
rm d/a.out
Run Code Online (Sandbox Code Playgroud)
注意rm d/a.out我没有写的尾随。
什么情况下会rm添加自动命令?
我在将我在 Makefile 中修改的 PATH 导出到当前终端时遇到了一些麻烦。我正在尝试添加到 PATH,即 Makefile 目录所在的 bin 文件夹。
这是 makefile 的相关片段:
PATH := $(shell pwd)/bin:$(PATH)
install:
mkdir -p ./bin
export PATH
echo $(PATH)
Run Code Online (Sandbox Code Playgroud)
echo 打印正确,但如果我在终端中重做 echo,PATH 保持不变。
我在 makefile 规则中看到过诸如echo, mv, if, 之类的东西for。似乎可以识别某种 shell 命令。这是 bash 吗?如何确定正在使用哪个 shell 以及我可以使用的完整关键字列表?
有什么方法可以在系统范围内make使用多线程(6 个线程在我的系统上是理想的),而不是仅仅添加-j6到命令行?那么,如果我跑了make,它的作用就和我在跑一样make -j6?我想要这个功能,因为我使用pacaur(我在 Arch 上)从 AUR 安装了很多包,所以我不直接运行 make 命令,但我仍然希望多线程更快地构建包。
我的生成文件:
all: ...(other rules) clean
clean:
rm $(find . -type f -executable)
Run Code Online (Sandbox Code Playgroud)
当我clean从上面的 Makefile 中删除规则时,一切都按预期工作。添加后,make(也make clean)命令结果为:
rm
rm: missing operand
Try 'rm --help' for more information.
make: *** [Makefile:46: clean] Error 1
Run Code Online (Sandbox Code Playgroud)
是什么原因导致这里出现问题以及如何解决?