Makefile似乎随机运行命令

Makefile似乎随机运行命令,makefile,x86,gnu-make,Makefile,X86,Gnu Make,所以,我有一个GNU make的项目。有时,如果我执行一个make all,它会生成,但在那之后,会再次生成调试符号文件,有时,它会正常工作,并报告没有为“all”执行任何操作 按预期工作: [cad@cordev kernel32]$ make clean make -C boot clean make[1]: Entering directory '/home/cad/Desktop/kernel/kernel32/boot' rm -f main.o boot.o floppy_errs.

所以,我有一个GNU make的项目。有时,如果我执行一个
make all
,它会生成,但在那之后,会再次生成调试符号文件,有时,它会正常工作,并报告
没有为“all”执行任何操作

按预期工作:

[cad@cordev kernel32]$ make clean
make -C boot clean
make[1]: Entering directory '/home/cad/Desktop/kernel/kernel32/boot'
rm -f main.o boot.o floppy_errs.o install_ints.o drivers/i8259A.o drivers/i8042o drivers/vga.o  *.ld.m4
make[1]: Leaving directory '/home/cad/Desktop/kernel/kernel32/boot'
make -C kernel clean
make[1]: Entering directory '/home/cad/Desktop/kernel/kernel32/kernel'
make[1]: Nothing to be done for 'clean'.
make[1]: Leaving directory '/home/cad/Desktop/kernel/kernel32/kernel'
rm -f *.out *.img *.sym

[cad@cordev kernel32]$ make all
make -C boot all
make[1]: Entering directory '/home/cad/Desktop/kernel/kernel32/boot'
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 main.S  | \
as -o main.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 boot.S  | \
as -o boot.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 floppy_errs.S  | \
as -o floppy_errs.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 install_ints.S  | \
as -o install_ints.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 drivers/i8259A.S  | \
as -o drivers/i8259A.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 drivers/i8042.S  | \
as -o drivers/i8042.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 drivers/vga.S  | \
as -o drivers/vga.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 boot.ld  > boot.ld.m4
ld -T boot.ld.m4 main.o boot.o floppy_errs.o install_ints.o drivers/i8259A.o drvers/i8042.o drivers/vga.o  -melf_i386
make[1]: Leaving directory '/home/cad/Desktop/kernel/kernel32/boot'
objcopy --only-keep-debug boot.out boot.sym
objcopy --strip-debug --strip-unneeded boot.out
objcopy -O binary boot.out boot.img

[cad@cordev kernel32]$ make all
make: Nothing to be done for 'all'.
奇怪的工作:

[cad@cordev kernel32]$ make clean
make -C boot clean
make[1]: Entering directory '/home/cad/Desktop/kernel/kernel32/boot'
rm -f main.o boot.o floppy_errs.o install_ints.o drivers/i8259A.o drivers/i8042o drivers/vga.o  *.ld.m4
make[1]: Leaving directory '/home/cad/Desktop/kernel/kernel32/boot'
make -C kernel clean
make[1]: Entering directory '/home/cad/Desktop/kernel/kernel32/kernel'
make[1]: Nothing to be done for 'clean'.
make[1]: Leaving directory '/home/cad/Desktop/kernel/kernel32/kernel'
rm -f *.out *.img *.sym

[cad@cordev kernel32]$ make all
make -C boot all
make[1]: Entering directory '/home/cad/Desktop/kernel/kernel32/boot'
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 main.S  | \
as -o main.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 boot.S  | \
as -o boot.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 floppy_errs.S  | \
as -o floppy_errs.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 install_ints.S  | \
as -o install_ints.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 drivers/i8259A.S  | \
as -o drivers/i8259A.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 drivers/i8042.S  | \
as -o drivers/i8042.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 m4/asm.m4 ../m4/asm.m4 drivers/vga.S  | \
as -o drivers/vga.o --32 -g
m4 ../m4/global.m4 m4/boot.m4 boot.ld  > boot.ld.m4
ld -T boot.ld.m4 main.o boot.o floppy_errs.o install_ints.o drivers/i8259A.o drvers/i8042.o drivers/vga.o  -melf_i386
make[1]: Leaving directory '/home/cad/Desktop/kernel/kernel32/boot'
objcopy --only-keep-debug boot.out boot.sym
objcopy --strip-debug --strip-unneeded boot.out
objcopy -O binary boot.out boot.img

[cad@cordev kernel32]$ make all
objcopy --only-keep-debug boot.out boot.sym # HERE

[cad@cordev kernel32]$ make all
make: Nothing to be done for 'all'.
(我在此处用
#标记了相关行。我还插入了空行以提高可读性。)

这里的问题是,这似乎是随机发生的。事实上,我举的这两个例子是连续发生的。
我注意到,
makeclean
makeall
makeall
之间的较长时间有时会导致冗余构建步骤,而将命令紧密地执行在一起并不会导致冗余构建步骤。不过我试了10倍

生成文件如下所示:

# Parameters passed to GNU make.
# `dbg=y|n': decides whether debugging mode is on or not.
# `sep_boot=y|n': decides whether bootloader and kernel should be seperate
# images or not.
# TODO: add functionality for these parameters

SHELL = /bin/bash

%.sym: %.out
        objcopy --only-keep-debug $< $@

%.img: %.out
        objcopy --strip-debug --strip-unneeded $<
        objcopy -O binary $< $@

%.out:
        make -C $* all

# TODO: merge run and debug targets and decide to debug or not using the dbg
# parameter.

boot_debug: boot.sym boot.img
        qemu-system-i386 -fda boot.img -s -S &
        gdb -x dbg.gdb

all: boot.sym boot.img #kernel.img kernel.sym

boot.sym boot.img: boot.out

kernel.sym kernel.img: kernel.out


clean:
        make -C boot clean
        make -C kernel clean
        rm -f *.out *.img *.sym


.PHONY: boot_debug all clean
#传递给GNU make的参数。
#`dbg=y | n':决定调试模式是否打开。
#'sep_boot=y | n':决定引导加载程序和内核是否应该分开
#图像与否。
#TODO:为这些参数添加功能
SHELL=/bin/bash
%.sym:%.out
objcopy--仅保留调试$<$@
%.img:%.out
objcopy--条带调试--不需要条带$<
objcopy-O二进制$<$@
%.out:
make-C$*全部
#TODO:合并运行和调试目标,并决定是否使用dbg进行调试
#参数。
boot_debug:boot.sym boot.img
qemu-system-i386-fda boot.img-s-s&
gdb-xdbg.gdb
全部:boot.sym boot.img#kernel.img kernel.sym
boot.sym boot.img:boot.out
kernel.sym kernel.img:kernel.out
清洁:
使-C引导干净
使-C内核干净
rm-f*.out*.img*.sym
.假冒:开机调试全部清除
如果您想自己复制,可以下载git克隆


那么,这里有什么问题?另外,额外的构建步骤与命令之间传递的时间之间的相关性在哪里(或者这只是一个误判)?GNU make依赖时间戳来确定文件的最新版本。。。也许这有什么关系?

好吧,这条规则的第一行:

%.img: %.out
        objcopy --strip-debug --strip-unneeded $<
        objcopy -O binary $< $@

我不确定objcopy是否会写入stdout/从stdin读取,但如果是这样,您可以使用管道代替。

好的,这个规则的配方的第一行:

%.img: %.out
        objcopy --strip-debug --strip-unneeded $<
        objcopy -O binary $< $@
我不确定objcopy是否会从stdin写入stdout/读取,但如果是这样,您可以使用管道代替