Как добавить «или» в pathsubst в Makefile

0

У меня есть микшеры c и c++ исходных файлов. Я пытаюсь объединить их в.o, необходимые для целевого каталога.

SOURCES: = SOURCES=src/test.c src/cpptest.cpp src/directfb_test.cpp src/foo.c

То, что я пробовал:

OBJECTS=$(SOURCES:src/%.c=$(OBJDIR)/%.o)
OBJECTS+=$(SOURCES:src/%.cpp=$(OBJDIR)/%.o)

и это также

OBJECTS := $(patsubst %.cpp, %.o, $(addprefix $(OBJDIR)/, $(notdir $(SOURCES))))
OBJECTS += $(patsubst %.c, %.o, $(addprefix $(OBJDIR)/, $(notdir $(SOURCES))))

Оба, похоже, не работают.

Я получаю оба.o, а также.c и.cpps в ОБЪЕКТАХ. Есть ли способ добавить OR в patsubst?

Решение:

   OBJECTS := $(patsubst %.cpp, %.o,$(addprefix $(OBJDIR)/,$(filter %.cpp  ,$(notdir $(SOURCES)) )) )
   OBJECTS += $(patsubst %.c, %.o,$(addprefix $(OBJDIR)/,$(filter %.c ,$(notdir $(SOURCES)) )) )

Добавлен фильтр для%.c и%.cpp. Думаю, будут другие способы. Я собираюсь с этим.

Теги:
makefile

2 ответа

1
Лучший ответ

Вероятно, самым быстрым для процесса и простым пониманием является

OBJECTS := $(patsubst %c, $(OBJDIR)/%o, $(patsubst %pp, %, $(notdir $(SOURCES))))
  • 0
    Я думаю, мой подход самый безопасный. что произойдет, если в каталоге src есть несколько файлов .h? В этом случае ваш подход может потерпеть неудачу.
  • 0
    @ Knight71: Как ты понимаешь? Я не понимаю, почему это - не совсем чистое, как есть, но в любом случае - не будет работать для файлов .h в исходном каталоге. Если, конечно, вы не перечислили бы их в SOURCES , что было бы несколько ... эм ... глючно?
Показать ещё 2 комментария
1

Другой способ:

OBJECTS := $(patsubst src/%.cpp, $(OBJDIR)/%.o,$(SOURCES))
OBJECTS := $(patsubst src/%.c, $(OBJDIR)/%.o, $(OBJECTS))

Если вы хотите знать, что неправильно с первыми подходами в вопросе, просто поставьте $(info $(OBJECTS)) между $(info $(OBJECTS)) двумя командами, и это будет довольно ясно.

  • 0
    Ну, я предполагаю, что он использует "notdir" по причине, что не все источники могут быть в "src" dir.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню