根据当前操作系统更新makefile中的CFLAGS或LDFLAGS

时间:2015-12-09 23:07:36

标签: c++ macos makefile

我正在尝试创建一个适用于OSX和Linux的makefile。

我的问题是我需要更改cflagsldflags,具体取决于执行makefile的操作系统,但我无法使其工作。那是我的makefile:

OS:=$(shell uname)
DST=hello
SRC=$(wildcard *.cpp)
OBJ=$(SRC:.cpp=.o)
CFLAGS=

all: clean DetectOS $(DST)

DetectOS:
ifeq ($(OS),Darwin)
    @echo OS : $(OS)
    CC=g++
    LDFLAGS="-lm -framework OpenCL"
    CFLAGS+=-O3
endif

ifeq ($(OS),Linux)
    #Coming soon...
endif

$(DST): $(OBJ)
    $(CC) -o $@ $^ $(LDFLAGS)

%.o: %.cpp
    $(CC) -o $@ -c $< $(CFLAGS)

clean:
    rm -rf *.o $(DST)

但是当我运行此代码时,cflags条件块中的ldflagsCCifeq都不会更新。我得到以下结果:

$ make
rm -rf *.o hello
OS : Darwin
CC=g++
LDFLAGS="-lm -framework OpenCL"
CFLAGS+=-O3
cc -o opencl.o -c opencl.cpp 
cc -o hello opencl.o 
Undefined symbols for architecture x86_64:....

正如您所看到的,检测到操作系统是因为我们进入了ifeq条件块,但CC未更新并保持未初始化的值cc。最后,链接器进程失败,因为ldflags中未引用OpenCL。

另一点,如果我不在LDFLAGS="-lm -framework OpenCL"中加注,我会收到错误:

LDFLAGS=-lm -framework OpenCL
/bin/sh: -framework: command not found
make: *** [DetectOS] Error 127

基于多个例子(这里是stackoverflow)我应该不加引号。

我目前使用的是Mac OS X Yosemite。

1 个答案:

答案 0 :(得分:3)

我认为ifeq块不应该进入make目标,而应该进入makefile的前面(在all之前)。

即。像这样:

OS:=$(shell uname)
DST=hello
SRC=$(wildcard *.cpp)
OBJ=$(SRC:.cpp=.o)
CFLAGS=

ifeq ($(OS),Darwin)
    $(info OS is $(OS))
    CC=g++
    LDFLAGS=-lm -framework OpenCL
    CFLAGS+=-O3
endif

ifeq ($(OS),Linux)
    #Coming soon...
endif

all: clean $(DST)

...

(没有“DetectOS”目标,使用信息而不是回声)