gpt4 book ai didi

生成文件: Build in a separate directory tree

转载 作者:行者123 更新时间:2023-12-03 06:29:15 25 4
gpt4 key购买 nike

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

libraries tree

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

std/io/network/tcp.cc

他使用

运行 mkdir 命令
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)

我有两个问题:

1 - 问题是 make 命令,我真的不知道为什么,不会检查文件是否被修改并在所有文件上启动构建过程,无论如何,所以如果我只需要构建一个文件,我必须将它们全部构建或使用命令:

make path/to/single/file.so

有什么办法可以解决这个问题吗?

2 - 有什么方法可以以“更干净”的方式执行此操作,而无需分发所有带有源代码的构建目录?

谢谢

最佳答案

对于1),问题是规则的目标(stdlib/something.so)并不完全是规则所创建的(build/something.so),因此Make始终认为它必须创建目标。这应该可以解决这个问题(我正在使用 GNUMake):

STDOBJ=$(patsubst stdlib%.cc,build%.so, $(STDSRC))

all: stdlib

stdlib: $(STDOBJ)

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

对于2)我不确定你的意思。如果您想要您描述的构建目录结构,这就可以了。

关于生成文件: Build in a separate directory tree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2640899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com