Skip to content

Commit

Permalink
Add BuildPlatformBinaryThread.cpp
Browse files Browse the repository at this point in the history
  • Loading branch information
t-sommer committed Aug 12, 2024
1 parent df1dca6 commit a0e2113
Show file tree
Hide file tree
Showing 5 changed files with 240 additions and 164 deletions.
171 changes: 171 additions & 0 deletions fmusim-gui/BuildPlatformBinaryThread.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
#include <QTemporaryDir>
#include <QProcess>
#include "BuildPlatformBinaryThread.h"


BuildPlatformBinaryThread::BuildPlatformBinaryThread(QObject *parent)
: QThread{parent}
{}

static QString wslPath(const QString& path) {

QString canonicalPath = path;

canonicalPath = canonicalPath.replace('\\', '/');

QProcess process;

process.start("wsl", {"wslpath", "-a", canonicalPath});

process.waitForFinished();

QString p(process.readAllStandardOutput());

return p.trimmed();
}

void BuildPlatformBinaryThread::run() {

QString modelIdentifier;

QTemporaryDir buildDirectory;

buildDirectory.setAutoRemove(removeBuilDirectory);

QFile::copy(":/resources/CMakeLists.txt", buildDirectory.filePath("CMakeLists.txt"));

if (modelDescription->fmiMajorVersion == 2) {
QFile::copy(":/resources/fmi2Functions.h", buildDirectory.filePath("fmi2Functions.h"));
QFile::copy(":/resources/fmi2FunctionTypes.h", buildDirectory.filePath("fmi2FunctionTypes.h"));
QFile::copy(":/resources/fmi2TypesPlatform.h", buildDirectory.filePath("fmi2TypesPlatform.h"));
} else {
QFile::copy(":/resources/fmi3Functions.h", buildDirectory.filePath("fmi3Functions.h"));
QFile::copy(":/resources/fmi3FunctionTypes.h", buildDirectory.filePath("fmi3FunctionTypes.h"));
QFile::copy(":/resources/fmi3PlatformTypes.h", buildDirectory.filePath("fmi3PlatformTypes.h"));
}

size_t nSourceFiles;
const char** sourceFiles;

if (modelDescription->coSimulation) {
modelIdentifier = modelDescription->coSimulation->modelIdentifier;
nSourceFiles = modelDescription->coSimulation->nSourceFiles;
sourceFiles = modelDescription->coSimulation->sourceFiles;
} else {
modelIdentifier = modelDescription->modelExchange->modelIdentifier;
nSourceFiles = modelDescription->modelExchange->nSourceFiles;
sourceFiles = modelDescription->modelExchange->sourceFiles;
}

QStringList definitions;

if (modelDescription->fmiMajorVersion == 3) {
definitions << "FMI3_OVERRIDE_FUNCTION_PREFIX";
}

if (buildDescription) {

if (buildDescription->nBuildConfigurations > 1) {
emit newMessage("Multiple Build Configurations are not supported.\n");
return;
}

const FMIBuildConfiguration* buildConfiguration = buildDescription->buildConfigurations[0];

if (buildConfiguration->nSourceFileSets > 1) {
emit newMessage("Multiple Source File Sets are not supported.\n");
return;
}

const FMISourceFileSet* sourceFileSet = buildConfiguration->sourceFileSets[0];

nSourceFiles = sourceFileSet->nSourceFiles;
sourceFiles = sourceFileSet->sourceFiles;

for (size_t i = 0; i < sourceFileSet->nPreprocessorDefinitions; i++) {

FMIPreprocessorDefinition* preprocessorDefinition = sourceFileSet->preprocessorDefinitions[i];

QString definition = preprocessorDefinition->name;

if (preprocessorDefinition->value) {
definition += "=";
definition += preprocessorDefinition->value;
}

definitions << definition;
}
}

QString buildDirPath = compileWithWSL ? wslPath(buildDirectory.path()) : buildDirectory.path();
QString unzipdirPath = compileWithWSL ? wslPath(unzipdir) : unzipdir;

QStringList sources;

for (size_t i = 0; i < nSourceFiles; i++) {
sources << QDir(unzipdirPath).filePath("sources/" + QString(sourceFiles[i]));
}

QStringList includeDirectories = {
buildDirPath,
QDir(unzipdirPath).filePath("sources")
};


emit newMessage("Generating CMake project...\n");

QString program;

QProcess process;
QStringList arguments;

if (compileWithWSL) {
program = "wsl";
arguments << cmakeCommand;
} else {
program = cmakeCommand;
}

if (!cmakeGenerator.isEmpty()) {
arguments << "-G" + cmakeGenerator;
}

arguments << "-S" + buildDirPath;
arguments << "-B" + buildDirPath;
arguments << "-DFMI_MAJOR_VERSION=" + QString::number(modelDescription->fmiMajorVersion);
arguments << "-DMODEL_IDENTIFIER=" + modelIdentifier;
arguments << "-DINCLUDE='" + includeDirectories.join(';') + "'";
arguments << "-DDEFINITIONS='" + definitions.join(';') + "'";
arguments << "-DSOURCES='" + sources.join(';') + "'";
arguments << "-DUNZIPDIR='" + unzipdirPath + "'";

process.start(program, arguments);

bool success = process.waitForFinished();

emit newMessage(process.readAllStandardOutput());
emit newMessage(process.readAllStandardError());

if (!success) {
return;
}

emit newMessage("Building CMake project...\n");

arguments.clear();

if (compileWithWSL) {
arguments << cmakeCommand;
}

arguments << "--build" << buildDirPath;
arguments << "--target" << "install";
arguments << "--config" << buildConfiguration;

process.start(program, arguments);

success = process.waitForFinished();

emit newMessage(process.readAllStandardOutput());
emit newMessage(process.readAllStandardError());
}
35 changes: 35 additions & 0 deletions fmusim-gui/BuildPlatformBinaryThread.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#ifndef BUILDPLATFORMBINARYTHREAD_H
#define BUILDPLATFORMBINARYTHREAD_H

#include <QObject>
#include <QThread>

extern "C" {
#include "FMIModelDescription.h"
#include "FMIBuildDescription.h"
}

class BuildPlatformBinaryThread : public QThread
{
Q_OBJECT

public:
explicit BuildPlatformBinaryThread(QObject *parent = nullptr);

QString unzipdir;
FMIModelDescription* modelDescription;
FMIBuildDescription* buildDescription;
QString cmakeCommand;
QString cmakeGenerator;
QString buildConfiguration;
bool compileWithWSL;
bool removeBuilDirectory;

void run() override;

signals:
void newMessage(QString message);

};

#endif // BUILDPLATFORMBINARYTHREAD_H
1 change: 1 addition & 0 deletions fmusim-gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
SimulationThread.h SimulationThread.cpp
resources.qrc
BuildPlatformBinaryDialog.h BuildPlatformBinaryDialog.cpp BuildPlatformBinaryDialog.ui
BuildPlatformBinaryThread.h BuildPlatformBinaryThread.cpp


)
Expand Down
Loading

0 comments on commit a0e2113

Please sign in to comment.