Хитрый "сделать" целевые требования - PullRequest
1 голос
/ 29 августа 2011

У меня есть ситуация, когда мне нужно скомпилировать некоторые исходные файлы из библиотеки в мою собственную программу.Каталоги, в которых находятся исходные файлы, не доступны для записи.Вместо этого у меня есть локальный каталог "build", где вся работа выполнена.

Проблема с переводом путей.Исходные файлы называются, скажем, xxxx.cpp и yyyy.cpp, и они находятся в /path/to/source/xxxx/xxxx.cpp и /path/to/source/yyyy/yyyy.cpp.

Используя $ (patsubst ...), я могу с радостью преобразовать эти пути в build/xxxx/xxxx.cpp и т. д., но я не могу заставить его убрать первую xxxx.

Я мог бы сделать с созданием цели, которая будет соответствовать чему-то вроде этого:

build/%.o: /path/to/source/%/%.cpp
        $(CXX) ...

...но я не могу заставить это работать вообще.Я думаю, что ему не нравится двойной подстановочный знак в последней части цели.

«Источник» для имен - это единственная переменная, содержащая только «xxxx» и «yyyy» в:

SYS_LIBS = xxxx yyyy

Есть какие-нибудь предложения о том, как заставить что-то подобное работать?

О, мне нужно, чтобы это было "универсальное" решение - это будет включенный make-файл во многих проектах, использующих эту библиотеку.файлов, поэтому создание цели вручную для каждого файла не вариант.Я не могу предсказать, какие файлы будут в библиотеке.

Ответы [ 2 ]

0 голосов
/ 29 августа 2011

Лично я бы использовал vpath, как предлагает Брюс. Если под /path/to/source/ много каталогов, вы можете использовать

SRCS = $(wildcard /path/to/source/*)
vpath %.cpp $(SRCS)

(Это работает, пока каталоги уходят оттуда всего на один уровень. Если есть такие вещи, как /path/to/source/foo/bar/zzzz/zzzz.cpp, вам придется прибегнуть к чему-то вроде find.)

Если вы действительно хотите выполнить перевод пути, это сделает это:

X := $(patsubst %.cpp,build/%.o,$(notdir $(X)))

Или (я не знаю, почему вы хотели бы сделать это таким образом, но вы могли бы):

X := $(shell echo $(X) | sed 's|.*/\(.*\)\.cpp|build/\1\.o|')
0 голосов
/ 29 августа 2011

Один простой способ - использовать vpath , чтобы позволить make найти сами файлы. Вы просто определяете

vpath %.cpp /path/to/source
vpath %.cpp /path/to/source2
vpath %.cpp /path/to/source3

build/%.o : %.cpp
   $(CXX)   

Вы можете определить более одного пути к источнику таким образом, но будьте осторожны, если у вас есть один и тот же файл в нескольких папках (например, a.cpp в обоих path_to_source1 и path_to_source2)

...