Фильтр Makefile просто… не работает?

#c #makefile #linker

Вопрос:

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

В данный момент я пытаюсь настроить тестовую платформу вокруг своего кода, чтобы как можно меньше повлиять на фактическую базу кода (сейчас я рассматриваю несколько других платформ и хочу сделать переключение как можно более безболезненным). Подход, который я использую в настоящее время, заключается в том, чтобы связать все объектные файлы моего проекта вместе с моим тестирующим кодом, чтобы мне не пришлось обращаться к #include исходным файлам или использовать какой-либо другой хак.

Этот подход создает проблему с main функцией по очевидным причинам; мой текущий план состоит в том, чтобы просто не связывать объектный файл из моего проекта, который определяет main . Это помешало бы мне протестировать его, но это действительно просто, и любые проблемы будут действительно очевидны, так что меня это устраивает. (Я бы сказал , что этот подход превосходит альтернативу завинчивания таблицы символов main.o , которая является единственной альтернативой, которую я могу придумать на данный момент.)

Проблема до сих пор заключается в том, что я, похоже, не могу make отфильтровать main.o список объектных файлов, которые я связываю вместе, см. Ниже.


Обещанная демонстрация того, о чем я говорю:

 MAIN_PROG_OBJ_DIR ::= build/test/release/main-prog-obj
# In the actual Makefile, this is generated as usual
MAIN_PROG_OBJS ::= build/test/release/main-prog-obj/state.o build/test/release/main-prog-obj/main.o build/test/release/main-prog-obj/util.o build/test/release/main-prog-obj/process_args.o

MAIN_O ::= $(MAIN_PROG_OBJ_DIR)"/main.o"
OBJS_FOR_BUILD ::= $(filter-out $(MAIN_O),$(MAIN_PROG_OBJS))

.PHONY: test
test:
        @echo should be removed [$(MAIN_O)]
        @echo OBJS_FOR_BUILD [$(OBJS_FOR_BUILD)]
 

в моей системе запуск этого с make -f testmk test выходом:

 should be removed [build/test/release/main-prog-obj/main.o]
OBJS_FOR_BUILD [build/test/release/main-prog-obj/state.o build/test/release/main-prog-obj/main.o build/test/release/main-prog-obj/util.o build/test/release/main-prog-obj/process_args.o]
 

Очевидно, я неправильно понимаю, что $(filter-out делает/каков его синтаксис, так как же мне выполнить то, что я пытаюсь сделать?

Спасибо!

Комментарии:

1. "main.o" —> main.o ?

2. MAIN_O имеет значение $(MAIN_PROG_OBJ_DIR)"/main.o" , которое не совпадает build/test/release/main-prog-obj/main.o , поскольку первое содержит кавычки (которые оболочка удаляет при разборе echo команды, но которые остаются при обработке make ).

3. Ах, да, вот оно что. Спасибо всем, lmao

4. Если кто-либо из вас заботится о репутации из ответа, не стесняйтесь отвечать, и я сделаю так, чтобы это было решено/озвучено. Поскольку вы прокомментировали в течение 5 секунд друг от друга, я просто отмечу то, что будет первым в качестве ответа

Ответ №1:

Это была проблема с цитированием, make она интерпретировалась "main.o" буквально и поэтому не отфильтровывалась main.o из списка. Путаница возникла из-за того, что , когда я отвечал эхом "main.o" , оболочка проанализировала кавычки и просто перешла main.o к встроенному эху.

Комментарии:

1. При отладке make файлов всегда, всегда используйте $(info sometext $(somevar)) , чтобы быть в безопасности от нежелательного уровня интерпретации.