是否有可能有条件地在makefile中定义宏?

时间:2012-06-08 13:59:29

标签: linux makefile gnu-make hp-ux

我正在编写一个必须与LINUX和HP-UX操作系统兼容的makefile。我知道LINUX中的某些shell命令与HP-UX不兼容。因此,我想知道是否有可能有条件地声明宏,以便如果确定操作系统是HP-UX,宏将以某种方式定义,如果操作系统是LINUX,它将被定义为不同? / p>

OS       = `uname`
myOS     = Linux


ifeq ($(OS),$(myOS))
    message = "HELLO LINUX"
else
    message = "HELLO FOO" 
endif

all: install

install:
    echo $(message)

我尝试过使用上述方法;但是,似乎ifeq确定OS和myOS不一样。它们都应该是'Linux',但它会输出else块。

3 个答案:

答案 0 :(得分:2)

是的,您可以定义conditionals in makefiles

此示例取自上述链接

libs_for_gcc = -lgnu
normal_libs =

foo: $(objects)
ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

这会显示syntax for conditionals

鉴于此定义任何具体的东西应该不是问题。例如,可以通过-D开关为C程序定义/传递marcos。

更新:要解决操作系统变量无法获取shell命令uname输出的问题,您需要使用shell function(正如@AraundF正确指出的那样:引用我发布的链接:

  

“shell函数执行与反引号(``)相同的功能   在大多数贝壳中表演......“

所以你走在正确的轨道上。

答案 1 :(得分:2)

你应该使用$(shell ...)来执行SHELL命令,这将起作用

OS       := $(shell uname)
myOS     := Linux


ifeq ($(OS),$(myOS))
    message := "HELLO LINUX"
else
    message := "HELLO FOO" 
endif

all: install

install:
    echo $(message)

答案 2 :(得分:0)

我们以前在这里做的是在我们构建的所有系统上定义一个环境变量ARCH,在Linux系统上它将具有值linux,在AIX aix上,在Makefile我们有:

include make.$(ARCH)

并为每个平台创建一个名为make.linuxmake.aix等的文件,其中包含特定于该平台的定义,例如make.linux包含:

CC =克++

make.aix包含

CC = xlC_r

这是一个非常好的干净方法,但我们现在正在迁移到cmake(http://www.cmake.org/)。