【问题标题】:String manipulation in makefilesmakefile 中的字符串操作
【发布时间】: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 变量中包含引号。 javajavahjavaccFilesoFile 同上。

标签: java c bash makefile tr


【解决方案1】:

您正在寻找subst 函数,请参阅the GNU make manual

例子:

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

打印x/y/z

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢你.. MainPackage_slashed := $(shell echo "$(MainPackage)" | tr '.' '/'),实际上。你能相应地编辑你的帖子吗?我自己会做,但“编辑必须至少有 6 个字符长”。
    • 好吧,这可以完成工作,但会产生新进程并依赖于提供tr 的环境——为什么不使用内置的make 函数?
    • 是的,我同意对于这个简单的字符串替换内置函数subst 是更好的选择。但是,当调用外部 shell 命令是唯一的方法时,我将这个答案保留为通用目的。
    猜你喜欢
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2012-07-16
    相关资源
    最近更新 更多