获取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

我目前正在更改一个项目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
其中:

  • $(子项)
    存储项目的所有子项
  • $(文件)
    ,存储链接elilo.so必须创建的所有.o文件
  • check\u 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 $@
使用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 $@

#######################################################################