'String manipulation in makefiles

I've replaced my many .sh files from my previous question with a makefile, of sorts. I don't know much about makefiles, admittedly, but this seems to work:

MainPackage=jnitest
Main=SimpleJNITest
cFileName=rtm_simple

targetDir=classes
libDir=lib
srcDir=src

jdkDir="/home/user/local/java/jdk1.7.0_65"
java="$(jdkDir)/bin/java"
javah="$(jdkDir)/bin/javah"
javac="$(jdkDir)/bin/javac"

JAVAC_FLAGS=-d "$(targetDir)" -sourcepath "$(srcDir)" -cp "$(targetDir):$(libDir)/*"
JAVAH_FLAGS=-d "$(ccodeDir)" -cp "$(targetDir)" -jni
JAVA_FLAGS=-Djava.library.path="$(LD_LIBRARY_PATH):$(libDir)" -cp "$(targetDir):$(libDir)/*"

ccodeDir=$(srcDir)/ccode
CC=gcc
CC_FLAGS=-g -shared -fpic -I "$(jdkDir)/include" -I "$(jdkDir)/include/linux"


cFile="$(ccodeDir)/$(cFileName).c"
soFile="$(libDir)/lib$(cFileName).so"

dirs:
    mkdir -p "$(targetDir)"
    mkdir -p "$(libDir)"

java: dirs
    $(javac) $(JAVAC_FLAGS) "$(srcDir)/$(MainPackage)/$(Main).java"

header:
    $(javah) $(JAVAH_FLAGS) "$(MainPackage).$(Main)"

c:
    $(CC) $(CC_FLAGS) $(cFile) -o $(soFile)

all:
    $(MAKE) java
    $(MAKE) header
    $(MAKE) c

run:
    $(java) $(JAVA_FLAGS) "$(MainPackage).$(Main)"

clean:
    rm -rf classes
    rm -rf lib
    rm -f $(ccodeDir)/$(MainPackage)_$(Main).h

My problem, now, lies with MainPackage=jnitest.

So long as MainPackage is a single word, everything is fine.

However, when it is not, I'll be needing it once in slash notation for

$(javac) $(JAVAC_FLAGS) "$(srcDir)/$(MainPackage)/$(Main).java"

and once in dot notation for

$(java) $(JAVA_FLAGS) "$(MainPackage).$(Main)"

In bash, you could do something like

MainPackage_slashed=$(echo "$MainPackage" | tr '.' '/')

How do I insert one such transformation into a makefile?



Solution 1:[1]

You're looking for the subst function, see the GNU make manual.

Example:

foo=x.y.z
bar=$(subst .,/,$(foo))
$(info $(bar))

prints x/y/z.

Solution 2:[2]

You will need to use shell function in your Makefile like this:

MainPackage_slashed := $(shell echo "$(MainPackage)" | tr '.' '/')

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2