.
├── 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:
目标似乎没有扩展先决条件。
基本上,我想扩展到该特定文件夹的目标文件,以编写后续规则来构建它们。
答案 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的规则只是一个占位符来定义它应该如何编译。