【问题标题】:makefile with spaces in SOURCESOURCE 中带有空格的生成文件
【发布时间】:2012-05-27 18:39:50
【问题描述】:

我有这个 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 是从其他程序自动生成的

【问题讨论】:

标签: makefile


【解决方案1】:

尝试逃跑:

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

或者使用引号:

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

【讨论】:

  • 我试试这个SOURCES=/usr/eval/demo\ 1/user/demo1/p2/main.cpp ; SOURCES="/usr/eval/demo 1/user/demo1/p2/main.cpp" ; SOURCES="/usr/eval/demo\ 1/user/demo1/p2/main.cpp",但不工作
【解决方案2】:

在 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文件中工作,甚至在更复杂的情况下,但我有一个实际项目,它不起作用,并且在一个通用示例中重现来演示并不简单。许多包含文件带来数据、可重用的生成资源、目标等。分配给问题的值也来自包含文件中的其他变量,包括相对于 $(CURDIR) 计算的路径,尽管最终在文件名中解析为一个简单的常量字符串。导致损坏的确切情况是什么尚不清楚,并且至少有一次尝试为这篇文章创建示例并没有重现问题(GNU make 无法检测到 $(PROBLEM) 文件已经存在并且不需要 重建)。

似乎很清楚(对我来说)文件名中的空格对 GNU make 构成了挑战,没有明显的万能解决方案。

【讨论】:

    猜你喜欢
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多