Моему проекту (интерпретируемый язык) составили стандартную библиотеку несколько файлов, каждый из них будет встроен в .so динамическую библиотеку, которую интерпретатор загрузит по пользовательскому запросу (с директивой импорта). Каждый исходный файл расположен в подкаталог, представляющий его "пространство имен", например:
Процесс сборки должен создать каталог "сборки", затем когда каждый файл компилирует, должен создать его каталог пространства имен в "сборке" один, например, при компиляции
std/io/network/tcp.cc
он выполняет команду mkdir с
mkdir -p build/std/io/network
Отрывок Make-файла:
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 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) Я не уверен, что вы имеете в виду. Если вам нужна описываемая вами структура каталогов сборки, это сработает.