В прошлом я обрабатывал подобные случаи, делая что-то вроде следующего. В этом подходе предполагается, что необработанный исходный код можно отличить с помощью некоторой схемы именования, в данном случае добавляя базовое имя к _pp
.
# These are your source files to be preprocessed
SRC_RAW = mysrc_pp.cpp
# These are the source files after preprocessing
SRC_PP = $(patsubst %_pp.cpp, %.cpp, $(SRC_RAW))
ALL_SRC = $(SRC) main.cpp other.cpp
OBJ = $(patsubst %.cpp, %.o, $(ALL_SRC))
$(SRC): %.cpp: %_pp.cpp
$(PERL) $< > $@
$(OBJ): %.o: %.cpp
$(CXX) ...
Однако это не относится к случаю, когда выесть заголовочные файлы, которые требуют предварительной обработки. В этом случае вам понадобятся аналогичные правила для их создания.