Makefile условно включает - PullRequest
       10

Makefile условно включает

12 голосов
/ 12 октября 2010

Я пытаюсь написать приложение, которое нуждается в заголовках ALSA или OSS. По сути, я хочу передать определение компилятору, если /etc/oss.conf не существует, так как это, вероятно, означает, что заголовок soundcard.h не существует (не стесняйтесь исправлять меня, я все еще новичок на работу с OSS). Согласно документации OSS, вы должны использовать директиву include следующим образом:

include /etc/oss.conf
CFLAGS := -I$(OSSLIBDIR)/include/sys

Одна проблема. Поддержка OSS является необязательной, поэтому я хотел бы проверить, существует ли заголовок, и если да, передать определение компилятору. Проблема в том, что в AFAIK нет способа проверить, существует ли файл вне make-файла rule . Внутри правила, если по какой-то причине я использую оператор if, попытка установить CFLAGS не изменит его:

test: $(objects)
    @if [ -f ${OSS_CONFIG} ]; then \
    . ${OSS_CONFIG}; \
    CFLAGS+=" -I${OSSLIBDIR} -DUSE_OSS"; \
    fi
    @echo ${CFLAGS}

(Вышеприведенное просто выводит исходное значение CFLAGS, даже если существует ${OSS_CONFIG}.) Это, конечно, крайне уродливо, и мне интересно, есть ли более чистый способ сделать это. Или то, как я это сделаю, приведет к всемирному катаклизму, связанному с геноцидом котят?

О, и, пожалуйста, не говорите мне использовать autoconf.

Ответы [ 2 ]

11 голосов
/ 12 октября 2010

Одно предложение: используйте -include (тогда он не предупредит + выйдет при неудаче). Хотя я не знаю, смогу ли я когда-нибудь использовать этот синтаксис самостоятельно.

Другим хаком может быть что-то вроде: DUMMY_VAR := $(shell ... ) для выполнения произвольного кода. Я думаю, что это даже менее вероятно сработает.

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

10 голосов
/ 12 октября 2010

Да, есть более чистый способ.Вы можете проверить наличие файла с помощью функции wildcard, а затем использовать ifeq / endif для установки соответствующего CFLAGS.Если вы вставите флаги, связанные со звуком, во что-то вроде AUDIO_CFLAGS, вы можете автоматически включить правильный набор флагов в Makefile.

Это будет выглядеть примерно так:

OSS_CONF_FILE := $(strip $(wildcard /etc/oss.conf))

ifeq ($OSS_CONF_FILE,)
    AUDIO_CFLAGS = "-I$(ALSALIBDIR) -DUSE_ALSA"
else 
    AUDIO_CFLAGS = "-I${OSSLIBDIR} -DUSE_OSS"
endif


sample_build_rule:
    $(CC) $(CFLAGS) $(AUDIO_CFLAGS) ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...