2016-10-23 5 views
0

그래서 저는 GNU make로 프로젝트를 진행했습니다. 경우에 따라 make all을 실행하면 빌드되지만 디버그 심볼 파일 이 다시으로 빌드되고 때로는 정상적으로 작동하고 Nothing to be done for 'all'이보고됩니다. (. 내가 # HERE에 해당 줄을 표시 나는 또한 가독성을 향상시키기 위해 빈 줄을 삽입.) 메이크 파일이 무작위로 명령을 실행합니다.

[[email protected] 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 

[[email protected] 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 

[[email protected] kernel32]$ make all 
objcopy --only-keep-debug boot.out boot.sym # HERE 

[[email protected] kernel32]$ make all 
make: Nothing to be done for 'all'. 

것은 :

[[email protected] 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 

[[email protected] 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 

[[email protected] kernel32]$ make all 
make: Nothing to be done for 'all'. 

가 이상하게 작동 :

예상 작업으로 여기는 겉보기에 무작위로 발생한다는 것입니다. 사실, 내가 준 두 가지 사례는 연속적으로 발생했습니다.
나는 긴 시간 make clean, make all때로는make all 사이에 긴밀하게 함께 명령을 실행하는 반면 결코가 발생, 중복 빌드 단계를 발생하는 것으로 나타났습니다. 나는 10x처럼 노력했다.

# 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 $< [email protected] 

%.img: %.out 
     objcopy --strip-debug --strip-unneeded $< 
     objcopy -O binary $< [email protected] 

%.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 

당신이 당신의 자신에 재현하려면

는, 자식 클론 here을 다운로드 할 수 있습니다 : 다음과 같이

메이크입니다.

그래서 여기에 무슨 문제가 있습니까? 그리고 추가 빌드 단계와 명령들 사이에 전달 된 시간 사이의 상관 관계는 어디에 있습니까 (아니면 단지 잘못된 관찰일까요?). GNU make는 파일의 최신 버전을 결정하기 위해 타임 스탬프에 의존합니다 ... 어쩌면 그것이 어떻게 든 관련이 있습니까?

답변

2

그런데,이 규칙의 레시피의 첫 줄 :

%.img: %.out 
     objcopy --strip-debug --strip-unneeded $< 
     objcopy -O binary $< [email protected] 

는 타임 스탬프를 갱신 전제 조건 ( boot.out)를 수정한다. 그러한 일이 언제 발생했는지, 어떤 종류의 파일 시스템 (예를 들어 1 초 미만의 시간 소인을 지원하는지 여부)에 따라이 규칙이 완료된 후 boot.out의 시간 소인은 이전에 작성된 것보다 더 새로운 시간 소인을 가질 수 있습니다 boot.sym이므로 다시 실행하면 boot.sym을 다시 작성하기로 결정합니다.

이 규칙을 전제 조건을 수정하지 않는 방식으로 다시 작성해야합니다. 어쩌면 : objcopy의이 표준 입력에서 읽고 표준 출력/쓰기 할 경우

%.img: %.out 
     objcopy --strip-debug --strip-unneeded $< $<.tmp 
     objcopy -O binary $<.tmp [email protected] 
     rm -f $<.tmp 

잘 모르겠지만, 만약 그렇다면 당신은 대신에 파이프 라인을 사용할 수 있습니다.

관련 문제