makefile:使用中缀运算符连接文本
makefile: concatenate text with infix operator
GNU make 中是否有一个简单的函数来连接文本并在各个部分之间放置一个 "operator"?我的意思是,运算符令牌必须出现 n-1 次,并且只能出现在两个令牌之间。
示例:我有一个变量,其中包含要从编译中排除的路径列表:
EXCLUDE_PATH = $(BASE_DIR)/aaa* $(BASE_DIR)/bbb*
稍后我想使用该变量为 find
命令生成排除规则,例如:
-not \( -path '$(BASE_DIR)/aaa*' -o -path '$(BASE_DIR)/bbb*' \)
注意它们之间的 -o
。
第一次尝试:
FIND_EXCL_LIST = $(EXCLUDE_PATH:%=-path '%' -o)
FIND_EXCL_RULE = -not \( $(FIND_EXCL_LIST) \)
但这会在最后留下一个额外的-o
,导致错误。
目前我求助于在末尾添加一个 -false
作为存根 OR 参数。
如果我更喜欢将变量定义与其特定用途分离,是否有更简单的方法可以使用预定义函数来实现这一点?
Louis 是正确的:没有神奇的方法可以做到这一点。但是,如果不是尝试删除最后一项或对其进行特殊处理,而是对第一项进行特殊处理,那么这项工作就更容易理解了(我认为);您可以创建一个带有两个参数的函数 combine
:第一个是要放在单词之间的文本,第二个是要组合的 space 分隔的单词列表:
combine = $(word 1,) $(foreach W,$(wordlist 2,$(words ),), $W)
现在你可以这样使用了:
$(call combine,-o,$(EXCLUDE_LIST))
获得如下输出:
$(BASE_DIR)/aaa* -o $(BASE_DIR)/bbb*
GNU make 中是否有一个简单的函数来连接文本并在各个部分之间放置一个 "operator"?我的意思是,运算符令牌必须出现 n-1 次,并且只能出现在两个令牌之间。 示例:我有一个变量,其中包含要从编译中排除的路径列表:
EXCLUDE_PATH = $(BASE_DIR)/aaa* $(BASE_DIR)/bbb*
稍后我想使用该变量为 find
命令生成排除规则,例如:
-not \( -path '$(BASE_DIR)/aaa*' -o -path '$(BASE_DIR)/bbb*' \)
注意它们之间的 -o
。
第一次尝试:
FIND_EXCL_LIST = $(EXCLUDE_PATH:%=-path '%' -o)
FIND_EXCL_RULE = -not \( $(FIND_EXCL_LIST) \)
但这会在最后留下一个额外的-o
,导致错误。
目前我求助于在末尾添加一个 -false
作为存根 OR 参数。
如果我更喜欢将变量定义与其特定用途分离,是否有更简单的方法可以使用预定义函数来实现这一点?
Louis 是正确的:没有神奇的方法可以做到这一点。但是,如果不是尝试删除最后一项或对其进行特殊处理,而是对第一项进行特殊处理,那么这项工作就更容易理解了(我认为);您可以创建一个带有两个参数的函数 combine
:第一个是要放在单词之间的文本,第二个是要组合的 space 分隔的单词列表:
combine = $(word 1,) $(foreach W,$(wordlist 2,$(words ),), $W)
现在你可以这样使用了:
$(call combine,-o,$(EXCLUDE_LIST))
获得如下输出:
$(BASE_DIR)/aaa* -o $(BASE_DIR)/bbb*