Makefile - две разные цели - PullRequest
       2

Makefile - две разные цели

1 голос
/ 31 августа 2011

Я делаю Makefile для приложения, который может быть собран двумя разными способами. Один (мы можем назвать это базовым выходом), есть выход с именем a.out1. Второй вывод делается путем явной передачи аргумента в make - например, `make a.out2 'и включает некоторые функции, которые препроцессор включает в источниках. Таким образом, объектные файлы отличаются от объектных файлов из a.out1. Есть ли возможность указать в Makefile при сборке a.out2, чтобы явно сказать, что если a.out1 уже собран, очистить его с помощью объектных файлов и собрать a.out1 (и зависимые объекты)? (и конечно же наоборот) спасибо

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Если вы не против иметь отдельные объектные файлы (например, objA1.o и objA2.o), то вот способ сделать это:

OBJECTS = objA objB objC

OBJ1 = $(addsuffix 1.o,$(OBJECTS))
OBJ2 = $(addsuffix 2.o,$(OBJECTS))

a.out1: $(OBJ1)
    link $^ together one way

a.out2: $(OBJ2)
    link $^ together another way

obj%1.o: %.cc
    build $@ from $< by rule 1

obj%2.o: %.cc
    build $@ from $< by rule 2

Если двум исполняемым файлам (a.out и a.out2) нужны разные объектные файлы, вы можете сделать это:

COMMON_OBJECTS = objA objB objC

OBJ1 := $(addsuffix 1.o,$(COMMON_OBJECTS))
OBJ2 := $(addsuffix 2.o,$(COMMON_OBJECTS))

OBJ1 += objD
OBJ2 += objE objF

Если разница между двумя командами сборки (для создания объектов двумя разными способами) является чем-то простым, например, изменение аргумента компилятора, вы можете сделать последние два правила немного проще:

obj%1.o: CC_FLAGS += $(FLAGS_FOR_ONE)
obj%2.o: CC_FLAGS += $(FLAGS_FOR_TWO)

obj%1.o obj%2.o: %.cc
    build $@ from $< using $(CC_FLAGS)

Аналогично, если команда компоновки одинакова, за исключением аргумента компоновщика (или точно такой же):

a.out1: $(OBJ1)
a.out1: LINKER_FLAGS += $(L_FLAGS_FOR_ONE)

a.out2: $(OBJ2)
a.out1: LINKER_FLAGS += $(L_FLAGS_FOR_TWO)

a.out1 a.out2: $(OBJ1)
    link $^ together using $(LINKER_FLAGS)
0 голосов
/ 31 августа 2011

Как насчет этого?

a.out2: clear1
    #other commands

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