问题描述
我正在制作一个操作系统 我正在使用 makefile 但我正在尝试迁移到 ninja-build 但我收到此错误:
ninja: 错误:build.ninja:6: 预期的 'command =' 行
build.ninja
GPPParaMS = -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -
fno-exceptions -fno-leading-underscore
ASParaMS = --32
LDParaMS = -melf_i386 -T
rule compile-cpp
command = gcc $GPPParaMS -o $out -c $in
rule compile-asm
command = as $ASParaMS -o $out -c $in
rule link
command = ld $LDParaMS -c $in
rule kernel
command = sudo cp $in /boot/kernel.bin
build ./src/kernel.o: compile-cpp ./src/kernel.cpp
build ./src/loader.o: compile-asm ./src/loader.s
build fgos: link ./src/linker.ld
制作文件
'GPPParaMS = -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore
ASParaMS = --32
LDParaMS = -melf_i386
objects = loader.o kernel.o
%.o: %.cpp
g++ $(GPPParaMS) -o $@ -c $<
%.o: %.s
as $(ASParaMS) -o $@ $<
kernel.bin: linker.ld $(objects)
ld $(LDParaMS) -T $< -o $@ $(objects)
install: kernel.bin
sudo cp $< /boot/kernel.bin
存储库
解决方法
您的构建脚本需要稍微更新一下,
我是这样诊断的:
- 首先尝试将您的参数直接插入到 g++ 中,编译正常,但有警告。 (拿了一份你的 repo 来测试构建过程)
- 因此接下来检查了 ninja 构建系统 build statements 的文档,其中说 outfile 或 $out 位于构建命令本身中,无需将其指定为构建规则的命令参数。
ex: build $outfile_with_dir_if_reqd: rule $params_if_any $infile_if_any # 注意规则的输入参数是有序的。 - 我必须改变的是:
build kernel.o: compile-cpp ./src/kernel.o ./kernel.cpp
build loader.o: compile-asm ./src/loader.o ./loader.s
to
build ./src/kernel.o: compile-cpp ./src/kernel.cpp
build ./src/loader.o: compile-asm ./src/loader.s
整个构建脚本:(不要忘记空格,因为 bash 赋值运算符是认真的!)
GPPPARAMS = -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore
ASPARAMS = --32
LDPARAMS = -melf_i386 -T
rule compile-cpp
command = g++ $GPPPARAMS -o $out -c $in
rule compile-asm
command = as $ASPARAMS -o $out -c $in
rule link
command = ld -T $in -o $out
rule kernel
command = sudo cp $in /boot/kernel.bin
build ./src/kernel.o: compile-cpp ./src/kernel.cpp
build ./src/loader.o: compile-asm ./src/loader.s
这些语句中冒号的左侧接受 out 参数,并且不需要在规则的右侧指定 out,因此只需尝试阅读 ninja 的文档,如果有帮助,请点赞,谢谢。
>