Амальгаматор для C/C++ кода

Тема в разделе "LANGS.C", создана пользователем Rel, 19 ноя 2011.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    для тех, кто не в теме: амальгаматор проходит по .h/.cpp файлам и заменяет все #include выражения соответствующими им файлами... идея была подсмотрена во фреймворке Juce, смысл в том, что вместо генерации .a/.lib для больших библиотек все файлы библиотеки амальгамируются и представляются как один .h файл и один .cpp файл... вопрос: есть еще ли реализации амальгаматора, кроме того, который есть во фреймворке Juce?
     
  2. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Rel
    Да активно это юзается ... Особенно удобно когда порты делать на разные компилеры .. при чем самые простые ти MSVS -> WDK и на оборот .. или в тот же cygwin ... Не надо все файлы прописывать по всех сборочных файлах, и кросс для компилиров, причем как правильно дефайнов в главном заголовочном файле хватает на все!!! а если еще генерация добавить из python (или bat на крайняк) так целевые файлы практически не нужны, но правда время компиляции повышается чаще рекомпилы ну и конечно что то с цемто зачемто линковать ...
     
  3. Dukales

    Dukales New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2009
    Сообщения:
    199
    я не понял. это сейчас русский язык такой?
    это молодёжь современная так разговаривает?
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Dukales
    Нафаня, ты?

    Rel
    А нафига это?
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    я не спрашиваю, юзается это или нет... я спрашиваю, какие кроссплатформенные реализации амальгаматоров существуют, кроме той реализации, что есть в Juce фреймворке? мне нужен готовый амальгаматор с открытым исходным кодом (ну или с закрытым исходным кодом, но имеющий бинарные сборки под Windows и Linux), тот что в Juce фреймворке слишком завязан на сам фреймворк...

    допустим у тебя есть библиотека, состоящая из N файлов .h и .cpp... ты пишешь шаблоны вида:
    Код (Text):
    1. // amalgamated.h
    2. #include "1.h"
    3. #include "2.h"
    4. ...
    5. #include "N.h"
    6.  
    7. // amalgamated.cpp
    8. #include "1.cpp"
    9. #include "2.cpp"
    10. ...
    11. #include "N.cpp"
    запускаешь амальгаматор и на выходе получаешь только 2 файл amalgamated.h и amalgamated.cpp, которые любой другой программист может включить к себе в проект и использовать всю библиотеку целиком...
     
  6. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Я напишу вам амальгаматор. Смотрите:
    Код (Text):
    1. rm tmp.cpp
    2. for i in *.cpp; do
    3.     echo '#include "'$i'"' >>tmp.cpp
    4. done
    5.  
    6. gcc -o amalgamed.cpp -E tmp.cpp
    7. rm tmp.cpp
    С заголовками, правда, сложнее... Но если предположить немного ручной работы со стороны программиста, который во-первых, составит список заголовков, куда не будут включаться заголовки "для внутреннего использования" и, во-вторых, расположит эти заголовки в списке в нужном порядке, то дальше будет просто:
    Код (Text):
    1. cat headers.list | xargs cat >amalgamed.h
     
  7. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    [del]
    ступил
     
  8. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Rel
    А вот клейщиков вроде нет, это целый компилер нужен из за препроцессора + парсинг make(source или .proj)... Ну конечно если это что то разумное ... Вообще плагин для студии или еще чего ... Но я не видел ...


    Dukales
    Да сейчас так модно. и гугл потом не ищет...
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    вообще ты мне подкинул идею... берем допустим два файла, делаем шаблон:
    Код (Text):
    1. // 1.cpp:
    2. void Func1() { printf("Func1\n"); }
    3. // 2.cpp
    4. void Func2() { printf("Func2\n"); }
    5. // alma.cpp
    6. #include "1.cpp"
    7. #include "2.cpp"
    делаем вывод препроцессора gcc:
    Код (Text):
    1. > g++ -E amal.cpp -o amal_out.cpp
    получаем вывод:
    Код (Text):
    1. # 1 "amal.cpp"
    2. # 1 "<built-in>"
    3. # 1 "<command-line>"
    4. # 1 "amal.cpp"
    5. # 1 "1.cpp" 1
    6. void Func1() { printf("Func1\n"); }
    7. # 2 "amal.cpp" 2
    8. # 1 "2.cpp" 1
    9. void Func2() { printf("Func2\n"); }
    10. # 2 "amal.cpp" 2
    в принципе довольно близко к тому, что нужно))) надо только поискать, как управлять препроцессором, например как-нить глубину инклудов контролировать, чтобы он не раскрывал инклуды стандартных хедером, например #include <stdio.h>, ну и так далее))) интересно, возможно ли такое на препроцессинге gcc?
     
  10. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Rel
    man cpp
    Можно, взять sed, и поработать над файлом, прежде чем пихать в препроцессор. А потом поработать "обратно". Можно попробовать сунуть в препроцессор флаг -nostdinc, только при этом, боюсь те директивы, которые не удастся раскрыть, пропадут из вывода.
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    не... похоже, что с использованием препроцессора такого не провернуть... нужна сторонняя тулза... все еще жду предложений)))