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

如何配置Makefile以支持所有/多个工件类型的构建,makefile,gnu-make,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-

创建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)

还是上面的模式有问题?我愿意接受任何建议。谢谢大家!

我会使用make递归。创建一个新的目标,如
所有操作系统
或其他:

.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)

如果愿意,您现在也可以运行
makeappwindows
而不是
makeappos=Windows

我会使用makerecursion。创建一个新的目标,如
所有操作系统
或其他:

.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

谢谢这是一个很好的建议。这些命令是顺序运行还是并行运行?顺序:配方中的各行永远不会并行运行。如果你想并行运行它们,你需要为每一个单独的目标。如果使用为每个操作系统命名的目标,而不是设置变量,则可以重用相同的基础结构。我会更新我的答案。谢谢。这是一个很好的建议。这些命令是顺序运行还是并行运行?顺序:配方中的各行永远不会并行运行。如果你想并行运行它们,你需要为每一个单独的目标。如果使用为每个操作系统命名的目标,而不是设置变量,则可以重用相同的基础结构。我会更新我的答案。