Makefile:在单独的目录树中构建

Makefile:在单独的目录树中构建,makefile,Makefile,我的项目(一种解释性语言)有一个由多个文件组成的标准库,每个文件都将构建到一个.so动态库中,解释器将根据用户请求(使用导入指令)加载该库。 每个源文件都位于表示其“命名空间”的子目录中,例如: 构建过程必须创建一个“build”目录,然后在编译每个文件时,必须在“build”目录中创建其名称空间目录,例如,在编译时 std/io/network/tcp.cc 他使用 mkdir -p build/std/io/network Makefile代码段是: STDSRC=stdlib/st

我的项目(一种解释性语言)有一个由多个文件组成的标准库,每个文件都将构建到一个.so动态库中,解释器将根据用户请求(使用导入指令)加载该库。 每个源文件都位于表示其“命名空间”的子目录中,例如:

构建过程必须创建一个“build”目录,然后在编译每个文件时,必须在“build”目录中创建其名称空间目录,例如,在编译时

std/io/network/tcp.cc
他使用

mkdir -p build/std/io/network
Makefile代码段是:

STDSRC=stdlib/std/hashing/md5.cc \
       stdlib/std/hashing/crc32.cc \
       stdlib/std/hashing/sha1.cc \
       stdlib/std/hashing/sha2.cc \
       stdlib/std/io/network/http.cc \
       stdlib/std/io/network/tcp.cc \
       stdlib/std/io/network/smtp.cc \
       stdlib/std/io/file.cc \
       stdlib/std/io/console.cc \
       stdlib/std/io/xml.cc \
       stdlib/std/type/reflection.cc \
       stdlib/std/type/string.cc \
       stdlib/std/type/matrix.cc \
       stdlib/std/type/array.cc \
       stdlib/std/type/map.cc \
       stdlib/std/type/type.cc \
       stdlib/std/type/binary.cc \
       stdlib/std/encoding.cc \
       stdlib/std/os/dll.cc \
       stdlib/std/os/time.cc \
       stdlib/std/os/threads.cc \
       stdlib/std/os/process.cc \
       stdlib/std/pcre.cc \
       stdlib/std/math.cc

STDOBJ=$(STDSRC:.cc=.so)

all: stdlib

stdlib: $(STDOBJ)

.cc.so: 
    mkdir -p `dirname $< | sed -e 's/stdlib/stdlib\/build/'`
    $(CXX) $< -o `dirname $< | sed -e 's/stdlib/stdlib\/build/'`/`basename $< .cc`.so $(CFLAGS) $(LDFLAGS)
有什么办法解决这个问题吗

2-是否有任何方法可以以“更干净”的方式完成此操作,而不必分发所有包含源代码的构建目录

感谢1)问题在于规则的目标(stdlib/something.so)与规则所制定的目标(build/something.so)不完全相同,因此Make总是认为它必须制定目标。这应该可以修复它(我正在使用GNUMake):

STDOBJ=$(patsubst stdlib%.cc,build%.so,$(STDSRC))
全部:stdlib
stdlib:$(STDOBJ)
build/%.so:stdlib/%.cc
mkdir-p$(dir$@)
$(CXX)$<-o$@$(CFLAGS)$(LDFLAGS)
因为我不知道你的意思。如果您想要您描述的构建目录结构,这就可以了

make path/to/single/file.so
STDOBJ=$(patsubst stdlib%.cc,build%.so, $(STDSRC))

all: stdlib

stdlib: $(STDOBJ)

build/%.so: stdlib/%.cc
    mkdir -p $(dir $@)
    $(CXX) $< -o $@ $(CFLAGS) $(LDFLAGS)