2015-09-05 6 views
0

Я пишу makefile, который создает несколько платформ (windows, iOS и т. Д.) Для разных конфигураций (отладка, выпуск). Мне удалось заставить его работать, он работает правильно, но я хотел бы сделать некоторые из моих правил более универсальными, чтобы не повторять их для каждой конфигурации.Использование шаблонов makefile в вызове функции

Каждый файл хранится в определенной структуре папок. Например, если вы создаете для iOS конфигурацию отладки, результирующий файл хранится в ios/debug. В качестве примера у меня есть правила для создания этих каталогов:

define libdir 
$(BINDIR)/$(strip $1)/$(strip $2) 
endef 

$(call libdir, ios, debug): 
    mkdir -p $(call libdir, ios, debug) 

$(call libdir, ios, release): 
    mkdir -p $(call libdir, ios, release) 

Я должен буду повторить эти правила для каждой конфигурации. Это не так много, но это может стать болью для поддержания. Я хотел бы сделать это более общее, что-то вроде этого (я знаю, что это не работает):

define libdir 
$(BINDIR)/$(strip $1)/$(strip $2) 
endef 

$(call libdir, %, %): 
    mkdir -p $(call libdir, ??, ??) 

Что бы создать любой каталог с данной структурой. Есть идеи?

+0

Почему вы используете 'strip' и как вы хотите вызывать make для создания, например, конфигурации отладки для iOS? – Beta

+0

Я использую 'strip', потому что иногда я использую пробелы при вызове функций, возможно, из-за опечаток. Он просто гарантирует, что пространство не имеет значения при передаче аргументов функции –

+0

У меня есть такие приложения, как 'iphone-debug',' iphone-release' и 'iphone' для обоих –

ответ

0

Похоже, что вместо этого вы можете использовать простой шаблон.

%/debug %/release: %: 
    mkdir -p [email protected] 

И тогда, вероятно, сделать каждую платформу зависит от этих каталогов:

ios android osx windows linux: %: $(LIBDIR)/%/debug $(LIBDIR)/%/release 
0

заявления как:

define libdir 
$(BINDIR)/$(strip $1)/$(strip $2) 
endef 

$(call libdir, %, %): 
     mkdir -p $(call libdir, ??, ??) 

просто полоски буквального характера %; функция strip расширяется, когда правило шаблона анализируется не тогда, когда правило совпадает.

Но это нормально, потому что это не имеет никакого отношения к другому пути. Прежде всего, вы не можете иметь несколько шаблонов в цели, поэтому правило $(BINDIR)/%/% не является законным шаблоном. Во-вторых, шаблон соответствует набору символов; неважно, каковы эти персонажи. Если вы хотите стричь, тогда вам нужно сделать полосой необходимое условие, используемое для соответствия этому правилу шаблона, а не полосовое правило шаблона. Например, где-то в вашем Makefile вы будете иметь правила, как:

foo: $(BINDIR)/$(FOO)/$(BAR) 

, что вы собираетесь, чтобы соответствовать этому шаблону: это то, что вам нужно раздеть, а не цель.

И только примечание, но вам не нужно использовать функцию внутри рецепта. Почему бы просто не использовать [email protected]?

$(BINDIR)/%: 
     mkdir -p [email protected]