0ad: initial import

This commit is contained in:
hasufell 2014-11-24 22:30:17 +01:00
parent c491cdc806
commit e2d3be929a
4 changed files with 519 additions and 0 deletions

View File

@ -2,6 +2,7 @@ app-virtualization
dev-lang
dev-libs
dev-util
games-strategy
sci-mathematics
x11-apps
x11-plugins

View File

@ -0,0 +1,150 @@
# Copyright 2014 Bernd Steinhauser <berniyh@exherbo.org>
# Copyright 2014 Julian Ospald <hasufell@posteo.de>
# Distributed under the terms of the GNU General Public License v2
require gtk-icon-cache
SUMMARY="A free, real-time strategy game"
HOMEPAGE="http://play0ad.com"
DOWNLOADS="
mirror://sourceforge/zero-ad/${PNV}-unix-build.tar.xz
mirror://sourceforge/zero-ad/${PNV}-unix-data.tar.xz
"
LICENCES="
Arev [[ note = [ Included DejaVu Fonts ] ]]
Bitstream-Vera [[ note = [ Included DejaVu Fonts ] ]]
BSD-3 [[ note = [ build/premake/premake4 ] ]]
CCPL-Attribution-ShareAlike-3.0 [[ note = [ binaries/data/mods/{art,audio} ] ]]
GPL-2 [[ note = [
source/tools/atlas
Rest of binaries/data
] ]]
GUST [[ note = [ Included TeXGyrePagella Fonts ] ]]
ISC [[ note = [ source/lobby/pkcs5_pbkdf2.cpp ] ]]
MIT [[ note = [
build/premake/*.lua
libraries/source/{fcollada,nvtt}
source/lib
source/third_party/mongoose
] ]]
ZLIB [[ note = [ source/third_party/mikktspace ] ]]
"
SLOT="0"
PLATFORMS="~amd64 ~x86"
MYOPTIONS="
editor [[ description = [ Include Atlas scenario editor projects ] ]]
lobby [[ description = [ Enable the multiplayer lobby ] ]]
sound
"
# nvtt (optional, mostly for 3rd party mods)
DEPENDENCIES="
editor? (
build+run:
x11-libs/wxGTK:3.0
)
lobby? (
build+run:
net-libs/gloox
)
sound? (
build+run:
media-libs/libvorbis
media-libs/openal
)
build:
virtual/pkg-config
build+run:
dev-libs/boost
dev-libs/spidermonkey:24.0[-icu(+)]
dev-libs/libxml2:2.0
media-libs/jpeg
media-libs/libogg
media-libs/libpng:=
media-libs/SDL:2[X]
net-libs/enet
net-libs/miniupnpc
net-misc/curl
x11-dri/mesa
x11-libs/libX11
x11-libs/libXcursor
"
DEFAULT_SRC_PREPARE_PATCHES=(
-p0 "${FILES}"/${PNV}-respect-flags.patch
-p1 "${FILES}"/${PNV}-paths.patch
)
src_configure() {
edo pushd "${WORK}"/build/premake/premake4
# The project uses an included version of premake (version 4.3.1),
# which doesn't seem available on premakes website.
# 4.3 does not work, 4.4 (b5) should be tested. So here we build
# premakes included version for now.
emake -C build/gmake.unix
# regenerate scripts.c so our patch applies
edo ./bin/release/premake4 embed
edo popd
# rebuild premake again...
emake -C "${WORK}"/build/premake/premake4/build/gmake.unix clean
emake -C "${WORK}"/build/premake/premake4/build/gmake.unix
# run premake to create build scripts
edo pushd "${WORK}"/build/premake
edo ./premake4/bin/release/premake4 \
--bindir=/usr/bin \
--libdir=/usr/${LIBDIR} \
--datadir=/usr/share/${PN} \
--file=premake4.lua \
--outpath=../workspaces/gcc/ \
--minimal-flags \
--sdl2 \
--without-nvtt \
$(option sound "" "--without-audio") \
$(option editor "--atlas" "") \
$(option lobby "" "--without-lobby") \
--with-system-miniupnpc \
--with-system-mozjs24 \
--collada \
--without-tests \
--with-c++11 \
--without-pch \
gmake
edo popd
}
src_compile() {
# build 3rd party fcollada
emake -C libraries/source/fcollada/src
# build 0ad
emake -C build/workspaces/gcc verbose=1
}
src_install() {
if optionq editor ; then
dobin binaries/system/ActorEditor
dolib binaries/system/libAtlasUI.so
fi
# TODO: Use system fonts
newbin binaries/system/pyrogenesis 0ad
dolib binaries/system/libCollada.so
insinto /usr/share/${PN}
doins -r binaries/data/*
insinto /usr/share/icons/hicolor/128x128/apps/
doins build/resources/${PN}.png
insinto /usr/share/applications
doins build/resources/0ad.desktop
dodoc README.txt binaries/system/readme.txt
}

View File

@ -0,0 +1,269 @@
From 97cf70148695df87154ad9fabb312037021a0d82 Mon Sep 17 00:00:00 2001
From: hasufell <hasufell@gentoo.org>
Date: Mon, 24 Nov 2014 21:20:43 +0100
Subject: [PATCH] Query /proc for the executable path on Linux
Author: leper
http://trac.wildfiregames.com/ticket/2086
http://trac.wildfiregames.com/changeset/15996
---
source/lib/sysdep/os/bsd/bsd.cpp | 46 +-------------
source/lib/sysdep/os/linux/linux.cpp | 62 +++++++-----------
.../sysdep/os/unix/unix_executable_pathname.cpp | 73 ++++++++++++++++++++++
.../lib/sysdep/os/unix/unix_executable_pathname.h | 28 +++++++++
4 files changed, 124 insertions(+), 85 deletions(-)
create mode 100644 source/lib/sysdep/os/unix/unix_executable_pathname.cpp
create mode 100644 source/lib/sysdep/os/unix/unix_executable_pathname.h
diff --git a/source/lib/sysdep/os/bsd/bsd.cpp b/source/lib/sysdep/os/bsd/bsd.cpp
index 34e1460..aa74b98 100644
--- a/source/lib/sysdep/os/bsd/bsd.cpp
+++ b/source/lib/sysdep/os/bsd/bsd.cpp
@@ -23,51 +23,9 @@
#include "precompiled.h"
#include "lib/sysdep/sysdep.h"
-
-#define GNU_SOURCE
-#include "mocks/dlfcn.h"
-#include "mocks/unistd.h"
-
-#include <cstdio>
+#include "lib/sysdep/os/unix/unix_excecutable_pathname.h"
OsPath sys_ExecutablePathname()
{
- // Find the executable's filename
- Dl_info dl_info;
- memset(&dl_info, 0, sizeof(dl_info));
- if (!T::dladdr((void *)sys_ExecutablePathname, &dl_info) || !dl_info.dli_fname)
- return OsPath();
- const char* path = dl_info.dli_fname;
-
- // If this looks like an absolute path, use realpath to get the normalized
- // path (with no '.' or '..')
- if (path[0] == '/')
- {
- char resolved[PATH_MAX];
- if (!realpath(path, resolved))
- return OsPath();
- return resolved;
- }
-
- // If this looks like a relative path, resolve against cwd and use realpath
- if (strchr(path, '/'))
- {
- char cwd[PATH_MAX];
- if (!T::getcwd(cwd, PATH_MAX))
- return OsPath();
-
- char absolute[PATH_MAX];
- int ret = snprintf(absolute, PATH_MAX, "%s/%s", cwd, path);
- if (ret < 0 || ret >= PATH_MAX)
- return OsPath(); // path too long, or other error
- char resolved[PATH_MAX];
- if (!realpath(absolute, resolved))
- return OsPath();
- return resolved;
- }
-
- // If it's not a path at all, i.e. it's just a filename, we'd
- // probably have to search through PATH to find it.
- // That's complex and should be uncommon, so don't bother.
- return OsPath();
+ return unix_ExecutablePathname();
}
diff --git a/source/lib/sysdep/os/linux/linux.cpp b/source/lib/sysdep/os/linux/linux.cpp
index da2a8ac..d2d47af 100644
--- a/source/lib/sysdep/os/linux/linux.cpp
+++ b/source/lib/sysdep/os/linux/linux.cpp
@@ -23,51 +23,31 @@
#include "precompiled.h"
#include "lib/sysdep/sysdep.h"
+#include "lib/sysdep/os/unix/unix_executable_pathname.h"
-#define GNU_SOURCE
-#include "mocks/dlfcn.h"
-#include "mocks/unistd.h"
-
-#include <cstdio>
-
-OsPath sys_ExecutablePathname()
+static bool getPathFromProc(char* buffer, size_t length)
{
- // Find the executable's filename
- Dl_info dl_info;
- memset(&dl_info, 0, sizeof(dl_info));
- if (!T::dladdr((void *)sys_ExecutablePathname, &dl_info) || !dl_info.dli_fname)
- return OsPath();
- const char* path = dl_info.dli_fname;
+ int pos = readlink("/proc/self/exe", buffer, length-1);
+ if (pos <= 0)
+ return false;
+ buffer[pos] = '\0';
- // If this looks like an absolute path, use realpath to get the normalized
- // path (with no '.' or '..')
- if (path[0] == '/')
- {
- char resolved[PATH_MAX];
- if (!realpath(path, resolved))
- return OsPath();
- return resolved;
- }
+ char* endOfPath = strrchr(buffer, '/');
+ if (endOfPath == NULL)
+ return false;
- // If this looks like a relative path, resolve against cwd and use realpath
- if (strchr(path, '/'))
- {
- char cwd[PATH_MAX];
- if (!T::getcwd(cwd, PATH_MAX))
- return OsPath();
+ ++endOfPath;
+ *endOfPath = '\0';
- char absolute[PATH_MAX];
- int ret = snprintf(absolute, PATH_MAX, "%s/%s", cwd, path);
- if (ret < 0 || ret >= PATH_MAX)
- return OsPath(); // path too long, or other error
- char resolved[PATH_MAX];
- if (!realpath(absolute, resolved))
- return OsPath();
- return resolved;
- }
+ return true;
+}
+
+OsPath sys_ExecutablePathname()
+{
+ // Check /proc for the path
+ char pathBuffer[PATH_MAX];
+ if (getPathFromProc(pathBuffer, sizeof(pathBuffer)))
+ return pathBuffer;
- // If it's not a path at all, i.e. it's just a filename, we'd
- // probably have to search through PATH to find it.
- // That's complex and should be uncommon, so don't bother.
- return OsPath();
+ return unix_ExecutablePathname();
}
diff --git a/source/lib/sysdep/os/unix/unix_executable_pathname.cpp b/source/lib/sysdep/os/unix/unix_executable_pathname.cpp
new file mode 100644
index 0000000..ae7b989
--- /dev/null
+++ b/source/lib/sysdep/os/unix/unix_executable_pathname.cpp
@@ -0,0 +1,73 @@
+/* Copyright (c) 2014 Wildfire Games
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "precompiled.h"
+
+#include "lib/sysdep/sysdep.h"
+
+#define GNU_SOURCE
+#include "mocks/dlfcn.h"
+#include "mocks/unistd.h"
+
+#include <cstdio>
+
+OsPath unix_ExecutablePathname()
+{
+ // Find the executable's filename
+ Dl_info dl_info;
+ memset(&dl_info, 0, sizeof(dl_info));
+ if (!T::dladdr((void *)sys_ExecutablePathname, &dl_info) || !dl_info.dli_fname)
+ return OsPath();
+ const char* path = dl_info.dli_fname;
+
+ // If this looks like an absolute path, use realpath to get the normalized
+ // path (with no '.' or '..')
+ if (path[0] == '/')
+ {
+ char resolved[PATH_MAX];
+ if (!realpath(path, resolved))
+ return OsPath();
+ return resolved;
+ }
+
+ // If this looks like a relative path, resolve against cwd and use realpath
+ if (strchr(path, '/'))
+ {
+ char cwd[PATH_MAX];
+ if (!T::getcwd(cwd, PATH_MAX))
+ return OsPath();
+
+ char absolute[PATH_MAX];
+ int ret = snprintf(absolute, PATH_MAX, "%s/%s", cwd, path);
+ if (ret < 0 || ret >= PATH_MAX)
+ return OsPath(); // path too long, or other error
+ char resolved[PATH_MAX];
+ if (!realpath(absolute, resolved))
+ return OsPath();
+ return resolved;
+ }
+
+ // If it's not a path at all, i.e. it's just a filename, we'd
+ // probably have to search through PATH to find it.
+ // That's complex and should be uncommon, so don't bother.
+ return OsPath();
+}
diff --git a/source/lib/sysdep/os/unix/unix_executable_pathname.h b/source/lib/sysdep/os/unix/unix_executable_pathname.h
new file mode 100644
index 0000000..f87c340
--- /dev/null
+++ b/source/lib/sysdep/os/unix/unix_executable_pathname.h
@@ -0,0 +1,28 @@
+/* Copyright (c) 2014 Wildfire Games
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef INCLUDED_UNIX_EXECUTABLE_PATHNAME
+#define INCLUDED_UNIX_EXECUTABLE_PATHNAME
+
+OsPath unix_ExecutablePathname();
+
+#endif // INCLUDED_UNIX_EXECUTABLE_PATHNAME
--
2.1.3

View File

@ -0,0 +1,99 @@
From: Julian Ospald <hasufell@gentoo.org>
Date: Sun Jun 24 18:32:38 UTC 2012
Subject: build system
respect flags
let stripping be handled by the system
fix minimal-flags option:
leave -fvisibility=hidden active
--- build/premake/premake4.lua
+++ build/premake/premake4.lua
@@ -177,7 +177,7 @@
function project_set_build_flags()
- flags { "Symbols", "NoEditAndContinue" }
+ flags { "NoEditAndContinue" }
if cc ~= "icc" and (os.is("windows") or not _OPTIONS["minimal-flags"]) then
-- adds the -Wall compiler flag
flags { "ExtraWarnings" } -- this causes far too many warnings/remarks on ICC
@@ -366,13 +366,11 @@
end
end
- if not _OPTIONS["minimal-flags"] then
- buildoptions {
- -- Hide symbols in dynamic shared objects by default, for efficiency and for equivalence with
- -- Windows - they should be exported explicitly with __attribute__ ((visibility ("default")))
- "-fvisibility=hidden"
- }
- end
+ buildoptions {
+ -- Hide symbols in dynamic shared objects by default, for efficiency and for equivalence with
+ -- Windows - they should be exported explicitly with __attribute__ ((visibility ("default")))
+ "-fvisibility=hidden"
+ }
if _OPTIONS["bindir"] then
defines { "INSTALLED_BINDIR=" .. _OPTIONS["bindir"] }
--- libraries/source/fcollada/src/Makefile
+++ libraries/source/fcollada/src/Makefile
@@ -9,9 +9,9 @@
CXX ?= g++
CXXFLAGS += -fvisibility=hidden -W -Wall -Wno-unused-parameter -Wno-unused-function $(OS_DEFINE) $(PIC_FLAGS) $(CPPFLAGS)
-CXXFLAGS_DEBUG := -O0 -g -D_DEBUG -DRETAIL
-CXXFLAGS_RELEASE := -O2 -DNDEBUG -DRETAIL
-CXXFLAGS_TEST := -O0 -g -D_DEBUG
+CXXFLAGS_DEBUG := -D_DEBUG -DRETAIL
+CXXFLAGS_RELEASE := -DNDEBUG -DRETAIL
+CXXFLAGS_TEST := -D_DEBUG
LIBS += `pkg-config libxml-2.0 --libs`
INCLUDES += -IFCollada `pkg-config libxml-2.0 --cflags`
INCLUDES_TEST := -IFCollada/FColladaTest $(INCLUDES)
--- build/premake/premake4/src/tools/gcc.lua
+++ build/premake/premake4/src/tools/gcc.lua
@@ -136,8 +136,6 @@
if not cfg.flags.Symbols then
if cfg.system == "macosx" then
table.insert(result, "-Wl,-x")
- else
- table.insert(result, "-s")
end
end
--- build/premake/premake4/build/gmake.unix/Premake4.make
+++ build/premake/premake4/build/gmake.unix/Premake4.make
@@ -26,9 +26,9 @@
DEFINES += -DNDEBUG -DLUA_USE_POSIX -DLUA_USE_DLOPEN
INCLUDES += -I../../src/host/lua-5.1.4/src
CPPFLAGS += -MMD -MP $(DEFINES) $(INCLUDES)
- CFLAGS += $(CPPFLAGS) -Wall -Os
- CXXFLAGS += $(CPPFLAGS) -Wall -Os
- LDFLAGS += -s -rdynamic
+ CFLAGS += $(CPPFLAGS) -Wall
+ CXXFLAGS += $(CPPFLAGS) -Wall
+ LDFLAGS += -rdynamic
LIBS += -lm -ldl
RESFLAGS += $(DEFINES) $(INCLUDES)
LDDEPS +=
@@ -48,8 +48,8 @@
DEFINES += -D_DEBUG -DLUA_USE_POSIX -DLUA_USE_DLOPEN
INCLUDES += -I../../src/host/lua-5.1.4/src
CPPFLAGS += -MMD -MP $(DEFINES) $(INCLUDES)
- CFLAGS += $(CPPFLAGS) -Wall -g
- CXXFLAGS += $(CPPFLAGS) -Wall -g
+ CFLAGS += $(CPPFLAGS) -Wall
+ CXXFLAGS += $(CPPFLAGS) -Wall
LDFLAGS += -rdynamic
LIBS += -lm -ldl
RESFLAGS += $(DEFINES) $(INCLUDES)
@@ -302,4 +302,4 @@
$(SILENT) $(CC) $(PCHINCLUDES) $(CFLAGS) -MF $(OBJDIR)/lauxlib.d -MT "$@" -o "$@" -c "$<"
-include $(OBJECTS:%.o=%.d)
--include $(GCH:%.h.gch=%.h.d)
\ No newline at end of file
+-include $(GCH:%.h.gch=%.h.d)