Merge pull request #4345 from graemeg/freebsd-support

Adds FreeBSD support to MultiMC
This commit is contained in:
Petr Mrázek 2021-12-30 20:00:45 +01:00 committed by GitHub
commit 3efcccf334
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 96 additions and 19 deletions

View File

@ -47,6 +47,9 @@ if(UNIX AND APPLE)
endif() endif()
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Werror=return-type") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Werror=return-type")
# Fix build with Qt 5.13
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DQT_NO_DEPRECATED_WARNINGS=Y")
##################################### Set Application options ##################################### ##################################### Set Application options #####################################
######## Set URLs ######## ######## Set URLs ########

View File

@ -521,7 +521,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
// Set up paths // Set up paths
{ {
// Root path is used for updates. // Root path is used for updates.
#ifdef Q_OS_LINUX #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
QDir foo(FS::PathCombine(binPath, "..")); QDir foo(FS::PathCombine(binPath, ".."));
m_rootPath = foo.absolutePath(); m_rootPath = foo.absolutePath();
#elif defined(Q_OS_WIN32) #elif defined(Q_OS_WIN32)

View File

@ -7,7 +7,7 @@
/** /**
* This shouldn't exist, but until QTBUG-9328 and other unreported bugs are fixed, it needs to be a thing. * This shouldn't exist, but until QTBUG-9328 and other unreported bugs are fixed, it needs to be a thing.
*/ */
#if defined(Q_OS_LINUX) #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
@ -83,7 +83,7 @@ bool openDirectory(const QString &path, bool ensureExists)
{ {
return QDesktopServices::openUrl(QUrl::fromLocalFile(dir.absolutePath())); return QDesktopServices::openUrl(QUrl::fromLocalFile(dir.absolutePath()));
}; };
#if defined(Q_OS_LINUX) #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
return IndirectOpen(f); return IndirectOpen(f);
#else #else
return f(); return f();
@ -97,7 +97,7 @@ bool openFile(const QString &path)
{ {
return QDesktopServices::openUrl(QUrl::fromLocalFile(path)); return QDesktopServices::openUrl(QUrl::fromLocalFile(path));
}; };
#if defined(Q_OS_LINUX) #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
return IndirectOpen(f); return IndirectOpen(f);
#else #else
return f(); return f();
@ -107,7 +107,7 @@ bool openFile(const QString &path)
bool openFile(const QString &application, const QString &path, const QString &workingDirectory, qint64 *pid) bool openFile(const QString &application, const QString &path, const QString &workingDirectory, qint64 *pid)
{ {
qDebug() << "Opening file" << path << "using" << application; qDebug() << "Opening file" << path << "using" << application;
#if defined(Q_OS_LINUX) #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
// FIXME: the pid here is fake. So if something depends on it, it will likely misbehave // FIXME: the pid here is fake. So if something depends on it, it will likely misbehave
return IndirectOpen([&]() return IndirectOpen([&]()
{ {
@ -121,7 +121,7 @@ bool openFile(const QString &application, const QString &path, const QString &wo
bool run(const QString &application, const QStringList &args, const QString &workingDirectory, qint64 *pid) bool run(const QString &application, const QStringList &args, const QString &workingDirectory, qint64 *pid)
{ {
qDebug() << "Running" << application << "with args" << args.join(' '); qDebug() << "Running" << application << "with args" << args.join(' ');
#if defined(Q_OS_LINUX) #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
// FIXME: the pid here is fake. So if something depends on it, it will likely misbehave // FIXME: the pid here is fake. So if something depends on it, it will likely misbehave
return IndirectOpen([&]() return IndirectOpen([&]()
{ {
@ -139,7 +139,7 @@ bool openUrl(const QUrl &url)
{ {
return QDesktopServices::openUrl(url); return QDesktopServices::openUrl(url);
}; };
#if defined(Q_OS_LINUX) #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
return IndirectOpen(f); return IndirectOpen(f);
#else #else
return f(); return f();

View File

@ -403,7 +403,7 @@ QString getDesktopDir()
bool createShortCut(QString location, QString dest, QStringList args, QString name, bool createShortCut(QString location, QString dest, QStringList args, QString name,
QString icon) QString icon)
{ {
#if defined Q_OS_LINUX #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
location = PathCombine(location, name + ".desktop"); location = PathCombine(location, name + ".desktop");
QFile f(location); QFile f(location);

View File

@ -93,7 +93,7 @@ void UpdateController::installUpdates()
qDebug() << "Installing updates."; qDebug() << "Installing updates.";
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
QString finishCmd = QApplication::applicationFilePath(); QString finishCmd = QApplication::applicationFilePath();
#elif defined Q_OS_LINUX #elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
QString finishCmd = FS::PathCombine(m_root, BuildConfig.LAUNCHER_NAME); QString finishCmd = FS::PathCombine(m_root, BuildConfig.LAUNCHER_NAME);
#elif defined Q_OS_MAC #elif defined Q_OS_MAC
QString finishCmd = QApplication::applicationFilePath(); QString finishCmd = QApplication::applicationFilePath();

View File

@ -78,7 +78,7 @@ void Version::parse()
// FIXME: this is bad. versions can contain a lot more separators... // FIXME: this is bad. versions can contain a lot more separators...
QStringList parts = m_string.split('.'); QStringList parts = m_string.split('.');
for (const auto &part : parts) for (const auto& part : parts)
{ {
m_sections.append(Section(part)); m_sections.append(Section(part));
} }

View File

@ -31,7 +31,7 @@ JavaUtils::JavaUtils()
{ {
} }
#ifdef Q_OS_LINUX #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
static QString processLD_LIBRARY_PATH(const QString & LD_LIBRARY_PATH) static QString processLD_LIBRARY_PATH(const QString & LD_LIBRARY_PATH)
{ {
QDir mmcBin(QCoreApplication::applicationDirPath()); QDir mmcBin(QCoreApplication::applicationDirPath());
@ -83,7 +83,7 @@ QProcessEnvironment CleanEnviroment()
qDebug() << "Env: ignoring" << key << value; qDebug() << "Env: ignoring" << key << value;
continue; continue;
} }
#ifdef Q_OS_LINUX #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
// Do not pass LD_* variables to java. They were intended for MultiMC // Do not pass LD_* variables to java. They were intended for MultiMC
if(key.startsWith("LD_")) if(key.startsWith("LD_"))
{ {

View File

@ -17,6 +17,8 @@
OpSys OpSys_fromString(QString name) OpSys OpSys_fromString(QString name)
{ {
if (name == "freebsd")
return Os_FreeBSD;
if (name == "linux") if (name == "linux")
return Os_Linux; return Os_Linux;
if (name == "windows") if (name == "windows")
@ -30,6 +32,8 @@ QString OpSys_toString(OpSys name)
{ {
switch (name) switch (name)
{ {
case Os_FreeBSD:
return "freebsd";
case Os_Linux: case Os_Linux:
return "linux"; return "linux";
case Os_OSX: case Os_OSX:

View File

@ -18,6 +18,7 @@
enum OpSys enum OpSys
{ {
Os_Windows, Os_Windows,
Os_FreeBSD,
Os_Linux, Os_Linux,
Os_OSX, Os_OSX,
Os_Other Os_Other
@ -28,10 +29,10 @@ QString OpSys_toString(OpSys);
#ifdef Q_OS_WIN32 #ifdef Q_OS_WIN32
#define currentSystem Os_Windows #define currentSystem Os_Windows
#else #elif Q_OS_MAC
#ifdef Q_OS_MAC
#define currentSystem Os_OSX #define currentSystem Os_OSX
#elif defined Q_OS_FREEBSD
#define currentSystem Os_FreeBSD
#else #else
#define currentSystem Os_Linux #define currentSystem Os_Linux
#endif #endif
#endif

View File

@ -23,6 +23,13 @@
#include "FileSystem.h" #include "FileSystem.h"
#include <QDir> #include <QDir>
#ifdef major
#undef major
#endif
#ifdef minor
#undef minor
#endif
static QString replaceSuffix (QString target, const QString &suffix, const QString &replacement) static QString replaceSuffix (QString target, const QString &suffix, const QString &replacement)
{ {
if (!target.endsWith(suffix)) if (!target.endsWith(suffix))

View File

@ -19,8 +19,9 @@
#include "PrintInstanceInfo.h" #include "PrintInstanceInfo.h"
#include <launch/LaunchTask.h> #include <launch/LaunchTask.h>
#ifdef Q_OS_LINUX #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
namespace { namespace {
#if defined(Q_OS_LINUX)
void probeProcCpuinfo(QStringList &log) void probeProcCpuinfo(QStringList &log)
{ {
std::ifstream cpuin("/proc/cpuinfo"); std::ifstream cpuin("/proc/cpuinfo");
@ -66,7 +67,43 @@ void runLspci(QStringList &log)
} }
pclose(lspci); pclose(lspci);
} }
#elif defined(Q_OS_FREEBSD)
void runSysctlHwModel(QStringList &log)
{
char buff[512];
FILE *hwmodel = popen("sysctl hw.model", "r");
while (fgets(buff, 512, hwmodel) != NULL)
{
log << QString::fromUtf8(buff);
break;
}
pclose(hwmodel);
}
void runPciconf(QStringList &log)
{
char buff[512];
std::string strcard;
FILE *pciconf = popen("pciconf -lv -a vgapci0", "r");
while (fgets(buff, 512, pciconf) != NULL)
{
if (strncmp(buff, " vendor", 10) == 0)
{
std::string str(buff);
strcard.append(str.substr(str.find_first_of("'") + 1, str.find_last_not_of("'") - (str.find_first_of("'") + 2)));
strcard.append(" ");
}
else if (strncmp(buff, " device", 10) == 0)
{
std::string str2(buff);
strcard.append(str2.substr(str2.find_first_of("'") + 1, str2.find_last_not_of("'") - (str2.find_first_of("'") + 2)));
}
log << QString::fromStdString(strcard);
break;
}
pclose(pciconf);
}
#endif
void runGlxinfo(QStringList & log) void runGlxinfo(QStringList & log)
{ {
// FIXME: fixed size buffers... // FIXME: fixed size buffers...
@ -94,10 +131,14 @@ void PrintInstanceInfo::executeTask()
auto instance = m_parent->instance(); auto instance = m_parent->instance();
QStringList log; QStringList log;
#ifdef Q_OS_LINUX #if defined(Q_OS_LINUX)
::probeProcCpuinfo(log); ::probeProcCpuinfo(log);
::runLspci(log); ::runLspci(log);
::runGlxinfo(log); ::runGlxinfo(log);
#elif defined(Q_OS_FREEBSD)
::runSysctlHwModel(log);
::runPciconf(log);
::runGlxinfo(log);
#endif #endif
logLines(log, MessageLevel::Launcher); logLines(log, MessageLevel::Launcher);

View File

@ -5,6 +5,13 @@
#include <minecraft/PackProfile.h> #include <minecraft/PackProfile.h>
#include <minecraft/VersionFilterData.h> #include <minecraft/VersionFilterData.h>
#ifdef major
#undef major
#endif
#ifdef minor
#undef minor
#endif
void VerifyJavaInstall::executeTask() { void VerifyJavaInstall::executeTask() {
auto m_inst = std::dynamic_pointer_cast<MinecraftInstance>(m_parent->instance()); auto m_inst = std::dynamic_pointer_cast<MinecraftInstance>(m_parent->instance());

View File

@ -52,7 +52,7 @@ QString MCEditTool::getProgramPath()
#else #else
const QString mceditPath = path(); const QString mceditPath = path();
QDir mceditDir(mceditPath); QDir mceditDir(mceditPath);
#ifdef Q_OS_LINUX #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
if (mceditDir.exists("mcedit.sh")) if (mceditDir.exists("mcedit.sh"))
{ {
return mceditDir.absoluteFilePath("mcedit.sh"); return mceditDir.absoluteFilePath("mcedit.sh");

View File

@ -320,7 +320,7 @@ Description: Make it so that the QIcon loader honors /usr/share/pixmaps
icon theme specification. icon theme specification.
Bug: https://bugreports.qt.nokia.com/browse/QTBUG-12874 Bug: https://bugreports.qt.nokia.com/browse/QTBUG-12874
*********************************************************************/ *********************************************************************/
#ifdef Q_OS_LINUX #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
/* Freedesktop standard says to look in /usr/share/pixmaps last */ /* Freedesktop standard says to look in /usr/share/pixmaps last */
if (entries.isEmpty()) if (entries.isEmpty())
{ {

View File

@ -47,6 +47,7 @@ Sys::KernelInfo Sys::getKernelInfo()
uint64_t Sys::getSystemRam() uint64_t Sys::getSystemRam()
{ {
std::string token; std::string token;
#ifdef Q_OS_LINUX
std::ifstream file("/proc/meminfo"); std::ifstream file("/proc/meminfo");
while(file >> token) while(file >> token)
{ {
@ -65,6 +66,19 @@ uint64_t Sys::getSystemRam()
// ignore rest of the line // ignore rest of the line
file.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
} }
#elif defined(Q_OS_FREEBSD)
char buff[512];
FILE *fp = popen("sysctl hw.physmem", "r");
if (fp != NULL)
{
while(fgets(buff, 512, fp) != NULL)
{
std::string str(buff);
uint64_t mem = std::stoull(str.substr(12, std::string::npos));
return mem * 1024ull;
}
}
#endif
return 0; // nothing found return 0; // nothing found
} }