Использование имени файла для получения предварительных условий gnu make

#c #linux #makefile #gnu

#c #linux #makefile #гну

Вопрос:

Основываясь на имени общей библиотеки, я хотел бы автоматически определить, какие SRC включить в рецепт создания.

 SHARED_LIBS  := libc.so 
                libd.so

libc.so,SRCS  := a.o 
                 b.o
libc.so,DEPS  := -lc

libd.so,SRCS  := e.o 
                 f.o
libd.so,DEPS  := -lc


all: $(SHARED_LIBS)
.PHONY: all

%.o: %.c
    $(CC) -c $^ -o $@ 

%.so: $($*.so,SRCS)
    $(CC) $(CFLAGS) $(SFLAGS) -o $@ $^ $($*,DEPS)
 

Комментарии:

1. Не могли бы вы, пожалуйста, выразиться немного конкретнее? Как этот makefile связан с вопросом? Каков предполагаемый результат этого makefile?

2. Похоже, вы имеете в виду конкретное соглашение об именовании библиотек; если вы расскажете нам, что это такое, возможно, мы сможем вам что-то посоветовать.

3. В основном там, где вы видите%.так что в настоящее время мне нужно использовать $ (libc.so , SRCS) или $ (libd.so , SRCS), но я бы хотел, чтобы он автоматически захватывал те, которые основаны на имени общей библиотеки.

Ответ №1:

То, что у вас есть, ПОЧТИ работает: DEPS будет работать (если вы используете правильное имя).

Просто для ясности я переименовываю библиотеку, потому что вам определенно не следует создавать библиотеку с именем libc .

Если вы можете отказаться от идеи, что список объектов должен быть в переменной, и вместо этого объявлять их напрямую, вы можете довольно легко делать то, что хотите:

 SHARED_LIBS  := libfoo.so

all: $(SHARED_LIBS)
.PHONY: all

libfoo.so: a.o 
           b.o

libfoo,DEPS := -lc

%.o: %.c
        $(CC) -c $^ -o $@ 

%.so:
        $(CC) $(CFLAGS) $(SFLAGS) -o $@ $^ $($*,DEPS)
 

должен это сделать. Конечно, вам не нужно явно добавлять -lc в свою строку ссылки, и вам, вероятно, не следует этого делать. Но, по-видимому, у вас есть другие библиотеки, которые вы хотите добавить.

Если вы действительно хотите, чтобы объекты также хранились в переменной, тогда вам нужно сделать что-то более необычное.

Комментарии:

1. Похоже, это не работает. Я вижу сгенерированные файлы .o, но не вижу libfoo.so сгенерированный.

2. Потребовалось одно незначительное изменение (переместить all цель), но оно все равно будет собираться libfoo.so . Извините, но если вы используете приведенный выше makefile и запустите make , то поведение, о котором вы сообщаете ( libfoo.so не генерируется), не может произойти, поэтому в вашей среде должен быть какой-то другой аспект, который вы здесь не описали. Вы можете попробовать запустить make -d и изучить (объемный) вывод, чтобы определить, как make решает обработать libfoo.so цель.

3. Я знаю, что вопрос включал %.o: %.c правило, но это на самом деле не нужно, не так ли?

4. Это не требуется, если встроенного правила достаточно для их целей, нет.