2016-05-06 3 views
2

Привет Я пытаюсь создать Makefile У меня есть Makefile переменную, содержащую зависимые каталоги, какПривет, я пытаюсь понять и написать GNU Makefile. У меня есть переменная, содержащая зависимые direcotories

DEPDIR := temp foo bar 

мне нужен абсолютный путь каждого каталога. Итак, я написал правило:

DIRS := $(foreach dirs, $(DEPDIR), $(shell find $(HOME) -name "$$dirs")) 

, и я также пытался:

DIRS := $(notdir $(foreach dirs, $(DEPDIR), $(shell find $(HOME) -name "$$dirs"))) 

Но переменная DIRS в обоих случаях является пустым. Я что-то упустил?

+0

Пожалуйста, измените вопрос. – surajsn

ответ

0

Я понятия не имею, почему вы пишите двойной $: $$dirs. Попробуйте это:

DIRS := $(foreach dir, $(DEPDIR), $(shell find $(HOME) -type d -name "$(dir)")) 

Рассмотрим сузить критерии поиска, поскольку $(HOME) по определению может содержать что-либо.

Я думаю, вы не будете утверждать, что было бы лучше отслеживать зависимости проекта, используя выделенный каталог. Существует множество способов создания таких каталогов (создание символических ссылок, загрузка/извлечение сжатых пакетов, клонирование репозиториев, использование менеджеров пакетов и т. Д.). Поэтому я предлагаю следующий шаблон.

MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 
PROJECT_DIR := $(dir $(MAKEFILE_PATH)) 
DIRS := $(realpath $(addprefix $(PROJECT_DIR)deps/, dir1 dir2 dir3)) 

Здесь мы извлекаем имя текущего Makefile из MAKEFILE_LIST, а затем сохранить его абсолютный путь в MAKEFILE_PATH переменной. Затем часть каталога пути к файлу makefile хранится в PROJECT_DIR. С помощью addprefix мы добавим $(PROJECT_DIR)/deps в начало каждого зависимого каталога (dir1 dir2 dir3). Затем мы разрешаем символические ссылки и создаем канонические абсолютные имена для зависимых каталогов, а затем сохраняем их в DIRS.

+2

Это я или использую 'find' для такого рода сумасшедших? Как насчет addprefix и realpath/abspath? – hobbs

+0

@hobbs, мне тоже не нравится 'find'. Я только что ответил на вопрос. –

+0

здесь temp, foo и bar могут быть в любой точке нашей установки, а не в текущем каталоге. вот почему я использовал находку. Если какое-нибудь лучшее решение будет оценено –

0

Использование find для этого абсолютно дурацкое. Могут быть каталоги в другом месте в дереве каталогов с тем же именем, и в любом случае, по-видимому, те, которые вы хотите, находятся в текущем каталоге.

Если они могут быть вложены в других каталогах, работает findна текущей директории может иметь некоторый смысл, но вы, вероятно, просто ищете

$(patsubst %,${PWD}/%,$(DIRS)) 
Смежные вопросы