Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите написать Makefile, с обработкой группы файлов 
V
    Опции темы
DTF
Дата 20.12.2010, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.9.2007

Репутация: нет
Всего: нет



Здравствуйте.

Есть проект на C++, в папке проекта есть каталоги cpp и h, в которых хранятся
cpp- и h-файла соответственно.

При сборке должен создаваться каталог obj, куда будут сохраняться объектные файлы,
причем для каждого cpp-файла соответствующий объектный файл должен иметь такое же имя
(ну, не считая изменившегося расширения).

Т.е. для файла cpp/file.cpp должен создаваться объектный файл obj/file.obj.

Проблема в том, что, например, майкросовтовский cl.exe не имеет возможности (по крайней мере, я не нашел)
записывать все получающиеся временные файлы в указанную директорию.
Ему нужно для каждого входного файла указать точное имя выходного.

Конечно, можно для каждого файла сделать отдельное правило сборки, но это неудобно, конечно же.
Написать bat-файл для сборки, который для каждого файла сформирует соответствующую команду тоже можно,
но и этот вариант мне не нравится smile


Поэтому прошу совета smile

P.S.
Это вопрос для самообразования, в реальной жизни он вряд ли будет использоваться в таком виде,
так что не нужно спрашивать "зачем тебе это надо?".

P.P.S.
если кто-нибудь расскажет, как решить эту задачу средствами CMake, то тоже буду очень благодарен,
т.к. с этой системой сборки практически не знаком. 
PM MAIL   Вверх
xvr
Дата 20.12.2010, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(DTF @  20.12.2010,  13:07 Найти цитируемый пост)
Проблема в том, что, например, майкросовтовский cl.exe не имеет возможности (по крайней мере, я не нашел)
записывать все получающиеся временные файлы в указанную директорию.
А по моему основная проблема в том, что 'майкросовтовский cl.exe' не работает пол Unix/Linux, ы?

gnu mnake:
Код

SRCS := $(wildcard cpp/*.cpp)
OBJS := $(patsubst cpp/%.cpp,obj/%.o,$(SRCS))

exe_file: $(OBJS)
        $(CPP) -o exe_file $(OBJS)

obj/%.o : cpp/%.cpp
    $(CPP) $(CPPFLAGS) -c $< -o $@



Добавлено через 2 минуты и 5 секунд
Еще смотри на vpath в gnu make


Это сообщение отредактировал(а) xvr - 20.12.2010, 15:15
PM MAIL   Вверх
DTF
Дата 20.12.2010, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.9.2007

Репутация: нет
Всего: нет



Цитата(xvr @ 20.12.2010,  15:13)
А по моему основная проблема в том, что 'майкросовтовский cl.exe' не работает пол Unix/Linux, ы?

А причем тут это?
У майкрософта есть nmake, который умеет читать make-файлы под Windows и вызывать cl в Windows.


За пример спасибо, буду пробовать и разбираться.
PM MAIL   Вверх
xvr
Дата 20.12.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(DTF @  20.12.2010,  15:41 Найти цитируемый пост)
А причем тут это?

При том, что раздел называется 'С/С++: Программирование под Unix/Linux'

Добавлено через 46 секунд
Или вы собрались nmake с cl вкупе из под Wine вызывать?

PM MAIL   Вверх
DTF
Дата 20.12.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.9.2007

Репутация: нет
Всего: нет



А, ну да, протупил :(

Написал не в тот раздел...

Модеры, если возможно - перенесите плс в кроссплатформенное программирование

Это сообщение отредактировал(а) DTF - 20.12.2010, 17:25
PM MAIL   Вверх
DTF
Дата 20.12.2010, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.9.2007

Репутация: нет
Всего: нет



Приведенное решение не работает :(

nmake ругается на строку
Код

SRCS := $(wildcard cpp/*.cpp)


Сообщение об ошибке следующее:
Цитата

makefile(1) : fatal error U1033: синтаксическая ошибка : "=" не требуется
Stop.


Ссылается на первую строку потому, что я для чистоты эксперимента создал вот такое Makefile:
Код

SRCS:=$(wildcard cpp/*.cpp)
OBJS:=$(patsubst cpp/%.cpp,obj/%.obj,$(SRCS))




Я поискал описание этой ошибки в гугле, нашел немного:
Цитата

NMAKE Fatal Error U1033
syntax error : ’string’ unexpected
The given string is not part of the valid syntax for a makefile. The following are examples of causes
and results of this error:
<...>
l If a macro definition in the makefile contained an equal sign (=) without a preceding name or if
the name being defined is a macro that expands to nothing, the following error occurs: syntax
error : ’=’ unexpected


Но в данном случае имя переменной есть, оно используется далее, каталог cpp тоже не пуст...

Я попытался проверить, находит ли функция wildcards файлы - написал такой Makefile:
Код

test:
    echo $(wildcard cpp/*.cpp)


на него получил ошибку 
Цитата

makefile(2) : fatal error U1000: syntax error : ')' missing in macro invocation
Stop.


не могу понять, в чем дело :(
PM MAIL   Вверх
xvr
Дата 20.12.2010, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(DTF @  20.12.2010,  23:01 Найти цитируемый пост)
Приведенное решение не работает :(
nmake ругается на строку
Это для gnu make'а. Он гораздо более продвинутый, чем nmake (последний по уровню развития находится где то недалеко от самого первого оригинального make'а, т.е. на уровне динозавров  smile )


PM MAIL   Вверх
DTF
Дата 20.12.2010, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.9.2007

Репутация: нет
Всего: нет



Нашел тему на stackoverflow с описанием похожей проблемы.

Насколько я понял (а понимаю я по-английски плохо smile ) nmake не умеет нормально работать с шаблонами.
Попробую на GNU make.

P.S.
Если кто-то сможет понять и рассказать, что написано по приведенной мной ссылке,
то буду благодарен smile


xvr, опередили smile

Это сообщение отредактировал(а) DTF - 20.12.2010, 23:18
PM MAIL   Вверх
DTF
Дата 21.12.2010, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.9.2007

Репутация: нет
Всего: нет



А если немного изменить задачу - пусть в каталоге cpp лежат не только файлы, но и другие каталоги,
в которых тоже лежат *.cpp-файлы?

Причем структура каталогов неизвестна на момент написание Makefile.

Возможно ли модифицировать шаблон $(wildcard cpp/*.cpp), чтобы он находил cpp-файлы в том числе и в поддиректориях?

(естественно, хочется сделать это средствами make, без использования команд оболочки)

Это сообщение отредактировал(а) DTF - 21.12.2010, 00:30
PM MAIL   Вверх
xvr
Дата 21.12.2010, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(DTF @  21.12.2010,  00:24 Найти цитируемый пост)
Возможно ли модифицировать шаблон $(wildcard cpp/*.cpp), чтобы он находил cpp-файлы в том числе и в поддиректориях?
Может быть и можно, надо читать info make. Явно можно с применением шела и внешних комманд:
Код

SRCS := $(sh find . -name "*.cpp")
как то так


PM MAIL   Вверх
DTF
Дата 21.12.2010, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.9.2007

Репутация: нет
Всего: нет



Я читал. Но переварить весь его объем пока не в состоянии.

А спрашивал именно 
Цитата
средствами make, без использования команд оболочки


Это сообщение отредактировал(а) DTF - 21.12.2010, 12:35
PM MAIL   Вверх
xvr
Дата 21.12.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: нет
Всего: 223



Цитата(DTF @ 21.12.2010,  12:34)
А спрашивал именно 
Цитата
средствами make, без использования команд оболочки

Похоже нельзя

PM MAIL   Вверх
DTF
Дата 24.12.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 4.9.2007

Репутация: нет
Всего: нет



Жаль.
Но все равно, спасибо, xvr, Вы очень помогли smile

Это сообщение отредактировал(а) DTF - 24.12.2010, 17:35
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0522 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.