使用 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 中,但我强烈建议不要使用它)
我有一堆静态库,我需要使用 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 中,但我强烈建议不要使用它)