Это можно сделать довольно гладко, используя рекурсию внутри GNU make, следующим образом:
_pos = $(if $(findstring $1,$2),$(call _pos,$1,\
$(wordlist 2,$(words $2),$2),x $3),$3)
pos = $(words $(call _pos,$1,$2))
Чтобы использовать его, вы должны $(call)
функцию pos
с двумя аргументами: элемент для поиска и список для поиска. Например,
$(call pos,a,a b c d e f g)
$(call pos,e,a b c d e f g)
$(call pos,g,a b c d e f g)
$(call pos,h,a b c d e f g)
$(call pos,e,))
Он работает путем повторения аргумента $2
до тех пор, пока не сможет найти значение в $1
. Каждый раз, когда он повторяется, он отрубает голову $2
, используя $(wordlist 2,$(words $2),$2)
. Каждый раз, когда повторяется, он добавляет x
к возвращаемой строке, так что есть один x
для каждой позиции через $2
до того места, где был найден $1
.
Затем он просто использует $(words)
для подсчета длины возврата от _pos
(количество x
с).
Если вы используете проект GMSL, это может быть написано более гладко, напишите это как:
_pos = $(if $(findstring $1,$2),$(call $0,$1,$(call rest,$2),x $3),$3)
pos = $(words $(call _$0,$1,$2))
Обратите внимание, что здесь я использовал $0
, который будет содержать имя текущей функции (это стандартная функция GNU make) и функцию GMSL rest
, чтобы убрать голову из списка.