获取makefile以从同一文件生成两个具有不同标志的目标
我目前正在更改一个项目Makefile,以便构建一个完全相同但向编译器传递不同标志的可执行文件 更改之前,Makefile如下所示:获取makefile以从同一文件生成两个具有不同标志的目标,makefile,dependencies,gnu-make,Makefile,Dependencies,Gnu Make,我目前正在更改一个项目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): d
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
其中:
存储项目的所有子项$(子项)
,存储链接elilo.so必须创建的所有.o文件$(文件)
- 而
只需检查编译器版本,必要时退出即可check\u gcc
%.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 $@
使用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 $@
...
%.efi:%.so
$(OBJCOPY)-j.text-j.sdata-j.data-j.dynamic-j.dynsym-j.rel\
-j.rela-j.reloc--target=$(格式)$*.so$@
%.so:%
$(LD)$(LDFLAGS)$^-o$@$(LOADLIBES)
%.o:%.c usb.touch elilo.touch#规则1
$(CC)$(INCDIR)$(CFLAGS)$(CPPFLAGS)-c$<-o$@
...
但它看起来不像我对规则1所做的更改,因为它现在在生成$(SUBDIRS)
时停止,可能是因为该规则非常通用,它会影响项目目录及其子目录中的每个对象文件
基本上,我想做的是像elilo.efi一样构建boot64.efi,但是将标志-DBoot64传递给编译器,这样一些.c文件就会改变它的行为。有什么建议吗?我想你应该打电话给elilo
usb : check_gcc $(SUBDIRS)
rm elilo.so
CFLAGS += "-DBoot64" $(MAKE) boot64.efi
touch $@.touch
因为如果elilo.so已经在没有“Boot64”的情况下进行了构建,那么它就不会重新构建了我想我终于找到了解决方案。而不是修改Make.rules中的“原型”规则。我已经构建了一个新的不同路径来构建bootx64.efi,因此它的构建方式与elilo.efi的构建方式相同 下面是代码:
all : check_gcc $(TARGETS)
######################## NORMAL ELILO ################################
elilo : $(SUBDIRS)
$(MAKE) elilo.efi
rm -f $(FILES)
elilo.efi : elilo.so
elilo.so : elilo.o $(FILES)
elilo.o : elilo.c $(ARCH)/sysdeps.h
############################ USB ELILO ###############################
# SUBDIRS must be build using a for, as if not done so, make
# would take the rule as executed and SUBDIRS wouldn't be compiled
# with the new flag
usb :
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir CFLAGS="$(CFLAGS) -DBOOTX64"; \
done
$(MAKE) bootx64.efi CFLAGS="$(CFLAGS) -DBOOTX64"
bootx64.efi : bootx64.so
bootx64.so : bootx64.o $(FILES)
# bootx64.o is build the same way elilo.o is build (code from the
# prototype rules has been copied)
bootx64.o : elilo.c $(ARCH)/sysdeps.h
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
#######################################################################
all:check_gcc$(目标)
########################正常ELILO################################
elilo:$(细分市场)
$(MAKE)elilo.efi
rm-f$(文件)
elilo.efi:elilo.so
elilo.so:elilo.o$(文件)
elilo.o:elilo.c$(ARCH)/sysdeps.h
############################伊莱洛###############################
#必须使用for生成子曲面,就像没有这样做一样,make
#会将规则视为已执行,而不会编译子目录
#带着新国旗
usb接口:
对于dir,单位为美元(细分卢比);做\
$(MAKE)-C$$dir CFLAGS=“$(CFLAGS)-DBOOTX64”\
完成
$(MAKE)bootx64.efi CFLAGS=“$(CFLAGS)-DBOOTX64”
bootx64.efi:bootx64.so
bootx64.so:bootx64.o$(文件)
#bootx64.o的构建方式与elilo.o的构建方式相同(代码来自
#原型规则已被复制)
bootx64.o:elilo.c$(ARCH)/sysdeps.h
$(CC)$(INCDIR)$(CFLAGS)$(CPPFLAGS)-c$<-o$@
#######################################################################
最后,修改了$(FILES)变量,从中取出了elilo.o作为elilo.o,
和bootx64.o是区别.so文件的地方。现在这个.o文件是硬编码的
每个相应的规则。由于到目前为止我所做的更改,它甚至没有达到目标,它在执行$(细分规则)时陷入困境(我认为这与我添加到规则1中的依赖项有关)
all : check_gcc $(TARGETS)
######################## NORMAL ELILO ################################
elilo : $(SUBDIRS)
$(MAKE) elilo.efi
rm -f $(FILES)
elilo.efi : elilo.so
elilo.so : elilo.o $(FILES)
elilo.o : elilo.c $(ARCH)/sysdeps.h
############################ USB ELILO ###############################
# SUBDIRS must be build using a for, as if not done so, make
# would take the rule as executed and SUBDIRS wouldn't be compiled
# with the new flag
usb :
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir CFLAGS="$(CFLAGS) -DBOOTX64"; \
done
$(MAKE) bootx64.efi CFLAGS="$(CFLAGS) -DBOOTX64"
bootx64.efi : bootx64.so
bootx64.so : bootx64.o $(FILES)
# bootx64.o is build the same way elilo.o is build (code from the
# prototype rules has been copied)
bootx64.o : elilo.c $(ARCH)/sysdeps.h
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
#######################################################################