具有动态列表目标的Makefile

时间:2018-03-20 15:15:03

标签: shell makefile

I wrote some code for a class I'm teaching检查一些工具是否在某些测试数据和脚本上都具有正确(和相同)的行为,以比较它们的相对性能。我的想法是,如果我的学生可以将他们的源代码放在特定目录中,然后将所有脚本应用到它 - 我可以将他们的所有解决方案放在我的目录副本中。

我已将其设置为如果您将名称以_src结尾的目录放入特定目录,并且此目录中包含Makefile,则源将包含在构建中。但是,我实现它的方式基本上只是我的Makefile中的shell脚本。

mappers=$(wildcard *_src)

all:
    echo $(mappers)
    for m in $(mappers); do                               \
        mapper_name=`basename $$m _src`                  ;\
        echo $$mapper_name                               ;\
        (cd $$m && make)                                 ;\
        if [ ! -e $$mapper_name ]; then                   \
            cp $$m/$$mapper_name $$mapper_name           ;\
        fi                                               ;\
        if [ $$m/$$mapper_name -nt $$mapper_name ]; then  \
            cp $$m/$$mapper_name $$mapper_name           ;\
        fi                                               ;\
    done                                                 ;\
    for m in $(mappers); do                               \
        mapper_name=`basename $$m _src`                  ;\
        if [ ! -x $$mapper_name ]; then                   \
          echo "Hey! where did $${mapper_name} go?"      ;\
            exit 1                                       ;\
        fi                                               ;\
    done

我确信必须有一种更聪明的方法在Makefile中包含子目录,以便能够自动检测它们,但是当它超出简单的设置时,我对Make并不熟悉。< / p>

我正在考虑制作一个可以更新我的Makefile的脚本,类似于makedepends的工作方式,但我不确定这是最好的解决方案。

1 个答案:

答案 0 :(得分:1)

这样的事情可能会起作用 - 对于每个_src目录,它会创建一个_build目录,复制文件,然后从_build目录构建。完成后,它会触及_build / .built文件以标记它已完成:

//This is correct
'I' => 1, 'X' => 7
'I' => 0, 'X' => 7

//This is not correct:

'I' => 1, 'X' => 7
'I' => 1, 'X' => 7

//This is not correct
'I' => 0, 'X' => 7
'I' => 0, 'X' => 7