I'm working on a Makefile which takes a command line parameter, runs a translation (tr
) on it, then uses that variable to create a directory and also prints the result. When the variable is printed, it is as I expect (the translated name), however when the variable is used to create the directory, the results are incorrect.
So for example, when I run:
make build=debug
I see:
Building...
***************************
BuilD Type: Debug
Build Target: x86
But the resultant file system is:
out/
└─── debug | tr d D_x86
I thought that running the translation on the input variable build
and assigning it to $BUILD_TYPE
would have set this new variable to "Debug"
but it seems like that is not the case all the time... How does this actually work?
Full Makefile:
BUILD_TYPE=Release
BUILD_TARGET=Arm
OUTPUT_DIR=out
MKDIR_P = mkdir -p
ifeq ($(build),debug)
BUILD_TYPE='$(build) | tr d D'
endif
ifeq ($(target),x86)
BUILD_TARGET=$(target)
endif
TT=$(BUILD_TYPE)_$(BUILD_TARGET)
all: directories
@echo 'Building...'
@echo '***************************'
@echo 'Build Type: $(BUILD_TYPE)'
@echo 'Build Target: $(BUILD_TARGET)'
@echo 'Output Directory: $(PWD)/$(OUTPUT_DIR)'
@echo '***************************'
directories:
${MKDIR_P} $(OUTPUT_DIR)
${MKDIR_P} $(OUTPUT_DIR)/$(TT)
This line:
is not running a shell command. That is a literal string assignment.
You are assigning to the variable
BUILD_TYPE
the literal string'debug | tr d D'
.To do what you want you need to actually run a shell command. Something like this for example.
As to why you are seeing things "correctly" on the output line that's because you happen to be generating a valid shell pipeline there and make is running it.
That is this line
becomes
which, you'll notice, is a valid shell line. Also notice that you get
BuilD type
and notBuild type
printed out?