ifeq块内的makefile变量不可见

时间:2018-03-11 07:43:22

标签: variables makefile scope

我有一个makefile:

SOURCES= helloworld.c   

ifeq ($(OSNAME), linux)
    # Object files needed to create library
    OBJECTS=$(SOURCES:%.c=%.o)
endif

# Windows Microsoft C/C++ Optimizing Compiler Version 12
ifeq ($(OSNAME), win32)
    OBJECTS=$(SOURCES:%.c=%.obj)
endif

#OBJECTS=$(SOURCES:%.c=%.o)  #without this line print won't output anything
print:
    @echo $(OBJECTS)

当我调用make print(在linux和macOS上)时,它会打印空行,除非我取消注释#OBJECTS = $(SOURCES:%。c =%。o)行。

为什么会这样?并非所有变量都是全局的吗?

2 个答案:

答案 0 :(得分:2)

提示1): 您可以使用以下命令打印出make中的每个变量:

SOURCES= helloworld.c

$(info sources: $(SOURCES))
$(info osname: $(OSNAME))
$(info os: $(OS))

提示2)

从linux中的输出中可以看出它返回:

sources: helloworld.c   
osname: 
os: 

你可以看到OSNAME根本没有在linux上设置,所以你的支票ifeq ($(OSNAME), linux)总是会失败!

要获取操作系统信息,请查看此链接:

OS detecting makefile

答案 1 :(得分:0)

我对你的Makefile进行了测试,但没有用。虽然它有可能在一般情况下起作用,但它似乎与测试OS的其他示例不同。因此,我很想建议您的条件,至少对于我测试的Linux,不会评估为true,因此该变量未设置。

这是一个似乎适用于Linux的重写示例:

SOURCES= helloworld.c   

UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
    # Object files needed to create library
    OBJECTS=$(SOURCES:%.c=%.o)
endif

# Windows Microsoft C/C++ Optimizing Compiler Version 12
ifeq ($(OS),Windows_NT)
    OBJECTS=$(SOURCES:%.c=%.obj)
endif

print:
    @echo $(OBJECTS)

输出(对我来说是Linux):

db@vm1:~/projects/here> make
helloworld.o

这个例子主要受到以下要点的启发:

  

https://gist.github.com/sighingnow/deee806603ec9274fd47