Я создал следующий небольшой фрагмент make-файла. Примечание: Я сделал это минимальным примером моей проблемы, так что это бессмысленный make-файл.
TARGET = none
OBJ_BASE_DIR = obj
# Linux x86 c++ compiler
.PHONY: build_cpp_x86Linux
build_cpp_x86Linux: TARGET = x86Linux
build_cpp_x86Linux: build
OBJ_DIR = $(addsuffix /$(TARGET),$(OBJ_BASE_DIR))
$(info TARGET IS: $(TARGET))
$(info OBJ_DIR IS: $(OBJ_DIR))
build: $(OBJ_DIR)/test.o
@echo building, OBJ_DIR: $(OBJ_DIR)
# pattern rule
$(OBJ_DIR)/%.o:
@echo "compiling $@"
Вот результат вызова make
:
TARGET IS: none
OBJ_DIR IS: obj/none
compiling obj/none/test.o
building, OBJ_DIR: obj/x86Linux
Из вывода видно, что он пытается скомпилировать obj/none/test.o
, но я хочу, чтобы он попытался скомпилировать obj/x86Linux/test.o
. Я не совсем уверен, что здесь происходит. Я думаю, я понимаю, что make-файл расширяет переменные при первом проходе (что приведет к TARGET = none), но я подумал, что он снова расширит переменные, как только я вызову target build_cpp_x86Linux
, который устанавливает значение TARGET для x86Linux ...
Что я здесь не так делаю и как это сделать?