Makefile在先决条件中使用通配符的目标名称

时间:2016-01-10 15:27:28

标签: c makefile gnu-make

.
├── include
│   ├── a
│   │   └── defs.h
│   ├── b
│   │   └── defs.h
│   └── c
│       └── defs.h
├── lib
│   ├── a
│   │   ├── a1.c
│   │   ├── a2.c
│   │   └── a3.c
│   ├── b
│   │   ├── b1.c
│   │   ├── b2.c
│   │   └── b3.c
│   └── c
│       ├── c1.c
│       ├── c2.c
│       ├── c3.c
│       └── defs.h
├── Makefile
└── tools
    └── main.c

我想将每个单独的lib目录编译成build / {a,b,c} .so

我的Makefile存根尝试执行此操作如下:

#Directories for object files and deps
BUILDDIR:=build/
DEPSDIR:=.deps/
LIBDIR=lib/
INCLUDEDIR=include/

#A list of the libraries, sort-hack to removes dups
LIBS=$(patsubst $(LIBDIR)%/,%, $(sort $(dir $(wildcard $(LIBDIR)*/))))
SHAREDLIBS=$(patsubst %, $(BUILDDIR)$(LIBDIR)%.so, $(LIBS))

.PHONY: all clean

#first target is should be all
all: $(SHAREDLIBS)

%.so: $(patsubst %.c,$(BUILDDIR)%.o, $(wildcard $(LIBDIR)$(patsubst $(BUILDDIR)$(LIBDIR)%.so,%,$@)/*.c))
    @echo $(patsubst %.c,$(BUILDDIR)%.o, $(wildcard $(LIBDIR)$(patsubst $(BUILDDIR)$(LIBDIR)%.so,%,$@)/*.c))
    @echo $@: $?

但是,最后一个%.so:目标似乎没有扩展先决条件。 基本上,我想扩展到该特定文件夹的目标文件,以编写后续规则来构建它们。

1 个答案:

答案 0 :(得分:1)

问题在于"%"在模式规则和patsubst中使用,请尝试以下更改,

SUBSTITUTE=$(patsubst %.c,$(BUILDDIR)%.o,$(wildcard $(LIBDIR)$(patsubst $(BUILDDIR)$(LIBDIR)%.so,%,$@)/*.c))

$(BUILDDIR)%.o: %.c
         @echo Compiling $@, $<

.SECONDEXPANSION:        
%.so: $$(SUBSTITUTE)
         @echo Building $@: $?

,%.o的规则只是一个占位符来定义它应该如何编译。