【发布时间】:2020-05-08 05:30:15
【问题描述】:
当我从 tar 球中提取文件以创建文件列表时,make 不遵循符号链接,并为列表中指定的每个文件继续提取相同的 tar 球。例如,我在 linux 中使用以下命令创建了 2 个 tar 球:
design1 是一个目录,其中包含指向具有 c 设计文件的另一个目录的链接
% mkdir design1
% mkdir c_files
% cd c_files/
% touch a.c b.c c.c d.c e.c f.c
% cd ../design1/
% ln -s ../c_files/ .
% cd ..
% gtar zcvf design1.tgz design1/
design2 与 design1 相同,只是 c_files 是目录而不是链接
% mkdir design2
%
% cp -rp c_files design2
% gtar zcvf design2.tgz design2/
现在有 2 个压缩 tar 文件 design1.tgz 和 design2.tgz 并且 design1 和 design2 目录被删除
% \rm -rf design1 design2
这是我的 Makefile: ----------------开始 Makefile --------------------------------
DESIGN_EXTRACT_DIR := .
DESIGN_TOP1 := c_proj1
FILE_LIST1 := $(strip $(DESIGN_TOP1)).f
DESIGN_TAR_FILE1 := design1.tgz
DESIGN_RELEASE_DIR1 := $(DESIGN_EXTRACT_DIR)/design1
DESIGN_FILES1 =\
$(DESIGN_RELEASE_DIR1)/c_files/a.c \
$(DESIGN_RELEASE_DIR1)/c_files/b.c \
$(DESIGN_RELEASE_DIR1)/c_files/c.c \
$(DESIGN_RELEASE_DIR1)/c_files/d.c \
$(DESIGN_RELEASE_DIR1)/c_files/e.c \
$(DESIGN_RELEASE_DIR1)/c_files/f.c \
IP_EXTRACT1: $(DESIGN_FILES1)
$(DESIGN_FILES1): $(DESIGN_TAR_FILE1)
gtar zxvfmhC $(DESIGN_TAR_FILE1) $(DESIGN_EXTRACT_DIR)
$(FILE_LIST1): $(DESIGN_FILES1)
@( rm -f $(FILE_LIST1) )
@( touch $(FILE_LIST1) )
@$(foreach file, $(DESIGN_FILES1), `echo $(file) >> $(FILE_LIST1)`)
FL1: $(FILE_LIST1)
DESIGN_TOP2 := c_proj2
FILE_LIST2 := $(strip $(DESIGN_TOP2)).f
DESIGN_TAR_FILE2 := design2.tgz
DESIGN_RELEASE_DIR2 := $(DESIGN_EXTRACT_DIR)/design2
DESIGN_FILES2 =\
$(DESIGN_RELEASE_DIR2)/c_files/a.c \
$(DESIGN_RELEASE_DIR2)/c_files/b.c \
$(DESIGN_RELEASE_DIR2)/c_files/c.c \
$(DESIGN_RELEASE_DIR2)/c_files/d.c \
$(DESIGN_RELEASE_DIR2)/c_files/e.c \
$(DESIGN_RELEASE_DIR2)/c_files/f.c \
IP_EXTRACT2: $(DESIGN_FILES2)
$(DESIGN_FILES2): $(DESIGN_TAR_FILE2)
gtar zxvfmhC $(DESIGN_TAR_FILE2) $(DESIGN_EXTRACT_DIR)
$(FILE_LIST2): $(DESIGN_FILES2)
@( rm -f $(FILE_LIST2) )
@( touch $(FILE_LIST2) )
@$(foreach file, $(DESIGN_FILES2), `echo $(file) >> $(FILE_LIST2)`)
FL2: $(FILE_LIST2)
clean:
@( rm -rf $(FILE_LIST1)* $(FILE_LIST2)* )
----------------结束 Makefile----------------------
现在,当我运行 make 创建文件列表时,我使用命令 make FL1 和 make FL2。在 FL1 的情况下,gtar 的迭代次数与我拥有的文件一样多,但在 FL2 中没有这样做。此处唯一的区别是 FL1 在 design1 中名为 c_files 的链接上运行,而 FL2 将 c_files 作为目录进行迭代。 这是我看到的:
% make FL1
gtar zxvfmhC design1.tgz .
design1/
design1/c_files
gtar zxvfmhC design1.tgz .
design1/
design1/c_files
gtar zxvfmhC design1.tgz .
design1/
design1/c_files
gtar zxvfmhC design1.tgz .
design1/
design1/c_files
gtar zxvfmhC design1.tgz .
design1/
design1/c_files
gtar zxvfmhC design1.tgz .
design1/
design1/c_files
%make FL2
%
问题1: FL1 创建 c_proj1.f 和 FL2 创建 c_proj2.f 但 FL2 不像 FL1 那样迭代,我不知道如何防止这种迭代,特别是因为我可能有包含数百个文件的大型 tar 球。
问题2: 当 DESIGN_FILES1 由于文件数量而成为长列表时,由于变量太长,我收到以下错误: make: execvp: /bin/sh: 参数列表太长
有没有办法检查变量的大小,并可能写入文件并一次处理变量,这样每次迭代的 DESIGN_FILES 不会太长。或者有没有更好的方法来做到这一点。
谢谢
尼尔
【问题讨论】: