如何配置Makefile以支持所有/多个工件类型的构建

时间:2018-01-21 09:19:36

标签: makefile gnu-make

创建Makefile以支持构建特定类型的工件以及作为支持在一个命令中构建所有工件类型的一般最佳实践。

例如,假设有一个Makefile支持在特定操作系统上构建应用程序:

make app OS="Windows"
make app OS="Linux"
make app OS="Mac"

让我们说Makefile看起来像:

my-other-dependency:
    ...
    # Performs commands specific to $(OS)

my-dependency: my-other-dependency
    ...
    # Performs commands specific to $(OS)

app: my-dependency
    ...
    # Performs commands specific to $(OS)

要构建所有工件,可以按顺序调用这3个命令:

make app OS="Windows"
make app OS="Linux"
make app OS="Mac"

Makefile的推荐结构是什么,以支持一体化命令,例如:

make app            # build all artifact types (Windows, Linux, Mac)
or
make app OS="all"   # build all artifact types (Windows, Linux, Mac)

或者上面的模式有问题吗?我对任何建议持开放态度。谢谢!

1 个答案:

答案 0 :(得分:1)

我会使用make recursion。创建一个新目标,如all-os或其他:

.PHONY: all-os
all-os:
        $(MAKE) app OS=Windows
        $(MAKE) app OS=Linux
        $(MAKE) app OS=Mac

ETA 这是另一个选项,它使用为每个操作系统命名的单独目标来允许并行构建:

OSLIST := Windows Linux Mac

_ostargets := $(addprefix app-,$(OSLIST))
$(_ostargets): app-%:
        $(MAKE) app OS=$*

app-all: $(_ostargets)

.PHONY: app-all $(_ostargets)

如果您愿意,现在也可以运行make app-Windows而不是make app OS=Windows