Makefile在所有内容之前运行一个动作

时间:2015-09-15 07:26:19

标签: gnu-make

为了构建我的目标,我有一个文件list.txt中包含的先决条件列表和一个用于生成此文件generate-list.sh的脚本。

我每次调用make时都需要首先执行脚本,以便更新list.txt并为ti make提供正确的先决条件列表。

prebuild:
    touch list.txt

.SECONDEXPANSION:
exe: prebuild $$(shell cat list.txt)
    touch exe

<files in list.txt>:
    <rules for generating these files>

这样,当我运行make时,我首先收到来自cat的错误,说list.txt不存在,然后生成list.txt但是cat无法生成list.txt中包含的先决条件。

1 个答案:

答案 0 :(得分:0)

考虑到每次必须在最开始时执行generate_list.sh,您可以使用的一种方法是使用shell函数显式执行它。这意味着将makefile改为

$(shell ./generate_list.sh > /dev/null)

.SECONDEXPANSION:
exe: $(shell cat list.txt)
    touch exe
    @echo $?

<files in list.txt>:
    <rules for generating these files>

执行此makefile会产生

$ make
touch exe
deps.c test.c

我的generate_list.sh文件包含

#!/bin/bash

touch test.c deps.c
echo deps.c test.c > list.txt

echo 'Created prerequisites list.'

注释

  1. /dev/null包含在$(shell ./generate_list.sh > /dev/null)中,因为generate_list.sh会产生输出,因为这会导致make中的错误

    $ make
    GNUmakefile:1: *** missing separator.  Stop.
    

    否则。

  2. @echo $?表明list.txt中的所有先决条件现已包含在exe的先决条件中。

  3. 基于自动依赖关系生成的替代方法

    您尝试执行的操作与automatic dependency生成非常相似,可以使用make中的-include指令完成此操作。对于将来的使用,您可能需要考虑沿着这条路线行进并更改generate_list.sh脚本,以创建可以包含在主makefile中的makefile