使用我重新定义的隐式规则无法正常工作

时间:2013-03-19 01:48:40

标签: build makefile

我想将源代码和目标代码分开到另一个目录。

以下是我的目录树:

.
|-- bsp
|   |-- Makefile
|   `-- x86
|       |-- begin.s
|       |-- dummy.s
|       |-- helloos.s
|       |-- lowlevel_init.s
|       `-- Makefile
|-- buildrules
|   |-- builder.rules
|   |-- linker.rules
|   `-- subdir.rules
|-- configure
|   `-- helloos.lds
|-- hypervisor
|   |-- font.c
|   |-- int.c
|   |-- int_entry.s
|   |-- Makefile
|   |-- mouse.c
|   `-- start.c
|-- include
|   |-- common.h
|   `-- font.h
|-- lib
|   |-- lib.s
|   `-- Makefile
|-- Makefile
`-- README.md

我想在根(TOP)目录上创建一个“obj”子目录。将所有obj文件放入其中。

如下所示:

|-- bsp
|   |-- Makefile
|   `-- x86
|       |-- begin.s
|       |-- dummy.s
|       |-- helloos.s
|       |-- lowlevel_init.s
|       `-- Makefile
|-- buildrules
|   |-- builder.rules
|   |-- linker.rules
|   `-- subdir.rules
|-- configure
|   `-- helloos.lds
|-- hypervisor
|   |-- font.c
|   |-- int.c
|   |-- int_entry.s
|   |-- Makefile
|   |-- mouse.c
|   `-- start.c
|-- include
|   |-- common.h
|   `-- font.h
|-- lib
|   |-- lib.s
|   `-- Makefile
|-- Makefile
|-- obj
|   |-- begin.o
|   |-- dummy.o
|   |-- font.o
|   |-- helloos.o
|   |-- int_entry.o
|   |-- int.o
|   |-- lib.o
|   |-- lowlevel_init.o
|   |-- mouse.o
|   `-- start.o
`-- README.md

然后,这是我的实施:

%.o: %.c
    $(CC) $(CFLAGS) -c -o $(OBJDIR)/$@ $<

%.o: %.s
    $(AS) $(ASFLAGS) -o $(OBJDIR)/$@ $<

但我不喜欢这种实现。

我想这样写:

    $(OBJDIR)/%.o: %.c
        $(CC) $(CFLAGS) -c -o $@ $<


    $(OBJDIR)/%.o: %.s
        $(AS) $(ASFLAGS) -o $@ $<

如果我这样做,请不要遵循这些规则,但它使用隐式规则。

谢谢你的帮助!!!!!!!!!!!!!!!

欢迎任何困惑。

1 个答案:

答案 0 :(得分:0)

如果您使用VPATH

,则隐式规则将有效
VPATH = bsp hypervisor lib

$(OBJDIR)/%.o: %.c
    $(CC) $(CFLAGS) -c -o $@ $<

http://www.gnu.org/software/make/manual/make.html

  

make变量VPATH的值指定了应搜索的目录列表。

     

例如,

 VPATH = src:../headers
  

指定一个包含两个目录src和../headers的路径,这些目录按顺序进行搜索。

     

使用VPATH的这个值,以下规则

foo.o : foo.c
  

被解释为它是这样编写的:

foo.o : src/foo.c