Как мне поставить условные обозначения в правилах шаблонов makefile? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть файл для make-файла, который имеет следующие правила:

$(OUT_DIR)/%.0: %.c
    $(CC) $(CFLAGS) -c -o $@ $<
    $(CC) $(CFLAGS) -E -P $< -o $(OUT_DIR)/$<.preproc
    $(CC) $(CFLAGS) -E -dD $< -o $(OUT_DIR)/$<.macros

Прекрасно работает.Но для некоторых целей мне нужно только следующее:

$(OUT_DIR)/%.0: %.c
    $(CC) $(CFLAGS) -c -o $@ $<

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

$(OUT_DIR)/%.0: %.c
    $(CC) $(CFLAGS) -c -o $@ $<
    ifeq ($(CIFLAG), 1)
        $(CC) $(CFLAGS) -E -P $< -o $(OUT_DIR)/$<.preproc
        $(CC) $(CFLAGS) -E -dD $< -o $(OUT_DIR)/$<.macros
    endif

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

Есть идеи?

Спасибо!

Я сделал так, как предложил MadScientist (спасибо за образование), но не получил то, что хотел.Мой файл теперь выглядит как:

$(OUT_DIR)/%.0: %.c
    $(CC) $(CFLAGS) -c -o $@ $<
    [ $(CI_BUILD) -eq 0 ] \
        || {$(CC) $(CFLAGS) -E -P $< -o $(OUT_DIR)/$<.preproc \
        && $(CC) $(CFLAGS) -E -dD $< -o $(OUT_DIR)/$<.macros; }

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

cc -c -o test.o
[ 1 -eq 0 ] \
     || {cc -E -P test.c -o test.c.preproc \
     && cc -E -dD test.c -o test.c.macros; }

/bin/sh: -c: line 2: syntax error near unexpected token '}'

Является ли ';'проблема?

Ответы [ 3 ]

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

Я смог заставить его работать, изменив код на:

$(OUT_DIR)/%.0: %.c
    $(CC) $(CFLAGS) -c -o $@ $<
    if [ ($(CIFLAG) -ne 1 ]; then \
      $(CC) $(CFLAGS) -E -P $< -o $(OUT_DIR)/$<.preproc; \
      $(CC) $(CFLAGS) -E -dD $< -o $(OUT_DIR)/$<.macros; fi
0 голосов
/ 12 октября 2018

Вы не должны делать отступ для условного обозначения Make с вкладками:

$(OUT_DIR)/%.0: %.c
    $(CC) $(CFLAGS) -c -o $@ $<
ifeq ($(CIFLAG), 1)
    $(CC) $(CFLAGS) -E -P $< -o $(OUT_DIR)/$<.preproc
    $(CC) $(CFLAGS) -E -dD $< -o $(OUT_DIR)/$<.macros
endif

См. Пункт 4: https://www.gnu.org/software/make/manual/html_node/Recipe-Syntax.html

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

Вы не можете использовать условные выражения типа ifeq в рецепте, передаваемом в оболочку, потому что оболочка запускает рецепт, а не make.Вы можете использовать условные выражения оболочки:

$(OUT_DIR)/%.0: %.c
        $(CC) $(CFLAGS) -c -o $@ $<
        [ ($(CIFLAG) -ne 1 ] \
          || { $(CC) $(CFLAGS) -E -P $< -o $(OUT_DIR)/$<.preproc \
               && $(CC) $(CFLAGS) -E -dD $< -o $(OUT_DIR)/$<.macros; }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...