2013-06-25 259 views
0

首先,标题非常通用,因为只有很多方法可以解决这个问题。但是,我正在寻找一个干净和整洁的方式。Makefile:扩展依赖关系

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

问题:
如何在没有代码复制的情况下声明所有foo*.obar.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的重复提及。

+2

与其使用重命名来区分PIC和非PIC代码,考虑将这两种类型的对象放在不同的子目录中(例如'obj /'和'obj.PIC /'),并保留相同的名称。这可能会让很多你想做的事更容易...... – twalberg

+0

是的,但规范不允许这样做。 – Danyel

回答

1

首先,你不需要使用echo -en,因为shell函数总是去掉尾随的换行符,就像shell中的反引号一样。但是,即使您确实需要省略尾随的换行符,您也可以使用printf程序代替echoprintf比将选项传递到echo更方便可靠,而这些选项在各处都不相同。

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

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