Makefile shell的使用和在文件数组上的循环
我对makefiles的知识已经很生疏了。作为构建阶段的一部分,我希望:Makefile shell的使用和在文件数组上的循环,makefile,gnu,gnu-make,Makefile,Gnu,Gnu Make,我对makefiles的知识已经很生疏了。作为构建阶段的一部分,我希望: 循环遍历目录“javalibs”中的所有文件 对于每个.jar文件,调用“jarxfjarfile”从该jar文件中提取所有类。由于JARXF只允许提取到当前位置,因此我必须将其cd到某个目录 所以这是我的最终目标,让所有类都在某个特定目录中(这背后的基本原理是稍后我在这些类上运行ProGuard) 我的问题是。。。好。。。我的makefile知识糟透了=)。这是我想循环这些文件的部分: $(classes): $(a
- 循环遍历目录“javalibs”中的所有文件
- 对于每个.jar文件,调用“jarxfjarfile”从该jar文件中提取所有类。由于JARXF只允许提取到当前位置,因此我必须将其cd到某个目录
$(classes): $(all-javas) $(all-properties) $(alljars)
@rm -rf $(stage1)
@mkdir -p $(stage1)
# cur_dir=$(shell basename $(CURDIR))
jars=`find $(makefile_dir)/$(javalibs) -name *.jar`
#$(wildcard $(javalibs)/*.jar)
for jar in $(jars) ; do \
(wd=$$(pwd); \
cd "$$makefile_dir/$$stage1" ; \
`jar xf "$$makefile_dir/$$jar"` ; \
echo "jar xf $$makefile_dir/$$jar" ;) \
done
# cd $(cur_dir)
$(javac) -d $(stage1) -sourcepath $(src) \
-bootclasspath $(vm-build)/classpath $(javas)
cp $(all-properties) $(stage1)/
我的预期结果是
jar xf "$$makefile_dir/$$jar"
实际上是在shell上调用的。相反,在执行makefile时,我只得到for循环的一个回声:
for jar in ; do \
(wd=$(pwd); \
cd "$makefile_dir/$stage1" ; \
`jar xf "$makefile_dir/$jar"` ; \
echo "jar xf $makefile_dir/$jar" ;) \
done
注意上面缺少的数组:“for jar in”
我的预期结果是“jars”中有一个数组,它是循环的。但我可能无法以这种方式初始化数组
我需要的是某种帮助,以帮助我理解如何从shell的返回值初始化数组。我上面的语法是否正确
更新:
我从来没有得到建议的答案工作(但这可能是因为我)。但是我做了这个:
define stageLibraryJar
(cd $(libraries) && jar xf $(1))
echo Extrcated $(1) to libraries
cd $(makefile_dir)
endef
.PHONY: build
build: prepare-libraries make-vm $(xcode-build)/$(release)/hello.app/hello
.PHONY: prepare-libraries
prepare-libraries:
rm -rf $(libraries).classes
mkdir -p $(libraries).classes
@rm -rf $(libraries)
@mkdir -p $(libraries)
@rm -rf $(stage1)
@mkdir -p $(stage1)
$(foreach jar,$(library-jars), $(call stageLibraryJar,$(makefile_dir)/$(jar)))
不确定这是否是最好的方法。但是它可以工作您可以通过命令中的shell循环来完成,但这种方式要简单得多:
JARS := $(shell find $(makefile_dir)/$(javalibs) -name "*.jar")
$(info jar files are $(JARS))
# be sure this looks right before you proceed
MODULES := $(patsubst %.jar,%.module,$(JARS)) # "module" is just a name
all: $(MODULES)
.PHONY: $(MODULES)
$(MODULES): %.module :
@cd $(makefile_dir)/$(stage1) ; jar xf $(makefile_dir)/$*.jar
谢谢,看起来确实干净多了。然而,无论我尝试什么,我的模块总是空的。嗯。明天再试。请查看我的更新问题。我从来没有这样做过,但可能是因为我。@benjist:JARS中的内容是什么?我刚刚将JARS重命名为library JARS。它包含一个相对于makefile dir的路径列表(之前我还为代码使用了absolute路径)。现在定义为:library jars=$(shell find$(javalibs)-name'*.jar')@benjist:其中包含什么?你能举一两个这样的例子吗?