для тех, кто не в теме: амальгаматор проходит по .h/.cpp файлам и заменяет все #include выражения соответствующими им файлами... идея была подсмотрена во фреймворке Juce, смысл в том, что вместо генерации .a/.lib для больших библиотек все файлы библиотеки амальгамируются и представляются как один .h файл и один .cpp файл... вопрос: есть еще ли реализации амальгаматора, кроме того, который есть во фреймворке Juce?
Rel Да активно это юзается ... Особенно удобно когда порты делать на разные компилеры .. при чем самые простые ти MSVS -> WDK и на оборот .. или в тот же cygwin ... Не надо все файлы прописывать по всех сборочных файлах, и кросс для компилиров, причем как правильно дефайнов в главном заголовочном файле хватает на все!!! а если еще генерация добавить из python (или bat на крайняк) так целевые файлы практически не нужны, но правда время компиляции повышается чаще рекомпилы ну и конечно что то с цемто зачемто линковать ...
я не спрашиваю, юзается это или нет... я спрашиваю, какие кроссплатформенные реализации амальгаматоров существуют, кроме той реализации, что есть в Juce фреймворке? мне нужен готовый амальгаматор с открытым исходным кодом (ну или с закрытым исходным кодом, но имеющий бинарные сборки под Windows и Linux), тот что в Juce фреймворке слишком завязан на сам фреймворк... допустим у тебя есть библиотека, состоящая из N файлов .h и .cpp... ты пишешь шаблоны вида: Код (Text): // amalgamated.h #include "1.h" #include "2.h" ... #include "N.h" // amalgamated.cpp #include "1.cpp" #include "2.cpp" ... #include "N.cpp" запускаешь амальгаматор и на выходе получаешь только 2 файл amalgamated.h и amalgamated.cpp, которые любой другой программист может включить к себе в проект и использовать всю библиотеку целиком...
Я напишу вам амальгаматор. Смотрите: Код (Text): rm tmp.cpp for i in *.cpp; do echo '#include "'$i'"' >>tmp.cpp done gcc -o amalgamed.cpp -E tmp.cpp rm tmp.cpp С заголовками, правда, сложнее... Но если предположить немного ручной работы со стороны программиста, который во-первых, составит список заголовков, куда не будут включаться заголовки "для внутреннего использования" и, во-вторых, расположит эти заголовки в списке в нужном порядке, то дальше будет просто: Код (Text): cat headers.list | xargs cat >amalgamed.h
Rel А вот клейщиков вроде нет, это целый компилер нужен из за препроцессора + парсинг make(source или .proj)... Ну конечно если это что то разумное ... Вообще плагин для студии или еще чего ... Но я не видел ... Dukales Да сейчас так модно. и гугл потом не ищет...
вообще ты мне подкинул идею... берем допустим два файла, делаем шаблон: Код (Text): // 1.cpp: void Func1() { printf("Func1\n"); } // 2.cpp void Func2() { printf("Func2\n"); } // alma.cpp #include "1.cpp" #include "2.cpp" делаем вывод препроцессора gcc: Код (Text): > g++ -E amal.cpp -o amal_out.cpp получаем вывод: Код (Text): # 1 "amal.cpp" # 1 "<built-in>" # 1 "<command-line>" # 1 "amal.cpp" # 1 "1.cpp" 1 void Func1() { printf("Func1\n"); } # 2 "amal.cpp" 2 # 1 "2.cpp" 1 void Func2() { printf("Func2\n"); } # 2 "amal.cpp" 2 в принципе довольно близко к тому, что нужно))) надо только поискать, как управлять препроцессором, например как-нить глубину инклудов контролировать, чтобы он не раскрывал инклуды стандартных хедером, например #include <stdio.h>, ну и так далее))) интересно, возможно ли такое на препроцессинге gcc?
Rel man cpp Можно, взять sed, и поработать над файлом, прежде чем пихать в препроцессор. А потом поработать "обратно". Можно попробовать сунуть в препроцессор флаг -nostdinc, только при этом, боюсь те директивы, которые не удастся раскрыть, пропадут из вывода.
не... похоже, что с использованием препроцессора такого не провернуть... нужна сторонняя тулза... все еще жду предложений)))