在Makefile中进行"切换"的好方法

Chr*_*fer 15 makefile switch-statement

我正在尝试使用更新的构建系统; 目前,我正试图找到一种根据目标平台设置编译器和标志的好方法.

我想做的是像

switch $(PLATFORM)_$(BUILD_TYPE)
  case "Linux_x86_release"
     CFLAGS = -O3
  case "Linux_x86_debug"
     CFLAGS = -O0 -g
  case "ARM_release"
     CC = armcc
     AR = armlink
     CFLAGS = -O2 -fx
     ...
Run Code Online (Sandbox Code Playgroud)

这是GNU Make不支持的.现在,我的第一个想法就是做

-include $(PLATFORM)_$(BUILD_TYPE)
Run Code Online (Sandbox Code Playgroud)

这是一个相当不错的解决方案,然而,它很难概述文件之间的差异,更不用说我期待编写和维护一个好的60-80文件,每个文件包含一组变量定义.

有没有人碰巧知道更好的方法来实现这一目标?即根据另一个变量设置一组标志和其他选项?

Mar*_*ork 24

怎么样:

CFLAGS_Linux_x86_release        = -O3
CFLAGS_Linux_x86_debug          = -O0 -g


CFLAGS  = ${CFLAGS_${PLATFORM}_${BUILD}}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,巧妙的技巧。也适用于 Solaris makefile,这允许我在 Solaris 和 Linux 上使用相同的 makefile。 (3认同)

Bru*_*ine 6

配置此类参数将是configure脚本的任务.

话虽这么说,您可以查看条件条件函数的语法.例如,您可以尝试以下操作:

ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_release)
    CFLAGS = -O3
endif
ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_debug)
    CFLAGS = -O0 -g
endif
Run Code Online (Sandbox Code Playgroud)

  • 好吧,要么依赖于gmake并使用ifeq/endif,要么依赖于pmake并使用#if/#endif,或者依赖于bmake并使用.if/.endif,或者依赖于Makefile-generator. (3认同)

Jes*_*erE 5

git使用的MakefileMakefile 的一个很好的例子,它在 Makefile 本身中执行非平凡的配置任务(例如切换主机类型)。它实际上非常可读并且使用起来相当简单。

  • 呃,不,我不会仅仅因为 Git 开发人员决定更改他们的 makefile 就花时间更新一个 6 年前的答案。我有更有趣的事情要做。:) (3认同)
  • 您应该更新答案,因为它几乎是仅链接的(因为如果链接失效,则没有有用的内容) (3认同)

bor*_*yer -3

切换到一个为你做这件事的系统(automake/autoconf)可能会更简单......