Makefile中的执行顺序
发布时间:2020-12-16 09:59:43 所属栏目:百科 来源:网络整理
导读:我有一个文件A,想要从中创建一个文件B,在make过程中替换相同的变量. 变量名称存储在变量中. 最小的Makefile如下所示: vars = var1 var2 var3var1 = AAAvar2 = BBBvar3 = CCCdefault: cp A B $(foreach var,$(vars),$(shell sed -i "s/$(var)/"$(value $(va
我有一个文件A,想要从中创建一个文件B,在make过程中替换相同的变量.
变量名称存储在变量中. 最小的Makefile如下所示: vars = var1 var2 var3 var1 = AAA var2 = BBB var3 = CCC default: cp A B $(foreach var,$(vars),$(shell sed -i "s/$(var)/"$(value $(var))"/g" B)) 文件A看起来像这样: blabla var1 blabla blabla var2 blabla blabla var3 blabla 当我执行make时,我得到了输出 sed: can't read B: No such file or directory sed: can't read B: No such file or directory sed: can't read B: No such file or directory cp A B 复制语句在foreach之后执行!我可以通过设置一个单独的目标来解决这个问题,例如复制,只将复制命令放在那里并使默认值取决于复制. 但为什么???为什么规则内的执行顺序不严格? 我错过了什么? PS: $make --version GNU Make 4.0 Built for x86_64-pc-linux-gnu 解决方法
$(shell)是一个make函数.它在make时执行(在这种情况下是在配方扩展时).这在配方执行之前发生.
$(foreach)也发生在那个时候. 你根本就不想要$(shell).您希望$(foreach)输出一个可以正常执行的单个(长)shell配方行. (确保使用a终止输出命令;使其合法化.) default: cp A B $(foreach var,sed -i 's/$(var)/"$(value $(var))"/g' B;) 我也切换到单引号以避免需要转义,因为shell中没有任何东西需要扩展. make在这里完成所有变量扩展. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |