使用 ar 在 Makefile 中组合静态库

Combine static libraries in a Makefile using ar

我有一堆静态库,我需要使用 Makefile 中的 ar 合并成一个文件。

例如,

ar -M <<EOM
CREATE app.a
ADDLIB lib1.a
ADDLIB lib2.a
ADDLIB lib3.a
....
....
....
ADDLIB libN.a
SAVE
END
EOM

只要我知道我需要添加的所有库 ADDLIB libX.a,就可以正常工作。 我想自动化这个。我在 Makefile 中有一个变量,它存储所有这些库。 在 Makefile 目标中,我想做,

my_target:
    # Get all libraries from the variable $(libraries).
    # Combine all of them into a single file using archiver as above

我找不到方法来做到这一点,因为每个 'line' 或 target 中的子命令在它自己的 shell.

中都是 运行

我假设这是一个 Makefile 变量,而不是 bash 变量。我还假设它是一个 space 分隔的文件列表。你可以这样做:

#Makefile trickery to create a variable that holds a single space:
space :=
space +=

my_target:
    ar -M CREATE $(subst $(space), ADDLIB ,$(strip $(variables))

这使用一些 makefile 文本处理在每个条目之间添加字符串 ADDLIB(我们手动在第一个条目前加上 CREATE$(strip) 只是删除重复的 whitespaces(连同 trailing/leading whitespaces)以防止任何意外的副作用。

或者,如果你想做一些更复杂的事情,而你只知道如何在 bash 中做到这一点,你可以按照@MadScientist 的建议,将几个食谱行组合在一起:

target:
    parmList="CREATE $$(echo "$(variables)" | sed s/ / ADDLIB /g)"; \
    ar -M $${parmList}

注意 $${parmList}$$(shell ...) 前面的 $$ 以及尾随 \ 和 ';'在第一个配方行的末尾。

(还有一些设置可以使 运行 所有配方行都在一个 shell 中,但我强烈建议不要使用它)