На самом деле, ваш второй пример должен работать просто отлично. На основании ошибки, которую вы видите, я предполагаю, что, хотя вы здесь правильно ввели код, то, что вы на самом деле имеете в Ваш make-файл выглядит примерно так:
ifneq ($(MY_VARIABLE),true)
define my-function
thing1
thing2
endef
else
define my-function
include $(BUILD_SYSTEM)/my_function.mk
endef
endif
То есть у вас есть директива include
внутри директива define
. Это не сработает, потому что define
работает. Помните, что define
- это просто синтаксический сахар, облегчающий создание переменных с многострочными значениями. Это означает, что, концептуально в любом случае, это:
define FOO
something
endef
такой же, как этот:
FOO=something
Итак, я подозреваю, что вы действительно сделали my-function=include my_function.mk
. Затем, когда вы пытаетесь сослаться на my-function
, он расширяется до include my_function.mk
, который впоследствии передается оболочке, что, разумеется, не имеет смысла.
Чтобы было совершенно ясно, вот как вы можете сделать эту работу. Сначала убедитесь, что у вас есть define
/ endef
в my_function.mk:
.
define my-function
red fish
blue fish
endef
, а затем в defines.mk вам нужно это:
ifneq ($(MY_VARIABLE),true)
define my-function
thing1
thing2
endef
else
include $(BUILD_SYSTEM)/my_function.mk
endif
Обратите внимание на отсутствие линий define
/ endef
вокруг линии include
!