LINUX.ORG.RU

Вопрос по шаблонам make


0

0

Доброго времени суток!

Есть такой Makefile:

c_src_dir = src_c
libstemmer_algorithms = english russian
all_algorithms = $(libstemmer_algorithms)

SNOWBALL_ROOT_DIR = ../snowball
SNOWBALL_SRC_DIR = $(SNOWBALL_ROOT_DIR)/snowball

RUNTIME_DIR = $(SNOWBALL_SRC_DIR)/runtime

C_LIB_SOURCES = $(all_algorithms:%=$(c_src_dir)/stem_Unicode_%.c)
C_LIB_HEADERS = $(all_algorithms:%=$(c_src_dir)/stem_Unicode_%.h)
C_LIB_OBJECTS = $(C_LIB_SOURCES:.c=.o)

all: $(C_LIB_SOURCES) $(C_LIB_HEADERS)

$(c_src_dir)/stem_Unicode_%.c $(c_src_dir)/stem_Unicode_%.h: $(SNOWBALL_SRC_DIR)/algorithms/%/stem_Unicode.sbl snowball
    @mkdir -p $(c_src_dir)
    @l=`echo "$<" | sed 's!\(.*\)/stem_Unicode.sbl$$!\1!;s!^.*/!!'`; \
    o="$(c_src_dir)/stem_Unicode_$${l}"; \
    echo "./snowball $< -o $${o} -eprefix $${l}_Unicode_ -r $(RUNTIME_DIR) -w"; \
    ./snowball $< -o $${o} -eprefix $${l}_Unicode_ -r $(RUNTIME_DIR) -w

при попытке собрать make выдает ошибку:
make: *** No rule to make target `src_c/stem_Unicode_english.c', needed by `all'.  Stop.

В чем ошибка?
anonymous

Мейк хочет файл src_c/stem_Unicode_english.c, но файл отсутствует, и мейк не может найти правило для создания этого файла.

mv ★★★★★
()
Ответ на: комментарий от mv

Английский я разумею, спасибо.

Правило создания этого файла - последнее в приведенном примере. Оно записано в виде шаблона. И мне интересно, почему это не работает.

Вот пример из какого-то руководства:

%_dbg.o: %.c $(CC) -c -g -o $@ $<

DEBUG_OBJECTS = main_dbg.o edit_dbg.o

edimh_dbg: $(DEBUG_OBJECTS) $(CC) -o $@ $(DEBUG_OBJECTS)

Пример работает. Чем мой шаблон принципиально отличается от шаблона из примера?

anonymous
()
Ответ на: комментарий от anonymous

Пардон, вот правильное форматирование:

%_dbg.o: %.c
        $(CC) -c -g -o $@ $<

DEBUG_OBJECTS = main_dbg.o edit_dbg.o

edimh_dbg: $(DEBUG_OBJECTS)
        $(CC) -o $@ $(DEBUG_OBJECTS)

all: edimh_dbg

anonymous
()
Ответ на: комментарий от anonymous

А правила для .c и .h по раздельности указывать не пробовали?

mv ★★★★★
()

> В чем ошибка?

Скорее всего не найдены файлы $(SNOWBALL_SRC_DIR)/algorithms/%/stem_Unicode.sbl или snowball.

execve
()
Ответ на: комментарий от execve

Да, точно. Существование исходных *.sbl я проверил для russian, а для english - забыл. Если добавить правило для генерации нужных *.sbl, то все работает.

Спасибо!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.