makefile中的字符串操作

时间:2017-11-09 10:45:04

标签: java c bash makefile tr

我已经使用makefile替换了my previous question中的.sh个文件。我承认,我对makefile知之甚少,但这似乎有用:

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

我现在的问题在于MainPackage=jnitest

只要MainPackage是一个单词,一切都很好。

然而,如果不是,我将需要一次用斜线表示法

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

的点符号一次
$(java) $(JAVA_FLAGS) "$(MainPackage).$(Main)"

在bash中,您可以执行类似

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

如何将一个这样的转换插入到makefile中?

2 个答案:

答案 0 :(得分:3)

您正在寻找subst功能,请参阅the GNU make manual

示例:

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

打印x/y/z

答案 1 :(得分:2)

您需要在Makefile中使用shell function,如下所示:

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