пользовательские функции makefile - PullRequest
1 голос
/ 19 февраля 2012

Я пытаюсь создать пользовательскую функцию в Makefile, чтобы определить текущую платформу и вернуть соответствующий файл соответственно.Вот моя попытка.

UNAME := $(shell uname -s)

define platform
    ifeq ($(UNAME),Linux)
        $1
    else ifneq ($(findstring MINGW32_NT, $(UNAME)),)
        $2
    else ifeq ($(UNAME),Darwin)
        $3
    endif
endef

all:
    @echo $(call platform,linux,windows,mac)

Не удается выполнить следующую ошибку.

/bin/sh: Syntax error: "(" unexpected
[Finished]make: *** [all] Error 2

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2012

ifeq ... else ... endif являются условными директивами в GNU Make, они не могут появляться внутри define ... endef, потому что последний обрабатывает их как буквальный текст.(Попробуйте удалить знак @ рядом с командой echo, и вы увидите фактический результат оценки функции platform)

Я бы переместил условия из директивы define.В любом случае, целевая платформа не может измениться во время выполнения Make, поэтому нет необходимости анализировать $(UNAME) каждый раз, когда вы вызываете platform.

ifeq ($(UNAME),Linux)
    platform = $1
else ifneq ($(findstring MINGW32_NT, $(UNAME)),)
    platform = $2
else ifeq ($(UNAME),Darwin)
    platform = $3
endif
1 голос
/ 19 февраля 2012

Другой вариант - объединить выходные данные uname, чтобы сформировать строку платформы в определенном формате и присвоить соответствующим образом make-файлам платформы:

ARCH := $(firstword $(shell uname -m))
SYS := $(firstword $(shell uname -s))

# ${SYS}.${ARCH} expands to Linux.x86_64, Linux.i686, SunOS.sun4u, etc..
include ${SYS}.${ARCH}.mk
...