зависимости .cpp от .h. Как?
От: _Winnie Россия C++.freerun
Дата: 03.11.05 11:53
Оценка:
Как студия умудряется их разруливать? Неужели она препроцессирует каждый .cpp, что бы найти, от каких файлов он зависит? Но это бы работало слишком долго.

Как самостоятельно автоматически строить зависимости? Нужно для велосипедного make, генерирующегося из vcproj.
Правильно работающая программа — просто частный случай Undefined Behavior
Re: зависимости .cpp от .h. Как?
От: Сергей Мухин Россия  
Дата: 03.11.05 12:09
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Как студия умудряется их разруливать? Неужели она препроцессирует каждый .cpp, что бы найти, от каких файлов он зависит? Но это бы работало слишком долго.


_W>Как самостоятельно автоматически строить зависимости? Нужно для велосипедного make, генерирующегося из vcproj.


почему долго?
---
С уважением,
Сергей Мухин
Re: зависимости .cpp от .h. Как?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.11.05 12:16
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Как студия умудряется их разруливать? Неужели она препроцессирует каждый .cpp, что бы найти, от каких файлов он зависит? Но это бы работало слишком долго.


Это даже на Ruby очень быстро работает. Все упирается в скорость чтения с диска.

_W>Как самостоятельно автоматически строить зависимости?


Могу кодом на Ruby поделиться, если хочешь. Он не сильно замороченный, даже комментарии не обрабатывает А можешь и сам на C++ написать. Хоть вручную файл просматривать, хоть через regex.

_W> Нужно для велосипедного make, генерирующегося из vcproj.


Нашего полку прибывает

Может лучше vcproj преобразовывать в какой-то уже существующий формат?
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: зависимости .cpp от .h. Как?
От: _Winnie Россия C++.freerun
Дата: 03.11.05 12:20
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, _Winnie, Вы писали:


_W>>Как студия умудряется их разруливать? Неужели она препроцессирует каждый .cpp, что бы найти, от каких файлов он зависит? Но это бы работало слишком долго.


_W>>Как самостоятельно автоматически строить зависимости? Нужно для велосипедного make, генерирующегося из vcproj.


СМ>почему долго?


Ну, представь себе проектик из 600 .cpp файлов. Каждый из них надо проверить, и из каждого открыть еще сотню-другую .h файлов(в том числе из стандартных), и не тупо проверить даты модификации, а пройтись препроцессором. Студия с этим справляется за секунду.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[3]: зависимости .cpp от .h. Как?
От: Сергей Мухин Россия  
Дата: 03.11.05 12:24
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>>>Как самостоятельно автоматически строить зависимости? Нужно для велосипедного make, генерирующегося из vcproj.


СМ>>почему долго?


_W>Ну, представь себе проектик из 600 .cpp файлов. Каждый из них надо проверить, и из каждого открыть еще сотню-другую .h файлов(в том числе из стандартных), и не тупо проверить даты модификации, а пройтись препроцессором. Студия с этим справляется за секунду.


у нас это делается приблизительно так.
при первой компиляции компилер выдает среде разработки список зависимостей (да и не только при первой). они учитываются в дереве проекта. все.
---
С уважением,
Сергей Мухин
Re[2]: зависимости .cpp от .h. Как?
От: _Winnie Россия C++.freerun
Дата: 03.11.05 12:29
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, _Winnie, Вы писали:

_W>>Как студия умудряется их разруливать? Неужели она препроцессирует каждый .cpp, что бы найти, от каких файлов он зависит? Но это бы работало слишком долго.
E>Это даже на Ruby очень быстро работает. Все упирается в скорость чтения с диска.
_W>>Как самостоятельно автоматически строить зависимости?
E>Могу кодом на Ruby поделиться, если хочешь. Он не сильно замороченный, даже комментарии не обрабатывает А можешь и сам на C++ написать. Хоть вручную файл просматривать, хоть через regex.

Вот так просто?

Надо посмотреть, может ли студия разрулить кошмар вроде

#include BOOST_PP_STRINGIZE(BOOST__PP_CAT(algo, rithm))

_W>> Нужно для велосипедного make, генерирующегося из vcproj.


E>Нашего полку прибывает


E>Может лучше vcproj преобразовывать в какой-то уже существующий формат?


А во что? Для чего есть тулзы параллельного build? для boost.jam нет чего-нибудь такого?
IncredyBuild не предлагать. Почему-то он у нас глючит, и он не работает с MinGW. И стоит, зараза, космических денег.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[3]: зависимости .cpp от .h. Как?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.11.05 12:34
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>>>Как самостоятельно автоматически строить зависимости?

E>>Могу кодом на Ruby поделиться, если хочешь. Он не сильно замороченный, даже комментарии не обрабатывает А можешь и сам на C++ написать. Хоть вручную файл просматривать, хоть через regex.

_W>Вот так просто?


Что именно "вот так просто?"
Если тебе нужно просто нормальные #include обработать, то все, действительно, просто.
А если вот это:

_W>#include BOOST_PP_STRINGIZE(BOOST__PP_CAT(algo, rithm))


то либо использовать возможности компилятора (не знаю, как VC++, а GNU C++ умеет зависимости показывать).
А еще лучше не заморачиваться на такие вещи. ИМХО.

E>>Может лучше vcproj преобразовывать в какой-то уже существующий формат?


_W>А во что? Для чего есть тулзы параллельного build? для boost.jam нет чего-нибудь такого?


Даже некоторые обычные make, имхо, умеют. И Boost.Jam, кажется, умел.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: зависимости .cpp от .h. Как?
От: Глеб Алексеев  
Дата: 03.11.05 12:35
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Как студия умудряется их разруливать? Неужели она препроцессирует каждый .cpp, что бы найти, от каких файлов он зависит? Но это бы работало слишком долго.

_W>Как самостоятельно автоматически строить зависимости? Нужно для велосипедного make, генерирующегося из vcproj.
У cl есть ключик /showIncludes. Правда, придется как-то отличать стандартные файлы от файлов проекта.

А g++ вроде тоже должен быть аналогичный ключик. Насколько я знаю (а в сборке проектов без студии — я еще тот ламер), это обычный подход. Даже для ocaml есть утилита ocamldep, которая генерит зависимости в виде
filename.cmo : filename.ml (cmo -объектник, ml — исходник).

а в конце мэйкфайла вставляешь include .depend и все.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: зависимости .cpp от .h. Как?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.11.05 12:41
Оценка: 5 (1)
Здравствуйте, _Winnie, Вы писали:

_W>А во что? Для чего есть тулзы параллельного build? для boost.jam нет чего-нибудь такого?


usage: d:\bin\bjam.EXE [ options ] targets...

-a      Build all targets, even if they are current.
-dx     Set the debug level to x (0-9).
-fx     Read x instead of Jambase.
-jx     Run up to x shell commands concurrently.
-n      Don't actually execute the updating actions.
-ox     Write the updating actions to file x.
-q      Quit quickly as soon as a target fails.
-sx=y   Set variable x=y, overriding environment.
-tx     Rebuild x, even if it is up-to-date.
-v      Print the version of jam and exit.
--x     Option is ignored.


_W>IncredyBuild не предлагать. Почему-то он у нас глючит, и он не работает с MinGW. И стоит, зараза, космических денег.


На эту тему: build или make &mdash; какая разница?
Автор: NikUsv
Дата: 17.08.05
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: зависимости .cpp от .h. Как?
От: Глеб Алексеев  
Дата: 03.11.05 12:48
Оценка: :))) :)))
Здравствуйте, Глеб Алексеев, Вы писали:

ГА> Даже для ocaml есть утилита ocamldep, которая генерит зависимости в виде

ГА>filename.cmo : filename.ml (cmo -объектник, ml — исходник).
Вот здесь глупость сморозил, ocamldep именно зависимости между модулями разгребает.

(Доктор, я разговариваю сам с собой на тему ОКамл в форуме по С/С++, что мне делать?)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: зависимости .cpp от .h. Как?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.11.05 12:58
Оценка: 4 (1) +1
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>(Доктор, я разговариваю сам с собой на тему ОКамл в форуме по С/С++, что мне делать?)



Напиши на RSDN статью про OCaml. А то о нем тут время от времени вспоминают. У меня даже какая-то здоровенная PDF-ка про OCaml на англицком лежит, да только времени читать нет. А если бы обзорная статья на русском -- было бы здорово.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[4]: зависимости .cpp от .h. Как?
От: Глеб Алексеев  
Дата: 03.11.05 13:04
Оценка:
Здравствуйте, eao197, Вы писали:

E>Напиши на RSDN статью про OCaml. А то о нем тут время от времени вспоминают. У меня даже какая-то здоровенная PDF-ка про OCaml на англицком лежит, да только времени читать нет. А если бы обзорная статья на русском -- было бы здорово.


Может быть, когда нибудь. Пока только делаю первые неуклюжие шаги, рановато статьи писать. Это скорее к Quintanar'у или Gaperton'у, но они отчего-то предпочитают держать нас в неведении .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: зависимости .cpp от .h. Как?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.11.05 13:07
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

E>>Напиши на RSDN статью про OCaml. А то о нем тут время от времени вспоминают. У меня даже какая-то здоровенная PDF-ка про OCaml на англицком лежит, да только времени читать нет. А если бы обзорная статья на русском -- было бы здорово.


ГА>Может быть, когда нибудь. Пока только делаю первые неуклюжие шаги, рановато статьи писать. Это скорее к Quintanar'у или Gaperton'у, но они отчего-то предпочитают держать нас в неведении .


Может просто у людей времени нет. Это ведь совсем не такое простое занятие. По собственному опыту
Автор: Евгений Охотников
Дата: 23.05.05
знаю.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[6]: офтопить так по-крупному
От: Глеб Алексеев  
Дата: 03.11.05 13:16
Оценка:
Здравствуйте, eao197, Вы писали:

E>Может просто у людей времени нет. Это ведь совсем не такое простое занятие. По собственному опыту
Автор: Евгений Охотников
Дата: 23.05.05
знаю.

Т.к. я еще по совместительству немножечко аспирант заочной формы обучения, то я в курсе . Оттого и не берусь, хотя самому интересно (зубров ФЯ на сайте несколько имеется, а статьи — ни одной, за державу обидно, надо же как-то нести свет в массы ).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: зависимости .cpp от .h. Как?
От: _Winnie Россия C++.freerun
Дата: 03.11.05 13:16
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, _Winnie, Вы писали:


_W>>А во что? Для чего есть тулзы параллельного build? для boost.jam нет чего-нибудь такого?


E>
E>usage: d:\bin\bjam.EXE [ options ] targets...

E>-a      Build all targets, even if they are current.
E>-dx     Set the debug level to x (0-9).
E>-fx     Read x instead of Jambase.
E>-jx     Run up to x shell commands concurrently.
E>-n      Don't actually execute the updating actions.
E>-ox     Write the updating actions to file x.
E>-q      Quit quickly as soon as a target fails.
E>-sx=y   Set variable x=y, overriding environment.
E>-tx     Rebuild x, even if it is up-to-date.
E>-v      Print the version of jam and exit.
E>--x     Option is ignored.
E>


Ничто не понял. А где флаг который запускает на нескольких компьютерах?

_W>>IncredyBuild не предлагать. Почему-то он у нас глючит, и он не работает с MinGW. И стоит, зараза, космических денег.


E>На эту тему: build или make &mdash; какая разница?
Автор: NikUsv
Дата: 17.08.05


Не понял. Я же сказал, IncrediBuild не предлагать. А там советуют именно его.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[5]: зависимости .cpp от .h. Как?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.11.05 13:25
Оценка:
Здравствуйте, _Winnie, Вы писали:

E>>
E>>usage: d:\bin\bjam.EXE [ options ] targets...

E>>-a      Build all targets, even if they are current.
E>>-dx     Set the debug level to x (0-9).
E>>-fx     Read x instead of Jambase.
E>>-jx     Run up to x shell commands concurrently.
E>>-n      Don't actually execute the updating actions.
E>>-ox     Write the updating actions to file x.
E>>-q      Quit quickly as soon as a target fails.
E>>-sx=y   Set variable x=y, overriding environment.
E>>-tx     Rebuild x, even if it is up-to-date.
E>>-v      Print the version of jam and exit.
E>>--x     Option is ignored.
E>>


_W>Ничто не понял. А где флаг который запускает на нескольких компьютерах?


Месье, вам нужна параллельная или распределенная компиляция?

_W>>>IncredyBuild не предлагать. Почему-то он у нас глючит, и он не работает с MinGW. И стоит, зараза, космических денег.


E>>На эту тему: build или make &mdash; какая разница?
Автор: NikUsv
Дата: 17.08.05


_W>Не понял. Я же сказал, IncrediBuild не предлагать. А там советуют именно его.


Там еще и distcc упоминают.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[6]: зависимости .cpp от .h. Как?
От: _Winnie Россия C++.freerun
Дата: 03.11.05 14:33
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, _Winnie, Вы писали:

_W>>Ничто не понял. А где флаг который запускает на нескольких компьютерах?
E>Месье, вам нужна параллельная или распределенная компиляция?

Распределенная. Что бы ускорить.
Хмммм. А что такое параллельная?

_W>>Не понял. Я же сказал, IncrediBuild не предлагать. А там советуют именно его.

E>Там еще и distcc упоминают.
Ну, меня насторожило, что его назвали компилятором, а не build-системой. А портировать мегабайты кода с gcc/ms-specific под неизвестный компилятор...
Сейчас ещё раз посмотрю, что это.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[7]: зависимости .cpp от .h. Как?
От: _Winnie Россия C++.freerun
Дата: 03.11.05 14:38
Оценка:
Здравствуйте, _Winnie, Вы писали:
_W>Здравствуйте, eao197, Вы писали:
E>>Здравствуйте, _Winnie, Вы писали:

E>distcc: a fast, free distributed C/C++ compiler

Не под винду
Правильно работающая программа — просто частный случай Undefined Behavior
Re[7]: зависимости .cpp от .h. Как?
От: Глеб Алексеев  
Дата: 03.11.05 14:45
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Распределенная. Что бы ускорить.

Еще попытай счастья здесь
Автор: Gaperton
Дата: 03.10.05
.

Бессовестный PR: люди, читайте форум "Декларативное программирование"! .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: зависимости .cpp от .h. Как?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.11.05 14:45
Оценка:
Здравствуйте, _Winnie, Вы писали:

E>>Здравствуйте, _Winnie, Вы писали:

_W>>>Ничто не понял. А где флаг который запускает на нескольких компьютерах?
E>>Месье, вам нужна параллельная или распределенная компиляция?

_W>Распределенная. Что бы ускорить.

_W>Хмммм. А что такое параллельная?

Параллельная, это когда на одной машине несколько исходных файлов одного проекта компилируются одновременно. Если машина многопроцессорная, то это может дать серьезный выигрыш.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[8]: зависимости .cpp от .h. Как?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.11.05 14:45
Оценка:
Здравствуйте, _Winnie, Вы писали:

E>>>Здравствуйте, _Winnie, Вы писали:


E>>distcc: a fast, free distributed C/C++ compiler

_W>Не под винду

Это обертка над GNU C++. А под Windows она есть в составе cygwin-а.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: зависимости .cpp от .h. Как?
От: BLK Dragon  
Дата: 03.11.05 18:04
Оценка:
_W>Как самостоятельно автоматически строить зависимости? Нужно для велосипедного make, генерирующегося из vcproj.
У компилера как правило есть ключики, которые выдают депенденсы в формате понятном для make'ов; обычно есть и опции игнорирования стандартных header'ов.

В Intel'е и GCC такие опции есть, у Visual'а нет (может только в 8м -- давно его не смотрел).

У меня так всё и работает -- когда меняется .cpp, для него перегенерятся зависимости; зависимости include'яться в тот же makefile.
Re[2]: зависимости .cpp от .h. Как?
От: megawatt Россия http://ruby.inuse.ru
Дата: 03.11.05 18:08
Оценка: 5 (1)
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, _Winnie, Вы писали:


_W>>Как студия умудряется их разруливать? Неужели она препроцессирует каждый .cpp, что бы найти, от каких файлов он зависит? Но это бы работало слишком долго.

_W>>Как самостоятельно автоматически строить зависимости? Нужно для велосипедного make, генерирующегося из vcproj.
ГА>У cl есть ключик /showIncludes. Правда, придется как-то отличать стандартные файлы от файлов проекта.

ГА>А g++ вроде тоже должен быть аналогичный ключик. Насколько я знаю (а в сборке проектов без студии — я еще тот ламер), это обычный подход. Даже для ocaml есть утилита ocamldep, которая генерит зависимости в виде

ГА>filename.cmo : filename.ml (cmo -объектник, ml — исходник).

ГА>а в конце мэйкфайла вставляешь include .depend и все.


У gcc список инклудов можно вежливо попросить следующими опциями:

-MD или -MMD (без системных инклудов)

Стандартные файлы отличать не надо, они ни кому не мешают, вот кусочек make файла:


%.o: %.cpp
  g++ -c -MD $<

include $(wildcard *.d)


компилит все .cpp ставя все инклуды в зависимости

Для паралельной сборки у тогоже gmake есть опция -j 5, суть которой — выполнять независимые таргеты параллельно.
На больших проектах иногда в системе происходит переполнение таблицы открытых файлов, и gmake ведет себя непредсказуемо.
Решается проблема увеличением установленного лимита.
Re[3]: зависимости .cpp от .h. Как?
От: megawatt Россия http://ruby.inuse.ru
Дата: 03.11.05 18:11
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Надо посмотреть, может ли студия разрулить кошмар вроде


_W>#include BOOST_PP_STRINGIZE(BOOST__PP_CAT(algo, rithm))



Какие трудности? Студия проходится макропроцессором, и только потом компилит.
Re: зависимости .cpp от .h. Как?
От: KRA Украина  
Дата: 06.11.05 20:00
Оценка: 4 (1)
Здравствуйте, _Winnie, Вы писали:

_W>Как самостоятельно автоматически строить зависимости? Нужно для велосипедного make, генерирующегося из vcproj.


Посмотри может makedep подойдёт.
Пользовался — вроде ничего, правда, не знаю, справится ли с таким

_W>#include BOOST_PP_STRINGIZE(BOOST__PP_CAT(algo, rithm))
Re[6]: зависимости .cpp от .h. Как?
От: Erop Россия  
Дата: 06.11.05 21:47
Оценка:
Здравствуйте, eao197, Вы писали:

E>Месье, вам нужна параллельная или распределенная компиляция?


Не знаю как кому, а нам нужна параллельная и распределенная разработка.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: зависимости .cpp от .h. Как?
От: Alex Alexandrov США  
Дата: 11.11.05 05:54
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Как студия умудряется их разруливать? Неужели она препроцессирует каждый .cpp, что бы найти, от каких файлов он зависит? Но это бы работало слишком долго.


_W>Как самостоятельно автоматически строить зависимости? Нужно для велосипедного make, генерирующегося из vcproj.


Общая идея примерно такова:

cl -E test.c | sed -n "s/^#line [0-9]\+ //p" | sort | uniq
It's kind of fun to do the impossible (Walt Disney)
Re: зависимости .cpp от .h. Как?
От: Июнь  
Дата: 11.11.05 12:30
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Как самостоятельно автоматически строить зависимости? Нужно для велосипедного make, генерирующегося из vcproj.


Может исходники этого проекта помогут.
Re: зависимости .cpp от .h. Как?
От: BOPOH_N Россия  
Дата: 14.11.05 10:31
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Как студия умудряется их разруливать? Неужели она препроцессирует каждый .cpp, что бы найти, от каких файлов он зависит? Но это бы работало слишком долго.


_W>Как самостоятельно автоматически строить зависимости? Нужно для велосипедного make, генерирующегося из vcproj.


Смотрите boost 1.33 библиотека WAVE
есть даже готовый пример обработки прагм и поиска инклюженых файлов — "The quick_start sample"
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.