Make-файл: Сборка в отдельном дереве каталогов

Моему проекту (интерпретируемый язык) составили стандартную библиотеку несколько файлов, каждый из них будет встроен в .so динамическую библиотеку, которую интерпретатор загрузит по пользовательскому запросу (с директивой импорта). Каждый исходный файл расположен в подкаталог, представляющий его "пространство имен", например:

libraries tree

Процесс сборки должен создать каталог "сборки", затем когда каждый файл компилирует, должен создать его каталог пространства имен в "сборке" один, например, при компиляции

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 - Какой-либо способ сделать это "более чистым" способом без должно распределить все каталоги сборки с источниками?

Спасибо

6
задан Glorfindel 23 July 2019 в 01:24
поделиться

1 ответ

Для 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) Я не уверен, что вы имеете в виду. Если вам нужна описываемая вами структура каталогов сборки, это сработает.

12
ответ дан 9 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: