aboutsummaryrefslogtreecommitdiff
path: root/games
diff options
context:
space:
mode:
authorTobias Kortkamp <tobik@FreeBSD.org>2018-06-06 15:54:57 +0000
committerTobias Kortkamp <tobik@FreeBSD.org>2018-06-06 15:54:57 +0000
commit0ab76735dc6b38ccc38049f466bfd5912fea688e (patch)
tree266fef7eff13f5868b58ec455ad6d545e4c40ad0 /games
parentfd8a4a64dab17e85a84c45cfc64d78516b695734 (diff)
downloadports-0ab76735dc6b38ccc38049f466bfd5912fea688e.tar.gz
ports-0ab76735dc6b38ccc38049f466bfd5912fea688e.zip
New port: games/multimc
MultiMC is a custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once. It also allows you to easily install and remove mods by simply dragging and dropping. WWW: https://multimc.org PR: 224823 Submitted by: tsundoku <me@tsundoku.ne.jp> (based on)
Notes
Notes: svn path=/head/; revision=471856
Diffstat (limited to 'games')
-rw-r--r--games/Makefile1
-rw-r--r--games/multimc/Makefile38
-rw-r--r--games/multimc/distinfo7
-rw-r--r--games/multimc/files/patch-CMakeLists.txt11
-rw-r--r--games/multimc/files/patch-api_gui_DesktopServices.cpp56
-rw-r--r--games/multimc/files/patch-api_logic_FileSystem.cpp11
-rw-r--r--games/multimc/files/patch-api_logic_FileSystem__test.cpp20
-rw-r--r--games/multimc/files/patch-api_logic_java_JavaUtils.cpp29
-rw-r--r--games/multimc/files/patch-api_logic_minecraft_MinecraftInstance.cpp14
-rw-r--r--games/multimc/files/patch-api_logic_minecraft_OpSys.cpp27
-rw-r--r--games/multimc/files/patch-api_logic_minecraft_OpSys.h25
-rw-r--r--games/multimc/files/patch-api_logic_minecraft_launch_ExtractNatives.cpp17
-rw-r--r--games/multimc/files/patch-api_logic_minecraft_launch_PrintInstanceInfo.cpp62
-rw-r--r--games/multimc/files/patch-api_logic_minecraft_update_FMLLibrariesTask.h10
-rw-r--r--games/multimc/files/patch-application_CMakeLists.txt31
-rw-r--r--games/multimc/files/patch-application_MultiMC.cpp11
-rw-r--r--games/multimc/files/patch-application_UpdateController.cpp11
-rw-r--r--games/multimc/files/patch-application_install__prereqs.cmake.in8
-rw-r--r--games/multimc/files/patch-libraries_iconfix_internal_qiconloader.cpp11
-rw-r--r--games/multimc/files/patch-libraries_systeminfo_src_sys__unix.cpp41
-rw-r--r--games/multimc/pkg-descr5
-rw-r--r--games/multimc/pkg-plist10
22 files changed, 456 insertions, 0 deletions
diff --git a/games/Makefile b/games/Makefile
index aaf46510c5fc..d2d3ee4756f3 100644
--- a/games/Makefile
+++ b/games/Makefile
@@ -674,6 +674,7 @@
SUBDIR += mt_gtk_client
SUBDIR += mtaserver
SUBDIR += mudmagic
+ SUBDIR += multimc
SUBDIR += mvdsv
SUBDIR += nInvaders
SUBDIR += nadar
diff --git a/games/multimc/Makefile b/games/multimc/Makefile
new file mode 100644
index 000000000000..e4616e9eea66
--- /dev/null
+++ b/games/multimc/Makefile
@@ -0,0 +1,38 @@
+# $FreeBSD$
+
+PORTNAME= multimc
+DISTVERSION= 0.6.0
+CATEGORIES= games java
+
+MAINTAINER= me@tsundoku.ne.jp
+COMMENT= Minecraft launcher with the ability to manage multiple instances
+
+LICENSE= APACHE20
+LICENSE_FILE= ${WRKSRC}/COPYING.md
+
+RUN_DEPENDS= lwjgl>=2.9.3:games/lwjgl
+
+USES= cmake:outsource compiler:c++14-lang
+USE_GITHUB= yes
+GH_ACCOUNT= MultiMC
+GH_PROJECT= MultiMC5
+GH_TUPLE= MultiMC:libnbtplusplus:4b305bb:libnbtplusplus/libraries/libnbtplusplus \
+ MultiMC:quazip:164acc3:quazip/libraries/quazip
+USE_LDCONFIG= yes
+USE_JAVA= 1.8+
+USE_QT5= buildtools core concurrent gui network qmake testlib_build widgets xml
+
+CMAKE_ARGS= -DMultiMC_LAYOUT="lin-system"
+CMAKE_OFF= MultiMC_UPDATER
+CXXFLAGS+= -Wno-inconsistent-missing-override \
+ -Wno-delete-non-virtual-dtor \
+ -DLWJGL_DIR='\"${LOCALBASE}/lib/lwjgl2.9.3\"'
+
+post-patch:
+ @${REINPLACE_CMD} 's,usr/local,${PREFIX:S@^/@@},g' \
+ ${WRKSRC}/application/CMakeLists.txt
+
+post-install:
+ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/libMultiMC_*.so
+
+.include <bsd.port.mk>
diff --git a/games/multimc/distinfo b/games/multimc/distinfo
new file mode 100644
index 000000000000..cd4cfaf6a489
--- /dev/null
+++ b/games/multimc/distinfo
@@ -0,0 +1,7 @@
+TIMESTAMP = 1514826359
+SHA256 (MultiMC-MultiMC5-0.6.0_GH0.tar.gz) = ac458be99250d2a369ee805bf9560e396d0e0f16a95cc84c36eb0ef1e94a6374
+SIZE (MultiMC-MultiMC5-0.6.0_GH0.tar.gz) = 1844862
+SHA256 (MultiMC-libnbtplusplus-4b305bb_GH0.tar.gz) = 576391fb7aac44e8d8e2012f38b1f0bbb08cb9d0cd9104f162cfdee4b83e5627
+SIZE (MultiMC-libnbtplusplus-4b305bb_GH0.tar.gz) = 47080
+SHA256 (MultiMC-quazip-164acc3_GH0.tar.gz) = fb289ba497f2e315a8e85881ca78218f859d7a72f11463251cfb83271c4381b7
+SIZE (MultiMC-quazip-164acc3_GH0.tar.gz) = 103454
diff --git a/games/multimc/files/patch-CMakeLists.txt b/games/multimc/files/patch-CMakeLists.txt
new file mode 100644
index 000000000000..d0a2282ff20a
--- /dev/null
+++ b/games/multimc/files/patch-CMakeLists.txt
@@ -0,0 +1,11 @@
+--- CMakeLists.txt.orig 2017-12-18 00:19:43 UTC
++++ CMakeLists.txt
+@@ -5,6 +5,8 @@ if(IS_IN_SOURCE_BUILD)
+ message(AUTHOR_WARNING "You are building MultiMC in-source. This is NOT recommended!")
+ endif()
+
++set(CMAKE_INSTALL_PREFIX "/")
++
+ if(WIN32)
+ # In Qt 5.1+ we have our own main() function, don't autolink to qtmain on Windows
+ cmake_policy(SET CMP0020 OLD)
diff --git a/games/multimc/files/patch-api_gui_DesktopServices.cpp b/games/multimc/files/patch-api_gui_DesktopServices.cpp
new file mode 100644
index 000000000000..40db6824a165
--- /dev/null
+++ b/games/multimc/files/patch-api_gui_DesktopServices.cpp
@@ -0,0 +1,56 @@
+--- api/gui/DesktopServices.cpp.orig 2017-12-18 00:19:43 UTC
++++ api/gui/DesktopServices.cpp
+@@ -7,7 +7,7 @@
+ /**
+ * 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 <errno.h>
+@@ -83,7 +83,7 @@ bool openDirectory(const QString &path,
+ {
+ return QDesktopServices::openUrl(QUrl::fromLocalFile(dir.absolutePath()));
+ };
+-#if defined(Q_OS_LINUX)
++#if defined(Q_OS_LINUX) || defined (Q_OS_FREEBSD)
+ return IndirectOpen(f);
+ #else
+ return f();
+@@ -97,7 +97,7 @@ bool openFile(const QString &path)
+ {
+ return QDesktopServices::openUrl(QUrl::fromLocalFile(path));
+ };
+-#if defined(Q_OS_LINUX)
++#if defined(Q_OS_LINUX) || defined (Q_OS_FREEBSD)
+ return IndirectOpen(f);
+ #else
+ return f();
+@@ -107,7 +107,7 @@ bool openFile(const QString &path)
+ bool openFile(const QString &application, const QString &path, const QString &workingDirectory, qint64 *pid)
+ {
+ 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
+ return IndirectOpen([&]()
+ {
+@@ -121,7 +121,7 @@ bool openFile(const QString &application
+ bool run(const QString &application, const QStringList &args, const QString &workingDirectory, qint64 *pid)
+ {
+ 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
+ return IndirectOpen([&]()
+ {
+@@ -139,7 +139,7 @@ bool openUrl(const QUrl &url)
+ {
+ return QDesktopServices::openUrl(url);
+ };
+-#if defined(Q_OS_LINUX)
++#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
+ return IndirectOpen(f);
+ #else
+ return f();
diff --git a/games/multimc/files/patch-api_logic_FileSystem.cpp b/games/multimc/files/patch-api_logic_FileSystem.cpp
new file mode 100644
index 000000000000..730d31fb09cd
--- /dev/null
+++ b/games/multimc/files/patch-api_logic_FileSystem.cpp
@@ -0,0 +1,11 @@
+--- api/logic/FileSystem.cpp.orig 2017-12-18 00:19:43 UTC
++++ api/logic/FileSystem.cpp
+@@ -407,7 +407,7 @@ QString getDesktopDir()
+ bool createShortCut(QString location, QString dest, QStringList args, QString name,
+ QString icon)
+ {
+-#if defined Q_OS_LINUX
++#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
+ location = PathCombine(location, name + ".desktop");
+
+ QFile f(location);
diff --git a/games/multimc/files/patch-api_logic_FileSystem__test.cpp b/games/multimc/files/patch-api_logic_FileSystem__test.cpp
new file mode 100644
index 000000000000..8f9c5e77e018
--- /dev/null
+++ b/games/multimc/files/patch-api_logic_FileSystem__test.cpp
@@ -0,0 +1,20 @@
+--- api/logic/FileSystem_test.cpp.orig 2017-12-18 00:19:43 UTC
++++ api/logic/FileSystem_test.cpp
+@@ -119,7 +119,7 @@ slots:
+
+ // this is only valid on linux
+ // FIXME: implement on windows, OSX, then test.
+-#if defined(Q_OS_LINUX)
++#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
+ void test_createShortcut_data()
+ {
+ QTest::addColumn<QString>("location");
+@@ -134,7 +134,7 @@ slots:
+ << (QStringList() << "arg1" << "arg2")
+ << "asdf"
+ << QString()
+- #if defined(Q_OS_LINUX)
++ #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
+ << MULTIMC_GET_TEST_FILE("data/FileSystem-test_createShortcut-unix")
+ #elif defined(Q_OS_WIN)
+ << QByteArray()
diff --git a/games/multimc/files/patch-api_logic_java_JavaUtils.cpp b/games/multimc/files/patch-api_logic_java_JavaUtils.cpp
new file mode 100644
index 000000000000..72acd31781f3
--- /dev/null
+++ b/games/multimc/files/patch-api_logic_java_JavaUtils.cpp
@@ -0,0 +1,29 @@
+--- api/logic/java/JavaUtils.cpp.orig 2017-12-18 00:19:43 UTC
++++ api/logic/java/JavaUtils.cpp
+@@ -81,7 +81,7 @@ QProcessEnvironment CleanEnviroment()
+ qDebug() << "Env: ignoring" << key << value;
+ 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
+ if(key.startsWith("LD_"))
+ {
+@@ -110,7 +110,7 @@ QProcessEnvironment CleanEnviroment()
+ qDebug() << "Env: " << key << value;
+ env.insert(key, value);
+ }
+-#ifdef Q_OS_LINUX
++#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
+ // HACK: Workaround for QTBUG42500
+ if(!env.contains("LD_LIBRARY_PATH"))
+ {
+@@ -291,7 +291,7 @@ QList<QString> JavaUtils::FindJavaPaths(
+ return javas;
+ }
+
+-#elif defined(Q_OS_LINUX)
++#elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
+ QList<QString> JavaUtils::FindJavaPaths()
+ {
+ qDebug() << "Linux Java detection incomplete - defaulting to \"java\"";
diff --git a/games/multimc/files/patch-api_logic_minecraft_MinecraftInstance.cpp b/games/multimc/files/patch-api_logic_minecraft_MinecraftInstance.cpp
new file mode 100644
index 000000000000..294b2c329305
--- /dev/null
+++ b/games/multimc/files/patch-api_logic_minecraft_MinecraftInstance.cpp
@@ -0,0 +1,14 @@
+--- api/logic/minecraft/MinecraftInstance.cpp.orig 2017-12-18 00:19:43 UTC
++++ api/logic/minecraft/MinecraftInstance.cpp
+@@ -163,7 +163,11 @@ QString MinecraftInstance::binRoot() con
+
+ QString MinecraftInstance::getNativePath() const
+ {
++#if defined(Q_OS_FREEBSD)
++ QDir natives_dir(LWJGL_DIR "/");
++#else
+ QDir natives_dir(FS::PathCombine(instanceRoot(), "natives/"));
++#endif
+ return natives_dir.absolutePath();
+ }
+
diff --git a/games/multimc/files/patch-api_logic_minecraft_OpSys.cpp b/games/multimc/files/patch-api_logic_minecraft_OpSys.cpp
new file mode 100644
index 000000000000..923ba7be914b
--- /dev/null
+++ b/games/multimc/files/patch-api_logic_minecraft_OpSys.cpp
@@ -0,0 +1,27 @@
+--- api/logic/minecraft/OpSys.cpp.orig 2017-12-18 00:19:43 UTC
++++ api/logic/minecraft/OpSys.cpp
+@@ -17,6 +17,8 @@
+
+ OpSys OpSys_fromString(QString name)
+ {
++ if (name == "freebsd")
++ return Os_FreeBSD;
+ if (name == "linux")
+ return Os_Linux;
+ if (name == "windows")
+@@ -30,6 +32,8 @@ QString OpSys_toString(OpSys name)
+ {
+ switch (name)
+ {
++ case Os_FreeBSD:
++ return "freebsd";
+ case Os_Linux:
+ return "linux";
+ case Os_OSX:
+@@ -39,4 +43,4 @@ QString OpSys_toString(OpSys name)
+ default:
+ return "other";
+ }
+-}
+\ No newline at end of file
++}
diff --git a/games/multimc/files/patch-api_logic_minecraft_OpSys.h b/games/multimc/files/patch-api_logic_minecraft_OpSys.h
new file mode 100644
index 000000000000..2a0818fafd49
--- /dev/null
+++ b/games/multimc/files/patch-api_logic_minecraft_OpSys.h
@@ -0,0 +1,25 @@
+--- api/logic/minecraft/OpSys.h.orig 2017-12-18 00:19:43 UTC
++++ api/logic/minecraft/OpSys.h
+@@ -20,6 +20,7 @@ enum OpSys
+ Os_Windows,
+ Os_Linux,
+ Os_OSX,
++ Os_FreeBSD,
+ Os_Other
+ };
+
+@@ -28,10 +29,10 @@ QString OpSys_toString(OpSys);
+
+ #ifdef Q_OS_WIN32
+ #define currentSystem Os_Windows
+-#else
+-#ifdef Q_OS_MAC
++#elif defined Q_OS_MAC
+ #define currentSystem Os_OSX
++#elif defined Q_OS_FREEBSD
++#define currentSystem Os_FreeBSD
+ #else
+ #define currentSystem Os_Linux
+ #endif
+-#endif
+\ No newline at end of file
diff --git a/games/multimc/files/patch-api_logic_minecraft_launch_ExtractNatives.cpp b/games/multimc/files/patch-api_logic_minecraft_launch_ExtractNatives.cpp
new file mode 100644
index 000000000000..e9815391e61a
--- /dev/null
+++ b/games/multimc/files/patch-api_logic_minecraft_launch_ExtractNatives.cpp
@@ -0,0 +1,17 @@
+--- api/logic/minecraft/launch/ExtractNatives.cpp.orig 2017-12-18 00:19:43 UTC
++++ api/logic/minecraft/launch/ExtractNatives.cpp
+@@ -23,6 +23,14 @@
+ #include "FileSystem.h"
+ #include <QDir>
+
++//C library defines interfere with Java version check
++#ifdef major
++ #undef major
++#endif
++#ifdef minor
++ #undef minor
++#endif
++
+ static QString replaceSuffix (QString target, const QString &suffix, const QString &replacement)
+ {
+ if (!target.endsWith(suffix))
diff --git a/games/multimc/files/patch-api_logic_minecraft_launch_PrintInstanceInfo.cpp b/games/multimc/files/patch-api_logic_minecraft_launch_PrintInstanceInfo.cpp
new file mode 100644
index 000000000000..409aa64c3c5f
--- /dev/null
+++ b/games/multimc/files/patch-api_logic_minecraft_launch_PrintInstanceInfo.cpp
@@ -0,0 +1,62 @@
+--- api/logic/minecraft/launch/PrintInstanceInfo.cpp.orig 2017-12-18 00:19:43 UTC
++++ api/logic/minecraft/launch/PrintInstanceInfo.cpp
+@@ -24,6 +24,10 @@ void PrintInstanceInfo::executeTask()
+ auto instance = m_parent->instance();
+ auto lines = instance->verboseDescription(m_session);
+
++#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
++
++ char buff[512];
++
+ #ifdef Q_OS_LINUX
+ std::ifstream cpuin("/proc/cpuinfo");
+ for (std::string line; std::getline(cpuin, line);)
+@@ -36,7 +40,6 @@ void PrintInstanceInfo::executeTask()
+ }
+ }
+
+- char buff[512];
+ int gpuline = -1;
+ int cline = 0;
+ FILE *fp = popen("lspci -k", "r");
+@@ -64,6 +67,40 @@ void PrintInstanceInfo::executeTask()
+ cline++;
+ }
+ }
++#elif defined(Q_OS_FREEBSD)
++
++ std::string strcard;
++
++ FILE *fp3 = popen("sysctl hw.model", "r");
++ if (fp3 != NULL)
++ {
++ fgets(buff, 512, fp3);
++ std::string str(buff);
++ QStringList clines = (QStringList() << QString::fromStdString(str.substr(10, std::string::npos)));
++ logLines(clines, MessageLevel::MultiMC);
++ }
++
++ FILE *fp4 = popen("pciconf -lv -a vgapci0", "r");
++ if (fp4 != NULL)
++ {
++ while (fgets(buff, 512, fp4) != 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)));
++ QStringList glines = (QStringList() << QString::fromStdString(strcard));
++ logLines(glines, MessageLevel::MultiMC);
++ }
++ }
++ }
++#endif
+
+ FILE *fp2 = popen("glxinfo", "r");
+ if (fp2 != NULL)
diff --git a/games/multimc/files/patch-api_logic_minecraft_update_FMLLibrariesTask.h b/games/multimc/files/patch-api_logic_minecraft_update_FMLLibrariesTask.h
new file mode 100644
index 000000000000..96c79debe10a
--- /dev/null
+++ b/games/multimc/files/patch-api_logic_minecraft_update_FMLLibrariesTask.h
@@ -0,0 +1,10 @@
+--- api/logic/minecraft/update/FMLLibrariesTask.h.orig 2018-06-03 04:17:36 UTC
++++ api/logic/minecraft/update/FMLLibrariesTask.h
+@@ -1,6 +1,7 @@
+ #pragma once
+ #include "tasks/Task.h"
+ #include "net/NetJob.h"
++#include "minecraft/VersionFilterData.h"
+ class MinecraftInstance;
+
+ class FMLLibrariesTask : public Task
diff --git a/games/multimc/files/patch-application_CMakeLists.txt b/games/multimc/files/patch-application_CMakeLists.txt
new file mode 100644
index 000000000000..4ccfd7ec9938
--- /dev/null
+++ b/games/multimc/files/patch-application_CMakeLists.txt
@@ -0,0 +1,31 @@
+--- application/CMakeLists.txt.orig 2017-12-18 00:19:43 UTC
++++ application/CMakeLists.txt
+@@ -27,11 +27,11 @@ set(MultiMC_PASTE_EE_API_KEY "" CACHE ST
+ set(MultiMC_ANALYTICS_ID "" CACHE STRING "ID you can get from Google analytics")
+
+ #### Check the current Git commit and branch
+-include(GetGitRevisionDescription)
+-get_git_head_revision(MultiMC_GIT_REFSPEC MultiMC_GIT_COMMIT)
++#include(GetGitRevisionDescription)
++#get_git_head_revision(MultiMC_GIT_REFSPEC MultiMC_GIT_COMMIT)
+
+-message(STATUS "Git commit: ${MultiMC_GIT_COMMIT}")
+-message(STATUS "Git refspec: ${MultiMC_GIT_REFSPEC}")
++#message(STATUS "Git commit: ${MultiMC_GIT_COMMIT}")
++#message(STATUS "Git refspec: ${MultiMC_GIT_REFSPEC}")
+
+ set(MultiMC_RELEASE_VERSION_NAME "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_HOTFIX}")
+
+@@ -390,9 +390,9 @@ elseif(MultiMC_LAYOUT_REAL STREQUAL "lin
+ install(PROGRAMS package/linux/MultiMC DESTINATION ${BUNDLE_DEST_DIR})
+
+ elseif(MultiMC_LAYOUT_REAL STREQUAL "lin-system")
+- set(MultiMC_BINARY_DEST_DIR "usr/bin" CACHE STRING "Relative path from packaging root to the binary directory")
+- set(MultiMC_LIBRARY_DEST_DIR "usr/lib" CACHE STRING "Relative path from packaging root to the library directory")
+- set(MultiMC_SHARE_DEST_DIR "usr/share/multimc" CACHE STRING "Relative path from packaging root to the shared data directory")
++ set(MultiMC_BINARY_DEST_DIR "usr/local/bin" CACHE STRING "Relative path from packaging root to the binary directory")
++ set(MultiMC_LIBRARY_DEST_DIR "usr/local/lib" CACHE STRING "Relative path from packaging root to the library directory")
++ set(MultiMC_SHARE_DEST_DIR "usr/local/share/multimc" CACHE STRING "Relative path from packaging root to the shared data directory")
+ set(MultiMC_APP_BINARY_NAME "multimc" CACHE STRING "Name of the MultiMC binary for the purposes of linux packaging")
+ set(JARS_DEST_DIR "${MultiMC_SHARE_DEST_DIR}")
+
diff --git a/games/multimc/files/patch-application_MultiMC.cpp b/games/multimc/files/patch-application_MultiMC.cpp
new file mode 100644
index 000000000000..e32533502b33
--- /dev/null
+++ b/games/multimc/files/patch-application_MultiMC.cpp
@@ -0,0 +1,11 @@
+--- application/MultiMC.cpp.orig 2017-12-18 00:19:43 UTC
++++ application/MultiMC.cpp
+@@ -322,7 +322,7 @@ MultiMC::MultiMC(int &argc, char **argv)
+ // Set up paths
+ {
+ // Root path is used for updates.
+-#ifdef Q_OS_LINUX
++#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
+ QDir foo(FS::PathCombine(binPath, ".."));
+ m_rootPath = foo.absolutePath();
+ #elif defined(Q_OS_WIN32)
diff --git a/games/multimc/files/patch-application_UpdateController.cpp b/games/multimc/files/patch-application_UpdateController.cpp
new file mode 100644
index 000000000000..23ab48050a8a
--- /dev/null
+++ b/games/multimc/files/patch-application_UpdateController.cpp
@@ -0,0 +1,11 @@
+--- application/UpdateController.cpp.orig 2017-12-18 00:19:43 UTC
++++ application/UpdateController.cpp
+@@ -90,7 +90,7 @@ void UpdateController::installUpdates()
+ qDebug() << "Installing updates.";
+ #ifdef Q_OS_WIN
+ QString finishCmd = QApplication::applicationFilePath();
+-#elif defined Q_OS_LINUX
++#elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
+ QString finishCmd = FS::PathCombine(m_root, "MultiMC");
+ #elif defined Q_OS_MAC
+ QString finishCmd = QApplication::applicationFilePath();
diff --git a/games/multimc/files/patch-application_install__prereqs.cmake.in b/games/multimc/files/patch-application_install__prereqs.cmake.in
new file mode 100644
index 000000000000..7090e58efbb7
--- /dev/null
+++ b/games/multimc/files/patch-application_install__prereqs.cmake.in
@@ -0,0 +1,8 @@
+--- application/install_prereqs.cmake.in.orig 2017-12-18 00:19:43 UTC
++++ application/install_prereqs.cmake.in
+@@ -23,5 +23,4 @@ set(gp_cmd_paths ${gp_cmd_paths}
+ )
+
+ include(BundleUtilities)
+-fixup_bundle("@APPS@" "${QTPLUGINS}" "@DIRS@")
+
diff --git a/games/multimc/files/patch-libraries_iconfix_internal_qiconloader.cpp b/games/multimc/files/patch-libraries_iconfix_internal_qiconloader.cpp
new file mode 100644
index 000000000000..28bd762a59f8
--- /dev/null
+++ b/games/multimc/files/patch-libraries_iconfix_internal_qiconloader.cpp
@@ -0,0 +1,11 @@
+--- libraries/iconfix/internal/qiconloader.cpp.orig 2017-12-18 00:19:43 UTC
++++ libraries/iconfix/internal/qiconloader.cpp
+@@ -320,7 +320,7 @@ Description: Make it so that the QIcon l
+ icon theme specification.
+ 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 */
+ if (entries.isEmpty())
+ {
diff --git a/games/multimc/files/patch-libraries_systeminfo_src_sys__unix.cpp b/games/multimc/files/patch-libraries_systeminfo_src_sys__unix.cpp
new file mode 100644
index 000000000000..81f6d8107d58
--- /dev/null
+++ b/games/multimc/files/patch-libraries_systeminfo_src_sys__unix.cpp
@@ -0,0 +1,41 @@
+--- libraries/systeminfo/src/sys_unix.cpp.orig 2017-12-18 00:19:43 UTC
++++ libraries/systeminfo/src/sys_unix.cpp
+@@ -16,6 +16,7 @@ Sys::KernelInfo Sys::getKernelInfo()
+ uint64_t Sys::getSystemRam()
+ {
+ std::string token;
++ #ifdef Q_OS_LINUX
+ std::ifstream file("/proc/meminfo");
+ while(file >> token)
+ {
+@@ -34,6 +35,19 @@ uint64_t Sys::getSystemRam()
+ // ignore rest of the line
+ 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
+ }
+
+@@ -43,7 +57,9 @@ bool Sys::isCPU64bit()
+ }
+
+ bool Sys::isSystem64bit()
+-{
++{
++ #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
+ // kernel build arch on linux
+ return QSysInfo::currentCpuArchitecture() == "x86_64";
++ #endif
+ }
diff --git a/games/multimc/pkg-descr b/games/multimc/pkg-descr
new file mode 100644
index 000000000000..1142e14193c5
--- /dev/null
+++ b/games/multimc/pkg-descr
@@ -0,0 +1,5 @@
+MultiMC is a custom launcher for Minecraft that allows you to easily
+manage multiple installations of Minecraft at once. It also allows
+you to easily install and remove mods by simply dragging and dropping.
+
+WWW: https://multimc.org
diff --git a/games/multimc/pkg-plist b/games/multimc/pkg-plist
new file mode 100644
index 000000000000..3b4048f079ff
--- /dev/null
+++ b/games/multimc/pkg-plist
@@ -0,0 +1,10 @@
+bin/multimc
+lib/libMultiMC_gui.so
+lib/libMultiMC_iconfix.so
+lib/libMultiMC_logic.so
+lib/libMultiMC_nbt++.so
+lib/libMultiMC_quazip.so
+lib/libMultiMC_rainbow.so
+lib/libMultiMC_unpack200.so
+%%DATADIR%%/jars/JavaCheck.jar
+%%DATADIR%%/jars/NewLaunch.jar