【发布时间】:2017-11-09 10:45:04
【问题描述】:
我已经用 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 中?
【问题讨论】:
-
仅供参考,您永远不想在简单的路径变量分配中使用引号,例如
jdkDir="/home/user/local/java/jdk1.7.0_65"。像对待任何其他角色一样制作引述:它们一点都不特别。因此,当您使用jdkDir时,引号将被保留:"$(jdkDir)/include"扩展为""/home/user/local/java/jdk1.7.0_65"/include",这与您想要的相反。 仅 在命令行中包含引号,从不在表示简单文件或目录的 make 变量中包含引号。java、javah、javac、cFile、soFile同上。