Makefile shell的使用和在文件数组上的循环

Makefile shell的使用和在文件数组上的循环,makefile,gnu,gnu-make,Makefile,Gnu,Gnu Make,我对makefiles的知识已经很生疏了。作为构建阶段的一部分,我希望: 循环遍历目录“javalibs”中的所有文件 对于每个.jar文件,调用“jarxfjarfile”从该jar文件中提取所有类。由于JARXF只允许提取到当前位置,因此我必须将其cd到某个目录 所以这是我的最终目标,让所有类都在某个特定目录中(这背后的基本原理是稍后我在这些类上运行ProGuard) 我的问题是。。。好。。。我的makefile知识糟透了=)。这是我想循环这些文件的部分: $(classes): $(a

我对makefiles的知识已经很生疏了。作为构建阶段的一部分,我希望:

  • 循环遍历目录“javalibs”中的所有文件
  • 对于每个.jar文件,调用“jarxfjarfile”从该jar文件中提取所有类。由于JARXF只允许提取到当前位置,因此我必须将其cd到某个目录
所以这是我的最终目标,让所有类都在某个特定目录中(这背后的基本原理是稍后我在这些类上运行ProGuard)

我的问题是。。。好。。。我的makefile知识糟透了=)。这是我想循环这些文件的部分:

$(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:其中包含什么?你能举一两个这样的例子吗?