LINUX.ORG.RU

Make и специальные символы в именах файлов (а также GNU/BSD-совместимость)

 , , ,


0

1

Всем здравствуйте.

Допустим, у меня есть исходный код на C, в пути к которому есть пробелы и двоеточия, и который собирается с помощью Make. Тогда, если подобное встречается в строке, где цель(и) и зависимости, спецсимволы должны быть экранированы с помощью \:

main: C\:/Program\ Files/main.c
        $(CC) -o $@ $<

В этом случае GNU Make ведёт себя логично, совершенно точно собирает всё, как надо, и не выдаёт малопонятной белиберды вроде

Makefile:1: *** target pattern contains no '%'.  Stop.

В то же время, насколько я могу судить, BSD Make (у меня в системе установлен bmake) этот самый бэкслэш игнорирует, считая его частью пути файла.

Вопрос: как в условиях задачи написать Makefile совместимым и с GNU, и с BSD?

★★★★★

Ты чОта странный. В NTFS запрещены */|"<>\\:?; и длину файлов на 250 символов. А в Linux/BSD ограничений нету вроде.

c0ne
()

Что-то мне кажется не стоит использовать пути с пробелами там, где используется make любого типа. Оно как-то проще.

wandrien ★★
()
Ответ на: комментарий от c0ne

ааа, пагади. Ты имеешь в виду, что определённая версия сама правильно парсит, а вторая нет? Так предварительно перекручивай путь сам.

if env win32 - blahblah else if darwin и так далее

c0ne
()

Конфирмлю проблему с FreeBSD’шным make (путаюсь в них, bmake или nmake).

hello,\ world: hello,\ world.cc
    c++ -o "hello, world" "hello, world.cc"

выдаёт make[1]: don't know how to make CMakeFiles/hello,\. Stop

Судя по беглому просмотру исходников, никакого эскейпинга и квотинга там не поддерживается вовсе.

Вопрос: как в условиях задачи написать Makefile совместимым и с GNU, и с BSD?

Никак. У тебя там ещё написано $(CC) -o $@ $<, это уже не совместимо с BSD make, там по-другому называются короткие переменные.

Зачем тебе это? Кто вообще под виндоговном будет собирать что-то make’ом, да ещё и BSD’шным? Хочешь переносимо - сделай CMake скрипт.

slovazap ★★★★★
()

Попробуй загнать C:/Program\ Files в переменну. А вообще лучше unix-пути использовать и запускать из msys-шелла

annulen ★★★★★
()
Ответ на: комментарий от slovazap

Зачем тебе это? Кто вообще под виндоговном будет собирать что-то make’ом, да ещё и BSD’шным? Хочешь переносимо - сделай CMake скрипт.

Ты же сам выше привёл пример той же проблемы не с виндой. А cmake не нужен.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

В makefile не пишут полный путь, в нём пишут путь относительно того места где расположен сам makefile, то есть никаких имён файлов кроме тех, что есть в самом дереве исходников, там быть не должно. Ну а в дереве своих исходников уж можно обойтись без пробелов, всё равно от них где-нить да вылезет проблема.

Если же ты хочешь засунуть в makefile логику сборки конкретно на этом компе, с использованием каких-то внешних (по отношению к проекту) исходников, расположенных по абсолютному пути - ну сделай этот путь тоже без пробелов ради такого. Хотя зачем тебе для такого совместимость с разными make - непонятно, всё равно переносимым оно не будет из-за виндопутей.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

В makefile не пишут полный путь, в нём пишут путь относительно того места где расположен сам makefile, то есть никаких имён файлов кроме тех, что есть в самом дереве исходников, там быть не должно.

В makefile много чего пишут, это универсальный инструмент, не ограниченный какими-то понятиями о каких-то исходниках и деревьях

annulen ★★★★★
()
Ответ на: комментарий от annulen

Если ты там только относительный путь напишешь, то тебе меньше танцевать на граблях придётся. Себе только жизнь упростишь, как подсказывает тебе человек выше.

misteralter
()
Ответ на: комментарий от xmikex

кто в Makefile прописывает полный путь к файлу вообще?

У нас тут не винфак, поэтому C:/Program Files/main.c – это как раз относительный путь. То же самое, что и ./C:/Program Files/main.c.

На UNIX, разумеется.

Bass ★★★★★
() автор топика
Ответ на: комментарий от annulen

Попробуй загнать C:/Program\ Files в переменну.

Будет ровно тот же самый эффект. Потому что Make анализирует Makefile в два прохода – сначала подставляя переменные, и затем анализируя граф зависимостей до цели.

Bass ★★★★★
() автор топика
Ответ на: комментарий от xmikex

относительный путь - это путь относительно положения Makefile. В него никак не может входить имя диска.

С чего ты взял?!

C: – это никакое не имя диска. Это просто имя каталога, состоящее из двух байт.

Bass ★★★★★
() автор топика
Ответ на: комментарий от slovazap

Спасибо.

Вопрос ни разу не про виндоговно.

Путь такой с пробелами написал скорее шутки ради, ну и для наглядности. Ничто другое «с пробелами» в голову не лезло.

Bass ★★★★★
() автор топика
Ответ на: комментарий от Bass

Даже если это так, то какой смысл Makefile, который расположен не внутри директории C:? То есть это получается типа wine директории под диск, если я правильно понимаю. Вообще нелогичная какая-то идея использовать для сборки каталоги вайна. Да ещё и Program Files.

xmikex ★★★★
()
Ответ на: комментарий от Bass

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

xmikex ★★★★
()
Ответ на: комментарий от xmikex

Блин, чувак, вот ты возбудился.

Никакой не вайн, не винда, и даже не ДОС.

Просто пример пути с пробелом и двоеточием в имени.

Для иллюстрации.

Ровно то же самое, что и foo:bar baz.

Bass ★★★★★
() автор топика
Последнее исправление: Bass (всего исправлений: 1)
Ответ на: комментарий от Bass

это в рассылке make обсуждали еще в 2004 году
https://lists.gnu.org/archive/html/bug-make/2004-10/msg00020.html
смысл в том, что сделать поддержку : в именах файлов - нарушить совместимость с другими Makefile, которые до внедрения поддержки были написаны.

There is no way to do this, which is why it's not described in the

manual.

>>mk> So I have to escape the :: somehow. But how?

You can't.

xmikex ★★★★
()

в пути к которому есть пробелы и двоеточия

Ты еще кириллицы туда добавить не забудь! А для полноты кайфа — всякие восклицательные знаки, амперсанды и вертикальные линии…

anonymous
()
Ответ на: комментарий от xmikex

Во, конструктивно.

Исчерпывающе.

Спасибо.

Bass ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.