在SOURCE中使用空格的makefile

时间:2012-05-27 18:39:50

标签: makefile

我有这个Makefile

CC=g++
CFLAGS=-g -c -Wall -o standalone
MYSQLINCLUDE = -I/usr/local/include/mysql
MYSQLINCLUDESP = -I/usr/local/include/
LDFLAGS =-L/usr/local/lib
LDFLAGSSP =-L/usr/local/lib/mysql  -lmysqlclient -lmysqlcppconn
SOURCES= /usr/eval/demo 1/user/demo1/p2/main.cpp 
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=p2
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(LDFLAGSSP) $(OBJECTS) -o $@
.cpp.o:
    $(CC) $(MYSQLINCLUDESP) $(CFLAGS) $< -o $@
clean:
    rm -rf $(OBJECTS) $(EXECUTABLE) *.core

问题在于这一行

SOURCES= /usr/eval/demo 1/user/demo1/p2/main.cpp 

使用demo和1之间的空格,我收到此错误

`make: don't know how to make /usr/eval/demo Stop`

这个Makefile是从其他程序自动生成的

2 个答案:

答案 0 :(得分:0)

试着逃避:

SOURCES=/usr/eval/demo\ 1/user/demo1/p2/main.cpp

或使用引号:

SOURCES="/usr/eval/demo 1/user/demo1/p2/main.cpp"

答案 1 :(得分:0)

在Windows上的MSYS下工作(GNU make 3.79.1)我和这个问题争了一段时间,并提出了:

ifndef ESCAPE_PATH
ESCAPE_SPACE = $(subst _,,_ _)
ESCAPE_PATH = $(subst $(ESCAPE_SPACE),\$(ESCAPE_SPACE),$(1))
endif

然后,例如:

PROBLEM = ../problem with spaces.txt

PROBLEM_ESCAPED = $(call ESCAPE_PATH,$(PROBLEM))

$(PROBLEM_ESCAPED):
    date >$(PROBLEM_ESCAPED)

md5: $(PROBLEM_ESCAPED)
    md5sum $(PROBLEM_ESCAPED) >$(PROBLEM_ESCAPED).md5sum

这适用于一个简单的make文件,即使在更复杂的情况下,但我有一个不起作用的真实项目,并且在一个通用示例中重现并不简单。许多包含文件引入数据,可重复使用make资源,目标等。分配给PROBLEM的值也是从包含文件中的其他变量派生的,包括相对于$(CURDIR)计算的路径,尽管最终是文件名解析为一个简单的常量字符串。什么导致破坏的确切情况是未知的,并且至少有一次尝试为这篇文章创建和示例没有重现问题(GNU make无法检测到$(问题)文件已经存在且不需要 被重建)。

对我来说,文件名中的空格似乎很明显对GNU make提出了挑战,因为没有明显的“一刀切”的解决方案。

相关问题