Краткий Makefile - PullRequest
       8

Краткий Makefile

5 голосов
/ 16 марта 2011

Я делаю некоторый рефакторинг Makefile и пытаюсь найти наиболее лаконичный способ реализации Makefile, который выполняет следующее:

  1. Имеет одну переменную, в которой перечислены все исходные файлы (может быть какФайлы C и C ++)
  2. Все объектные файлы создаются в OBJ_DIR
  3. Каталог объектов создается, если он не существует

Вот что у меня так далеко:

...

OBJ_DIR = obj/
BIN_DIR = bin/
PROGRAM = program

SRCS = test1.cpp test2.c

OBJS  = $(addprefix $(OBJ_DIR), \
        $(patsubst %.cpp, %.o,  \
        $(patsubst %.c, %.o, $(SRCS))))

$(BIN_DIR)$(PROGRAM) : $(OBJS)
    $(CREATE_OUT_DIR)
    $(LINK)

$(OBJ_DIR)%.o : %.c
    $(CREATE_OBJ_DIR)
    $(CCOMPILE)

$(OBJ_DIR)%.o : %.cpp
    $(CREATE_OBJ_DIR)
    $(CPPCOMPILE)

...

Я бы хотел исключить вызов $ (CREATE_OBJ_DIR) для каждой компиляции .o.Кто-нибудь знает, как это сделать?Я попытался добавить это, но тогда он не будет создавать объектные файлы:

$(OBJS): | $(OBJ_DIR)

$(OBJ_DIR):
    $(CREATE_OBJ_DIR)

Ответы [ 3 ]

3 голосов
/ 16 марта 2011

Кажется, вы уже решили свой первый пункт: объедините их все в одну переменную (я не думаю, что вам на самом деле нужно разделять их на TEMP1 и TEMP2, как у вас, просто есть разные правила сборки)

Во втором пункте вы можете указать компилятору, куда выводить объектные файлы (для g ++ это выглядит так:

g++ -c MySourceFile.cpp -o obj/MySourceFile.o

Правило make для этого будет выглядеть так:

obj/%.o: %.cpp
    g++ -c $*.cpp -o obj/$*.o

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

obj:
    mkdir obj

Редактировать: или после примеров кода:

$(BIN_DIR)$(PROGRAM) : $(BIN_DIR) $(OBJS) 
$(LINK)

$(BIN_DIR):
    $(CREATE_OUT_DIR) 
1 голос
/ 16 марта 2011

Что касается вашего третьего пункта: Этот вопрос задавался здесь раньше . К сожалению, нет действительно хорошего ответа для этого, и вам нужно найти наименее уродливый взломать из ответа. Лично я голосую за маркерное решение для файла.

0 голосов
/ 16 марта 2011

Вот что я делаю:

$(OBJ_LOC)/%.o: $(SRC_LOC)/%.c
    @[ -d $(OBJ_LOC) ] || mkdir -p $(OBJ_LOC)
    g++ ...

Но я смотрю на эти ответы с большим интересом.

...