Makefile два выпуска компиляторов - PullRequest
1 голос
/ 09 мая 2011

Меня просят написать Makefile, который должен выбирать между двумя компиляторами, и каждый из этих компиляторов должен поддерживать 3 версии сборки (отладка, выпуск, тестирование).

Существует множество переменных, которые меняются в зависимости от ввода (компилятор, параметры компилятора, каталог вывода, каталоги включения и т. Д.). Моим первым вариантом было пройти через переменные, специфичные для цели, и настроить переменные в соответствии с целью. Как вы думаете, это хорошая идея?

Я не очень знаком с такими переменными. Мне кажется, что если я сделаю что-то вроде этого:

release: variable1=value1   #release is target
release: variable2=value2

release: 
      # some compilation rule

Будет настроено только variable1. Я прав насчет этого?


Обновление

Спасибо за ваш ответ. Я пытаюсь решить проблему выбора компилятора с помощью дополнительной переменной, которая будет настроена в соответствии с целью. Но здесь есть проблема. У меня есть следующие строки:

release: CFLAGS = -DCORE_SW_VERSION='"$(CORE_SW_VERSION)"' -Wall 
release: CFLAGS += -fgnu89-inline -mno-volatile-cache $(INCLUDE)  
release: TARGET=release

После этих строк я делаю некоторую последовательность ifeq, в которой я решаю, какой компилятор использовать (в соответствии со значением переменной TARGET). И CFLAGS настроен правильно, но переменная TARGET пуста. Это приводит меня к выводу, что вы можете настроить только одну целевую переменную. Я прав? Если нет, я не знаю, что я делаю неправильно. Не могли бы вы помочь мне?

1 Ответ

1 голос
/ 10 мая 2011

Переменные, специфичные для цели, определяются только при создании этой цели и любых предпосылок этой цели. Вы не можете использовать переменные, специфичные для цели, произвольно по всему make-файлу (как кажется, вы пытаетесь это сделать с ifeq). Для этого вы можете посмотреть на $(MAKECMDGOALS). Я не верю, что существует какое-либо ограничение на количество переменных, специфичных для цели, и уж точно не ограничение в один.

Необходимость либо целевых переменных, либо $(MAKECMDGOALS) может быть предупреждением о том, что вы пытаетесь заставить насильно сделать что-то, для чего он не предназначен.

Мне не ясно, хотите ли вы создать три версии (отладка / тестирование / выпуск с одним компилятором для каждой) или шесть версий. Предполагая три, вот unix-y Makefile для сборки с разными компиляторами и CFLAGS в зависимости от цели. Тем не менее, обратите внимание, что это также легко можно кодировать с помощью RELEASE_CFLAGS, RELEASE_CC, DEBUG_CFLAGS и т. Д. Переменных.

all: release debug test

release: CC=gcc
release: CFLAGS=
debug: CC=gcc
debug: CFLAGS=-g
test: CC=cc
test: CFLAGS=-Wall

.PHONY: release debug test
release: release/exe
debug: debug/exe
test: test/exe

OBJECTS := test.o

release/%.o: %.c
        $(CC) $(CLFAGS) -c -o $@ $<

debug/%.o: %.c
        $(CC) $(CLFAGS) -c -o $@ $<

test/%.o: %.c
        $(CC) $(CLFAGS) -c -o $@ $<

release/exe: $(OBJECTS:%=release/%)
        $(CC) $(CFLAGS) -o $@ $^

debug/exe: $(OBJECTS:%=debug/%)
        $(CC) $(CFLAGS) -o $@ $^

test/exe: $(OBJECTS:%=test/%)
        $(CC) $(CFLAGS) -o $@ $^
...