Я написал программу для генерации кода на C ++ для кода, которая обеспечивает доступ к таблицам Sql в QT. Генератор берет простой текстовый файл и создает файл заголовка класса (.h) и пару файлов определения класса (.cpp). Все файлы известны QT Creator в моем проекте (и находятся под контролем версий).
Я хочу, чтобы мой генератор кода работал при изменении входного текстового файла. Затем я бы заново сгенерировал соответствующие ему файлы .h и .cpp. Затем сборка автоматически скомпилирует файл .cpp при сборке.
Я не знаю, как включить мой генератор кода в процесс сборки QT Creator (cmake). Кто-нибудь может мне помочь?
Я могу запустить процесс вручную, выбрав каждый входной текстовый файл и поместив его в программу. Это возможность добавить шаг сборки в QT Creator. Я добавил свою программу в качестве «Пользовательского шага процесса», но она не выбирает каждый входной текстовый файл и использует зависимости для принятия решения о запуске или нет.
Типичный текстовый файл ввода выглядит так:
tablename=filepathtable,FP,dbt_filepath
filepath_id INTEGER PRIMARY KEY
drive_letter TEXT
file_path TEXT
full_path TEXT
Генератор кода создает заголовочный файл следующим образом:
#ifndef DBT_FILEPATH_H
#define DBT_FILEPATH_H
// DO NOT EDIT THIS FILE! File was generated by dbtable_qt.ahk
#include "dbmanager.h"
#include <QString>
#include <QSqlQuery>
#include <QSqlError>
class Dbt_Filepath
{
public:
Dbt_Filepath(QSqlDatabase* p_db);
bool createFPTable();
bool insertFPTable();
bool queryFPTablePrimaryKey(int p_filepath_id);
void debugShowSqlQueryError(const QLatin1String& funcname,
QSqlQuery& query);
const QString getTableName();
// database table fields
int filepath_id;
QString drive_letter;
QString file_path;
QString full_path;
enum eFP_dbcol{
field_filepath_id=0,
field_drive_letter,
field_file_path,
field_full_path };
// private data and functions
private:
QSqlDatabase* m_db; // database
void fillFieldsFromQuery(QSqlQuery& query);
};
#endif // DBT_FILEPATH_H
и файл .cpp, подобный этому (показан частично):
// DO NOT EDIT THIS FILE! File was generated by dbtable_qt.ahk
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include "dbt_filepath.h"
Dbt_Filepath::Dbt_Filepath(QSqlDatabase* p_db)
: m_db(p_db)
{
}
const QString Dbt_Filepath::getTableName()
{
const QString tblnm = QLatin1String("filepathtable");
return tblnm;
}
bool Dbt_Filepath::createFPTable()
{
bool success = false;
const QLatin1String fname("DFP::createFPTable()");
qDebug() << fname;
QSqlQuery querycreate(*m_db);
QString sqlcreate = QLatin1String(
"CREATE TABLE filepathtable ("
"filepath_id INTEGER PRIMARY KEY,"
"drive_letter TEXT,"
"file_path TEXT,"
"full_path TEXT"
");" );
querycreate.prepare(sqlcreate);
if (querycreate.exec())
success = true;
else
debugShowSqlQueryError(fname, querycreate);
return success;
}
bool Dbt_Filepath::insertFPTable()
{
bool success = false;
const QLatin1String fname("DFP::insertFPTable()");
qDebug() << fname;
QSqlQuery queryinsert(*m_db);
QString sqlinsert = QLatin1String(
"INSERT INTO filepathtable ("
"drive_letter,"
"file_path,"
"full_path"
") VALUES(?,?,?);");
queryinsert.prepare(sqlinsert);
queryinsert.addBindValue(drive_letter.toUtf8());
...
Я хочу, чтобы процесс сборки использовал исходные текстовые файлы в качестве источников - перед компиляцией чего-либо - для повторной генерации файлов c ++, если это необходимо. Затем я хочу выполнить обычный процесс сборки, чтобы продолжить компиляцию и связывание моего кода.