GNU makefile to";“覆盖一个源列表”;超过;“另一个来源列表”;

GNU makefile to";“覆盖一个源列表”;超过;“另一个来源列表”;,makefile,gnu-make,Makefile,Gnu Make,我有两个源目录 一个目录自动生成了代码。 另一个目录中有代码,该代码接受自动生成的代码并向代码中添加自定义项 我想自动合并这两个源目录,以便每个文件的源路径的basename替换自动生成的源目录中的`basename'。例如: SRC_AUTO := $(wildcard path1/path2/src_auto/*.cpp) SRC_WORK := $(wildcard path3/path4/src_work/*.cpp) # How to achieve this with GNU Ma

我有两个源目录

一个目录自动生成了代码。 另一个目录中有代码,该代码接受自动生成的代码并向代码中添加自定义项

我想自动合并这两个源目录,以便每个文件的源路径的
basename
替换自动生成的源目录中的`basename'。例如:

SRC_AUTO := $(wildcard path1/path2/src_auto/*.cpp)
SRC_WORK := $(wildcard path3/path4/src_work/*.cpp)

# How to achieve this with GNU Make without going out to $shell or perl...
SRC_MERGED := overlay_basename($SRC_WORK, $SRC_AUTO)
例如:

SRC_AUTO := $(wildcard path1/path2/src_auto/*.cpp)
SRC_WORK := $(wildcard path3/path4/src_work/*.cpp)

# How to achieve this with GNU Make without going out to $shell or perl...
SRC_MERGED := overlay_basename($SRC_WORK, $SRC_AUTO)
SRC_AUTO := \
    ./path1/path2/src_auto/pathz/file1.cpp \
    ./path1/path2/src_auto/pathx/pathy/file2.cpp \
    ./path1/path2/src_auto/file3.cpp

SRC_WORK := \
    ./path3/path4/src_work/file1.cpp \
    ./path3/path4/src_work/file3.cpp

#This is what I need to generate automatically
SRC_MERGED := \
   path1/path2/src_auto/pathx/pathy/file2.cpp \
   path3/path4/src_work/file1.cpp \
   path3/path4/src_work/file3.cpp
除了更多的文件。。。SRC_WORK覆盖文件路径的basename之外的SRC_自动键控

下面是我基本上想从GNU make在perl伪代码中执行的操作:

@SRC_AUTO = ( ...list of automatically generated files.. );
@SRC_WORK = ( ...list of customized files copied from auto directory );

%unique = ();
foreach $file (@SRC_WORK) {
    $base = basename($file);
    $unique{$base} = $file;
}

foreach $file (@SRC_AUTO) {
    $base = basename($file);
    if (!defined($unique{$base}) {
         $unique{$base} = $file;            
    }
}
@merged_list = ();
foreach $key (keys %unique) {
    $file = $unique{$key};
    push(@merged_list, $file);
}
@sorted_merged_list = sort(@merged_list);

return @sorted_merged_list;
更新,经过进一步改进后,我现在有了下面的perl脚本:(现在,如果您可以使用一个内置函数从gnu make自动执行此操作,而不需要一个由调用脚本的脚本组成的脆弱脚本环境……):


这应该满足您的要求:

SRC_MERGED := $(filter-out $(addprefix %/,$(notdir $(SRC_WORK))),$(SRC_AUTO)) $(SRC_WORK)
说明:

  • $(notdir$(SRC_-WORK))
    返回
    $(SRC_-WORK)
    中所有单词的基本名称:
    file1.cpp file3.cpp
  • $(addprefix%/,$(notdir$(SRC_WORK))
    %/
    前缀添加到1的结果中;这是生成模式的列表(
    %
    是通配符):
    %/file1.cpp%/file3.cpp
  • $(过滤掉$(addprefix%/,$(notdir$(SRC_-WORK)),$(SRC_-AUTO))
    返回
    $(SRC_-AUTO)
    中与
    $(addprefix%/,$(notdir$(SRC_-WORK))(SRC_-WORK))中任何模式都不匹配的所有单词。
    /path1/path2/SRC_-AUTO/pathx/pathy/file2.cpp
  • $(过滤掉$(addprefix%/,$(notdir$(SRC_-WORK)),$(SRC_-AUTO))$(SRC_-WORK)
    只需将
    $(SRC_-WORK)
    连接到3的结果:

    ./path1/path2/src_auto/pathx/pathy/file2.cpp ./path3/path4/src_work/file1.cpp ./path3/path4/src_work/file3.cpp
    

  • 这应该满足您的要求:

    SRC_MERGED := $(filter-out $(addprefix %/,$(notdir $(SRC_WORK))),$(SRC_AUTO)) $(SRC_WORK)
    
    说明:

  • $(notdir$(SRC_-WORK))
    返回
    $(SRC_-WORK)
    中所有单词的基本名称:
    file1.cpp file3.cpp
  • $(addprefix%/,$(notdir$(SRC_WORK))
    %/
    前缀添加到1的结果中;这是生成模式的列表(
    %
    是通配符):
    %/file1.cpp%/file3.cpp
  • $(过滤掉$(addprefix%/,$(notdir$(SRC_-WORK)),$(SRC_-AUTO))
    返回
    $(SRC_-AUTO)
    中与
    $(addprefix%/,$(notdir$(SRC_-WORK))(SRC_-WORK))中任何模式都不匹配的所有单词。
    /path1/path2/SRC_-AUTO/pathx/pathy/file2.cpp
  • $(过滤掉$(addprefix%/,$(notdir$(SRC_-WORK)),$(SRC_-AUTO))$(SRC_-WORK)
    只需将
    $(SRC_-WORK)
    连接到3的结果:

    ./path1/path2/src_auto/pathx/pathy/file2.cpp ./path3/path4/src_work/file1.cpp ./path3/path4/src_work/file3.cpp
    

  • 你能告诉我们你想做什么,而不是要求我们对你的Perl脚本进行反向工程吗?可能会显示几个文件名(带路径),然后显示要创建的列表(如果要创建列表--我真的不知道)。您能告诉我们您想做什么,而不是要求我们对Perl脚本进行反向工程吗?可能会显示几个文件名(带路径),然后显示要创建的列表(如果要创建列表,我真的不知道)。