- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我被困在这个问题上,我不知道我做错了什么。在一个更复杂的 makefile 上一切都很顺利,但突然我得到了“缺少分隔符”错误。我能够将其分解为一个非常简单的场景:
define push_dir
$(info ${1})
endef
define pop_dir
$(info ${1})
endef
define include_submake
$(call push_dir,${1})
$(call pop_dir,${1})
endef
include test.mk
INITIAL_SUBMAKE:= includeme.mk
$(call include_submake,${INITIAL_SUBMAKE})
process:
@echo Processed...
输出:
C:\project>make -f Simple process
includeme.mk
includeme.mk
Simple:4: *** missing separator. Stop.
includeme.mk
实际上并不存在。我不知道这里出了什么问题,我已经尝试了很多方法。如果我将调用包含在信息中,如下所示:
$(info $(call include_submake,${INITIAL_SUBMAKE}))
缺少分隔符的错误消失了。另外,如果在 include_submake
定义中我只调用其中一个函数,它就可以正常工作。此外,如果我直接调用函数而不是调用它们 include_submake
它也可以工作:
include test.mk
INITIAL_SUBMAKE:= includeme.mk
$(call push_dir,${INITIAL_SUBMAKE})
$(call pop_dir,${INITIAL_SUBMAKE})
process:
@echo Processed...
C:\project>make -f Simple process
includeme.mk
includeme.mk
Processed...
我觉得我在这里忽略了一些基本的东西。感谢您的帮助。
最佳答案
发生缺少分隔符
错误是因为include_submake
的非空返回值,在您的情况下它是单个换行符。 Make 只允许空白字符(即空格或制表符)出现在不被假定为某些规则或另一个指令的一部分的表达式中。
使用普通的 Make 变量赋值重写您的函数,错误就会消失:
push_dir = \
$(info $1)
pop_dir = \
$(info $1)
include_submake = \
$(call push_dir,$1) \
$(call pop_dir,$1)
define
与普通旧变量赋值回答第一条评论中的问题。就我个人而言,我更喜欢在某些情况下使用 define
指令。
eval
函数一起使用正如 GNU Make 手册所建议的,define
指令与 eval
function 结合使用非常有用。 。手册中的示例(重点是我的):
PROGRAMS = server clientserver_OBJS = server.o server_priv.o server_access.oserver_LIBS = priv protocolclient_OBJS = client.o client_api.o client_mem.oclient_LIBS = protocol# Everything after this is generic.PHONY: allall: $(PROGRAMS)define PROGRAM_template $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) ALL_OBJS += $$($(1)_OBJS)endef$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))$(PROGRAMS): $(LINK.o) $^ $(LDLIBS) -o $@clean: rm -f $(ALL_OBJS) $(PROGRAMS)
逐字变量非常适合您想要从 GNU Make 生成文件的情况。例如,考虑根据 Makefile 中的一些信息生成头文件。
# Args:# 1. Header identifier.define header_template/* This file is generated by GNU Make $(MAKE_VERSION). */#ifndef $(inclusion_guard)#define $(inclusion_guard)$(foreach inc,$($1.includes),#include <$(inc).h>)/* Something else... */#endif /* $(inclusion_guard) */endef# 1. Unique header identifier.inclusion_guard = \ __GEN_$1_H# Shell escape.sh_quote = \ '$(subst ','"'"',$1)'foo.includes := bar bazHEADERS := foo.h$(HEADERS) : %.h : @printf "%s" $(call sh_quote,$(call header_template,$(*F)))> $@
在我们的项目中,我们使用自己的构建系统,名为 Mybuild ,并且它完全是在 GNU Make 之上实现的。作为我们用来改善 Make 内置语言的糟糕语法的低级 hack 之一,我们开发了一个 special script它允许使用扩展语法来定义函数。脚本本身也是用 Make 编写的,因此它是一种 Make 中的元编程。
特别是,可以使用以下功能:
$(assert ...)
或 $(lambda ...)
$(eq s1,s2)
(字符串相等性检查)这是如何使用扩展语法编写函数的示例。请注意,它成为有效的 Make 函数,并且可以在调用 $(def_all)
后照常调用。
# Reverses the specified list.# 1. The list# Return:# The list with its elements in reverse order.define reverse # Start from the empty list. $(fold ,$1, # Prepend each new element ($2) to # the result of previous computations. $(lambda $2 $1))endef$(def_all)
使用这些新功能,我们能够实现一些非常酷的东西(嗯,至少对于 Make 来说:-)),包括:
请随意使用 the code 的任何部分在您自己的项目中!
关于makefile 缺少分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10883666/
我有一个 Makefile,它针对特定目标调用另一个 Makefile。假设主 Makefile 包含 some_dir/some_target: cd some_dir && make so
这两个文件大多出现在开源项目中。 它们的用途是什么?它们如何工作? 最佳答案 Makefile.am 是程序员定义的文件,由 automake 使用来生成 Makefile.in 文件( .am 代表
我的源代码位于一堆子目录中,例如: src/widgets/apple.cpp src/widgets/knob.cpp src/tests/blend.cpp src/ui/flash.cpp 在项
这就是我所拥有的: SUBDIRS = src/lib/ResourceManager all: $(SUBDIRS) $(SUBDIRS): make install -C $@ 我正在尝试
我想写一个 Makefile 来执行来自两个不同数组的两个输入的命令例如 a = A B C b = 1 2 3 ./run A 1 ./run B 2 ./run C 3 我不知道怎么写,因为在Ma
在 GNU make 手册的早期部分之一,Section 3.7 , 有一个 makefile 配方的大纲 immediate : immediate ; deferred defer
是否存在将 gmake 的 GNU Makefile 转换为可用于 make (FreeBSD-make) 的 Makefile 的实用程序? 最佳答案 该实用程序称为开发人员(程序员,制作大师,..
所以我前段时间了解了什么是 Makefile,创建了一个模板 Makefile,我所做的就是为我正在执行的每个程序复制和更改相同的文件。我改了几次,但它仍然是一个非常粗糙的Makefile。我应该如何
我正在做一些 Makefile 重构,并试图找出最简洁的方法来实现一个 Makefile,它执行以下操作: 有一个变量列出了所有源文件(可以是 C 和 C++ 文件) 所有目标文件都在 OBJ_DIR
我正在尝试创建一个 Makefile,它将通过 tic 编译位于目录中的 terminfo 文件。 tic 还将它自动创建的 termcap 文件复制到系统或用户特定的目标文件夹。对于普通用户,如果
我想要类似的东西 BROKEN_THINGS = \ thing1 \ # thing1 is completely broken thing2 \ # thing2 is broken to
如果我的程序必须为不同的结果(主要是错误)返回不同的值(例如 0、1、2、3 等),则调用该程序的 makefile 将不得不停止执行其余的 makefile 命令。即使该命令产生错误(返回非零值),
我正在学习使用漂亮的 Linux 工具:make。还有一点我想了解的: 让我们看一下这个简单的例子: JADE = $(shell find pages/*.jade) HTML = $(JADE:.
假设您有一个包含两个伪目标“all”和“debug”的 Makefile。 'debug' 目标旨在构建与 'all' 相同的项目,除了一些不同的编译开关(例如 -ggdb)。由于目标使用不同的编译开
我有一个调用多个其他生成文件的生成文件。 我想将 -j 参数传递给其他 makefile 调用。 类似(make -j8): all: make -f libpng_linux.mk -j
我处理过的 Makefile 大部分都很复杂,并且隐藏了很多关系。我自己从来没有写过一个,想知道是否有人有一些关于编写易于阅读和可重用的 Makefile 的提示? 最佳答案 我通常使用这样的东西,在
嘿,我有一个简单的“主” Makefile,它只是调用其他 makefile。我正在尝试执行以下操作,以便以正确的顺序构建组件: LIB_A = folder_a LIB_B = folder_b L
生成文件: #there is a whitespace after "/my/path/to" FOO = "/my/path/to" BAR = "dir" INCLUDE_DIRS = $(FO
我正在学习 makefile,我知道如何创建一个简单的 makefile。我正在继续使用嵌套的 makefile。这是我的目录结构 /src ...makefile ...main.cpp ...fo
什么TEMP0_FILES下面计算到? SOURCE_FILES可以等于多个源文件。请告诉我以下语法 :.cpp=.o 的用途 SOURCE_FILES = main.cpp TEMP0_FILES
我是一名优秀的程序员,十分优秀!