Кастомизировать компиляцию
От: Muxa  
Дата: 05.12.19 07:32
Оценка:
Идея следующая: допустим есть файл с кодом (code.cpp), хочется при его компиляции встроиться в эту процедуру и, при определенных условиях, на основе построенного AST сгенерить дополнительный файл (или даже несколько файлов) code.ex.cpp и также добавить его (их) в дальнейшую сборку проекта.
Знаю в qt происходит нечто похожее (moc-файлы).

Как такие вещи реализовываются? Почитал про clang/llvm, но там столько документации, что пока неясно в каком направлении двигаться.
Можно ли сделать универсальное решение под gcc/msvc/clang?

Чего хочется: максимальной портабельности между основными OS.
Чем можно пожертвовать: привязаться к конкретному компилятору в той части проекта, которая требует такой кастомизации.
Re: Кастомизировать компиляцию
От: Skorodum Россия  
Дата: 05.12.19 09:55
Оценка: 4 (1)
Здравствуйте, Muxa, Вы писали:

M>Идея следующая: допустим есть файл с кодом (code.cpp), хочется при его компиляции встроиться в эту процедуру и, при определенных условиях, на основе построенного AST сгенерить дополнительный файл (или даже несколько файлов) code.ex.cpp и также добавить его (их) в дальнейшую сборку проекта.

M>Знаю в qt происходит нечто похожее (moc-файлы).

M>Как такие вещи реализовываются? Почитал про clang/llvm, но там столько документации, что пока неясно в каком направлении двигаться.

M>Можно ли сделать универсальное решение под gcc/msvc/clang?

M>Чего хочется: максимальной портабельности между основными OS.

M>Чем можно пожертвовать: привязаться к конкретному компилятору в той части проекта, которая требует такой кастомизации.

Не знаю про AST, но все остальное это задача для системы сборки. Если используешь CMake, то смотри add_custom_target.
Простейший пример: генерация загаловочных файлов на основе Flatbuffer схемы и включение их в сборку. В твоем случае будешь вызывать компилятор с хитрыми параметрами для генерации "code.ex.cpp". Можно использовать разные компиляторы для генерации и собственно компиляции, т.е. достаточно научится делать это с помощью одного условного clang или gcc.
Re[2]: Кастомизировать компиляцию
От: Muxa  
Дата: 05.12.19 10:28
Оценка: +1
S>Не знаю про AST, но все остальное это задача для системы сборки. Если используешь CMake, то смотри add_custom_target.

Ок, про систему сборки отличная идея.
То есть получается так: я помечаю свой code.cpp как custom target; использую команду (например, clang -ast-dump code.cpp) чтобы сдампить AST; обрабатываю AST своим обработчиком и генератором файла code.ex.cpp
Вроде должно сработать. Обработчик-генератор, наверное тоже можно на основе clang сделать.
Re[3]: Кастомизировать компиляцию
От: Skorodum Россия  
Дата: 05.12.19 12:33
Оценка: 4 (1)
Здравствуйте, Muxa, Вы писали:

S>>Не знаю про AST, но все остальное это задача для системы сборки. Если используешь CMake, то смотри add_custom_target.


M>Ок, про систему сборки отличная идея.

M>То есть получается так: я помечаю свой code.cpp как custom target; использую команду (например, clang -ast-dump code.cpp) чтобы сдампить AST; обрабатываю AST своим обработчиком и генератором файла code.ex.cpp
M>Вроде должно сработать. Обработчик-генератор, наверное тоже можно на основе clang сделать.
"custom target" должна зависить от "code.cpp".

set(code "code.cpp")
add_custom_target(
GENERATE_AST_CPP
COMMAND
clang "-asdf -asdf ${code}"
DEPENDS
${code})

add_depenpency(my_hello_world GENERATE_AST_CPP)

Если меняешь code.cpp, то будет вызываться clang, а потом пересобираться my_hello_world.

Можно add_custom_command использовать, примерно тоже самое будет.
cmake
Re[2]: Кастомизировать компиляцию
От: kov_serg Россия  
Дата: 05.12.19 16:01
Оценка: +1
Здравствуйте, Skorodum, Вы писали:

M>>Можно ли сделать универсальное решение под gcc/msvc/clang?

M>>Чего хочется: максимальной портабельности между основными OS.

code.cpp.php -> code.cpp -> code.o -> code.a -> target
Re: Кастомизировать компиляцию
От: Mystic Artifact  
Дата: 05.12.19 17:50
Оценка:
Здравствуйте, Muxa, Вы писали:

M>Чего хочется: максимальной портабельности между основными OS.

M>Чем можно пожертвовать: привязаться к конкретному компилятору в той части проекта, которая требует такой кастомизации.

Есть ли реальная необходимость обрабатывать именно AST? Возможно классическая кодогенерация подойдет? Отделите модель от кода и используйте кодогенератор на чем-нибудь распространенном (например питон). Таким образом не придется ничем жертвовать. Да, это скорее всего приведет к введению дополнительного DSL и тулзы, но AST и тулза — это совсем не проще.

Конечно, без понимания задачи — возможно этот классический вариант и не подходит.
Re[2]: Кастомизировать компиляцию
От: Muxa  
Дата: 05.12.19 18:58
Оценка:
MA>Есть ли реальная необходимость обрабатывать именно AST? Возможно классическая кодогенерация подойдет?
MA>Отделите модель от кода и используйте кодогенератор на чем-нибудь распространенном (например питон).
Так вряд ли получится, нет никакой модели, есть только более или менее произвольный (заранее неизвестный) код, который будет написан не мной, и из которого будет генериться другой код.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.