現在、まったく同じであるが別のフラグをコンパイラに渡す実行可能ファイルをビルドするために、プロジェクト Makefile を変更しています。
変更前の Makefile は次のようになっていました。
TARGETS = elilo.efi
all : check_gcc $(SUBDIRS) $(TARGETS)
elilo.efi : elilo.so
elilo.so : $(FILES)
elilo.o : elilo.c $(ARCH)/sysdeps.h
...
$(SUBDIRS): dummy
$(MAKE) -C $@
...
include Make.rules
どこ:
$(SUBDIRS)
プロジェクトのすべてのサブディレクトリを保存します$(FILES)
、elilo.soをリンクするために作成する必要があるすべての.oファイルを保存します- そして
check_gcc
、コンパイラのバージョンをチェックし、必要に応じて終了します
さらに、Make.rules には、ファイルをコンパイルおよびリンクするための一般的な規則が含まれています。
%.efi: %.so
$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \
-j .rela -j .reloc --target=$(FORMAT) $*.so $@
%.so: %.o
$(LD) $(LDFLAGS) $^ -o $@ $(LOADLIBES)
%.o: %.c # Rule number 1
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
# a rule for .S
%.o: %.S
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
私の試み:
これまでのところ、新しいターゲットを持ち、すべてのルールで両方をコンパイルできるようにするために、次のことを試しました
TARGETS = elilo.efi usb
all : $(TARGETS)
elilo.efi : check_gcc $(SUBDIRS) elilo.so
touch $@.touch
elilo.so : $(FILES)
.PHONY : usb
usb : check_gcc $(SUBDIRS)
CFLAGS += "-DBoot64" $(MAKE) boot64.efi
touch $@.touch
boot64.efi : elilo.so
$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \
-j .rela -j .reloc --target=$(FORMAT) $> $@
Make.rules を使用:
%.efi: %.so
$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \
-j .rela -j .reloc --target=$(FORMAT) $*.so $@
%.so: %.o
$(LD) $(LDFLAGS) $^ -o $@ $(LOADLIBES)
%.o: %.c usb.touch elilo.touch # Rule number 1
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
...
しかし、ルール番号 1に加えた変更のようには見えません$(SUBDIRS)
。おそらく、そのルールは非常に一般的であり、プロジェクト ディレクトリとそのサブディレクトリ内のすべてのオブジェクト ファイルに影響するためです...
基本的に、私がやりたいことは、elilo.efi と同じように boot64.efi をビルドすることですが、フラグ -DBoot64 をコンパイラに渡して、一部の .c ファイルがその動作を変更するようにします。それを行う方法に関するヒントはありますか?