gmake:将变量中的所有%.c和%.cxx都转换为lib%.a lib%.so

问题描述

我的makefile从MongoDatabase.a单个文件创建了许多.so.c格式的小型库。例如,如果.cxx包含SmallLibSrc,我希望foo.c包含SmallLibs。同样,如果libfoo.a libfoo.so包含SmallLibSrc,我希望bar.cxx包含SmallLibs

我可以通过使用虚拟变量(例如:

)来使此操作分两步进行:
libbar.a libbar.so

但是由于某种原因,在一个变量中执行失败。我想我对这些替换的语法不了解。还有另一种行之有效的方法吗?请注意,我部分要求的是更简洁的解决方案,但主要是为了了解有关$()的更多信息。

SmallLibsDummyA  = $(SmallLibSrc:%.c=lib%.a)
SmallLibsDummySO = $(SmallLibSrc:%.c=lib%.so)
SmallLibs        = $(SmallLibsDummyA:%.cxx=lib%.a) $(SmallLibsDummySO:%.cxx=lib%.so)

解决方法

这行不通:

SmallLibSrc = foo.cxx bar.c

$($(SmallLibSrc:%.cxx=lib%.a):%.c=lib%.a)

因为替换变量的格式为$(NAME:...),其中NAME是变量 name 。在您的示例中,首先扩展内部变量,然后得到:

SmallLibSrc = foo.cxx bar.c

$(libfoo.a bar.c:%.c=lib%.a)

它将尝试扩展名为libfoo.a bar.c的make 变量,该变量显然不存在。

您不能使用此表格;您将必须使用更通用的功能,例如:

$(foreach base,$(basename $(SmallLibSrc)),lib$(base).a lib$(base).so)