0

首先,标题非常通用,因为有很多方法可以解决这个问题。但是,我正在寻找一种干净整洁的方式。

情况:
我有两个相等的目标文件foo.ofoo-pi.o,后者与位置无关(用 编译-fPIC)。两者都取决于foo.hbar.h

问题:
我如何在没有代码重复的情况下声明 all foo*.oto的依赖关系bar.h

到目前为止的解决方案:
$(shell bash -c 'echo -ne foo{-pi,}.o'): bar.h
$(addsuffix .o, $(addprefix fo, o-pi o)): bar.h
foo.o foo-pi.o: bar.h

第一个解决方案在不支持的系统上是不可移植的bash,第二个是一个肮脏的解决方案,因为我不知道如何在addprefix. 第三种解决方案包括foo我想避免的重复提及。

4

1 回答 1

1

首先,您不需要使用echo -en,因为 shell 函数总是去掉尾随的换行符,就像 shell 中的反引号一样。但是,即使您确实需要省略尾随换行符,您也可以使用该printf程序而不是echo:printf比将选项传递给 : 更具可移植性和可靠性echo,这在任何地方都是不同的。

其次,您可以使用 foreach 函数而不是总的 addsuffix/addprefix。您遇到的问题是您试图将一个单词变成两个单词,而那些函数(以及更通用的函数,如 patsubst)只是不这样做。尝试:$(foreach F,foo,$F $F-pi.o): dep.h

第三,我个人只是把它写出来,因为它更省力,更容易阅读。

于 2013-06-25T17:18:05.810 回答