微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

忍者:错误:build.ninja:6:预期的“命令=”行

如何解决忍者:错误:build.ninja:6:预期的“命令=”行

我正在制作一个操作系统 我正在使用 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

存储库

github

gitlab

解决方法

您的构建脚本需要稍微更新一下,

我是这样诊断的:

  1. 首先尝试将您的参数直接插入到 g++ 中,编译正常,但有警告。 (拿了一份你的 repo 来测试构建过程)
  2. 因此接下来检查了 ninja 构建系统 build statements 的文档,其中说 outfile 或 $out 位于构建命令本身中,无需将其指定为构建规则的命令参数。
    ex: build $outfile_with_dir_if_reqd: rule $params_if_any $infile_if_any # 注意规则的输入参数是有序的。
  3. 我必须改变的是:
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 的文档,如果有帮助,请点赞,谢谢。

>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。