IIRC расширение происходит до фактического выполнения правила, поэтому $<
, вероятно, расширен до пустого. Т.е. make-файл анализирует if / else перед запуском правила.
Затем, когда правило запускается, оно «предварительно выбрало» остальную часть, поскольку при принятии решения $<
не было тем, что есть во время правила.
То, что выможно использовать сценарий оболочки (я предполагаю, что bash), что-то вроде:
%.o: src/%.cpp
if [[ "$<" == "src/$(libname).cpp" ]] ; then \
g++ -fpic -c $(libname).cpp -o $(libname).o ; \
g++ -shared -Wl,-soname,$(libname).so.1 -o $(libname).so.1.0.1 $(libname).o -lc ; \
else \
g++ -c $< -o $@ $(if $(findstring importlib, $<), $(importlib_flags)) ; \
fi
Примечание переменные bash / shell записываются как $${shell_var}
, а переменные make-файла $(make_var)
-только если они вам нужны!
Также обратите внимание, что если вы хотите специально использовать BASH, добавьте это в начало вашего make-файла:
SHELL:=/bin/bash