Для каждого языка это будет по своему. В си и си++ макросы - это тоже кодогенераторы, в принципе.
В целом принцип такой: Берём некоторые данные, файлы, исходный код, запускаем на нём некоторую программу-кодогенератор, которая эти данные обработает и создаст новые исходные файлы.
Вот про C# source generators:
https://devblogs.microsoft.com/dotnet/introducing-...
Вот про T4:
https://docs.microsoft.com/ru-ru/visualstudio/mode...
Вот про кодогенерацию в го:
https://golang.org/pkg/cmd/go/internal/generate/
В rust есть декларативные и процедурные макросы, которые тоже генерируют код.
Концепция так-то ужасно простая, я хз, что можно в книгах про неё написать.