首先,标题非常通用,因为有很多方法可以解决这个问题。但是,我正在寻找一种干净和整洁的方式。
情况:
我有两个相等的目标文件foo.o
和foo-pi.o
,后者与位置无关(使用-fPIC
编译)。两者都取决于foo.h
和bar.h
。
问题:
如何在没有代码重复的情况下,声明所有foo*.o
与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
的重复提及。
答案 0 :(得分:1)
首先,您不需要使用echo -en
,因为shell函数总是剥离尾部换行符,就像shell中的反引号一样。但是,即使您确实需要省略尾随换行符,也可以使用printf
程序而不是echo
:printf
比将选项传递给echo
更加便携和可靠,各处都不一样。
其次,您可以使用foreach函数而不是gross addsuffix / addprefix。你遇到的问题是你试图将一个单词变成两个单词,而那些函数(以及像patsubst这样的更通用的单词)就是不这样做。尝试:$(foreach F,foo,$F $F-pi.o): dep.h
第三,我个人会把它写出来,因为它的工作量更少,更容易理解。