From 34b33ab275bd359836a3e336d340c7a79579ba02 Mon Sep 17 00:00:00 2001 From: Darafei Praliaskouski Date: Mon, 25 Feb 2013 17:03:52 +0300 Subject: [PATCH] [linux][packaging] moved to /opt/ --- common.pri | 9 +++++--- graphics/graphics.pro | 2 +- platform/platform_linux.cpp | 37 ++++++++++++++++---------------- qt/qt.pro | 17 ++++++++------- qt/res/MapsWithMe.desktop | 6 +++--- qt/res/icons/128/MapsWithMe.png | Bin 17651 -> 0 bytes 6 files changed, 37 insertions(+), 34 deletions(-) delete mode 100644 qt/res/icons/128/MapsWithMe.png diff --git a/common.pri b/common.pri index 390acf4218..f102ab594f 100644 --- a/common.pri +++ b/common.pri @@ -126,9 +126,12 @@ unix|win32-g++ { QMAKE_CFLAGS_RELEASE *= -ffast-math QMAKE_CXXFLAGS_RELEASE *= -ffast-math - QMAKE_CFLAGS_RELEASE = -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security - QMAKE_CXXFLAGS_RELEASE = -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security - QMAKE_LFLAGS = -Wl,-z,relro + # debian build requirements + CONFIG(production) { + QMAKE_CFLAGS_RELEASE = -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security + QMAKE_CXXFLAGS_RELEASE = -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security + QMAKE_LFLAGS = -Wl,-z,relro + } } linux-g++* { diff --git a/graphics/graphics.pro b/graphics/graphics.pro index f6e36fc716..46cec40c31 100644 --- a/graphics/graphics.pro +++ b/graphics/graphics.pro @@ -152,7 +152,7 @@ win32* { SOURCES += opengl/opengl_es2.cpp } else { HEADERS += - if CONFIG(OMIM_OS_MAEMO) { + CONFIG(OMIM_OS_MAEMO) { SOURCES += opengl/opengl_es2.cpp } else { SOURCES += opengl/opengl_ext.cpp diff --git a/platform/platform_linux.cpp b/platform/platform_linux.cpp index 523463bc8e..31fe22ab8d 100644 --- a/platform/platform_linux.cpp +++ b/platform/platform_linux.cpp @@ -1,11 +1,10 @@ #include "platform.hpp" #include "../base/logging.hpp" +#include "../coding/file_reader.hpp" #include #include -#include "../std/fstream.hpp" - #include #include @@ -30,8 +29,8 @@ Platform::Platform() string path; CHECK(GetBinaryFolder(path), ("Can't retrieve path to executable")); - string home; - home = ::getenv("HOME"); + char const * homePath = ::getenv("HOME"); + string const home(homePath ? homePath : ""); m_settingsDir = home + "/.config/MapsWithMe/"; @@ -46,37 +45,38 @@ Platform::Platform() mkdir((home + "/.local/share/").c_str(), 0755); mkdir(m_writableDir.c_str(), 0755); - char * resDir = ::getenv("MWM_RESOURCES_DIR"); + char const * resDir = ::getenv("MWM_RESOURCES_DIR"); if (resDir) m_resourcesDir = resDir; else { - // installed version - if (IsFileExistsByFullPath("/usr/share/MapsWithMe/eula.html")) - m_resourcesDir = "/usr/share/MapsWithMe"; // developer builds with symlink if (IsFileExistsByFullPath(path + "../../data/eula.html")){ m_resourcesDir = path + "../../data"; m_writableDir = m_resourcesDir; } // developer builds without symlink - if (IsFileExistsByFullPath(path + "../../../omim/data/eula.html")) + else if (IsFileExistsByFullPath(path + "../../../omim/data/eula.html")) { m_resourcesDir = path + "../../../omim/data"; m_writableDir = m_resourcesDir; } - // portable installations + // installed version - /opt/MapsWithMe + else if (IsFileExistsByFullPath("/opt/MapsWithMe/share/eula.html")) + m_resourcesDir = "/opt/MapsWithMe/share"; + // installed version + else if (IsFileExistsByFullPath("/usr/share/MapsWithMe/eula.html")) + m_resourcesDir = "/usr/share/MapsWithMe"; + // all-nearby installs else if (IsFileExistsByFullPath(path + "/eula.html")) { m_resourcesDir = path; - m_writableDir = m_resourcesDir; - m_settingsDir = m_resourcesDir; } } m_resourcesDir += '/'; m_settingsDir += '/'; - char * tmpDir = ::getenv("TMPDIR"); + char const * tmpDir = ::getenv("TMPDIR"); if (tmpDir) m_tmpDir = tmpDir; else @@ -87,7 +87,7 @@ Platform::Platform() LOG(LDEBUG, ("Writable directory:", m_writableDir)); LOG(LDEBUG, ("Tmp directory:", m_tmpDir)); LOG(LDEBUG, ("Settings directory:", m_settingsDir)); - LOG(LDEBUG, ("Client ID:", UniqueClientId())); + LOG(LDEBUG, ("Client ID:", UniqueClientId())); } int Platform::CpuCores() const @@ -100,13 +100,12 @@ int Platform::CpuCores() const string Platform::UniqueClientId() const { - string machinefile = "/var/lib/dbus/machine-id"; + string machineFile = "/var/lib/dbus/machine-id"; if (IsFileExistsByFullPath("/etc/machine-id")) - machinefile = "/etc/machine-id"; + machineFile = "/etc/machine-id"; - std::ifstream ifs(machinefile.c_str()); - string content( (std::istreambuf_iterator(ifs) ), - (std::istreambuf_iterator() ) ); + string content; + FileReader(machineFile).ReadAsString(content); return content.substr(0,32); } diff --git a/qt/qt.pro b/qt/qt.pro index 3b2124f011..f128c4d383 100644 --- a/qt/qt.pro +++ b/qt/qt.pro @@ -3,6 +3,7 @@ ROOT_DIR = .. DEPENDENCIES = map gui search storage indexer graphics platform anim geometry coding base \ bzip2 freetype expat fribidi tomcrypt jansson protobuf zlib + include($$ROOT_DIR/common.pri) TARGET = MapsWithMe @@ -23,23 +24,23 @@ win32*|linux* { linux* { DEFINES += NO_DOWNLOADER - isEmpty(PREFIX):PREFIX = /usr + + isEmpty(PREFIX):PREFIX = /opt/MapsWithMe + DEFINES += INSTALL_PREFIX=$$(PREFIX) BINDIR = $$PREFIX/bin + DATADIR = $$PREFIX/share - RESDIR = $$DATADIR/$${TARGET} + RESDIR = $$DATADIR target.path = $$BINDIR - desktop.path = $$DATADIR/applications/ + desktop.path = /usr/share/applications/ desktop.files += res/$${TARGET}.desktop - pixmaps.path = $$DATADIR/pixmaps/ - pixmaps.files += res/icons/128/$${TARGET}.png - icon128.path = $$DATADIR/icons/hicolor/128x128/apps/ - icon128.files += res/icons/128/$${TARGET}.png + OTHER_RES.path = $$RESDIR OTHER_RES.files = ../data/about.html ../data/eula.html ../data/welcome.html \ ../data/countries.txt \ ../data/languages.txt ../data/categories.txt \ - ../data/packed_polygons.bin + ../data/packed_polygons.bin res/logo.png CLASSIFICATOR_RES.path = $$RESDIR CLASSIFICATOR_RES.files = ../data/classificator.txt \ ../data/types.txt diff --git a/qt/res/MapsWithMe.desktop b/qt/res/MapsWithMe.desktop index 0cbbbab3e5..ba5730c7fc 100644 --- a/qt/res/MapsWithMe.desktop +++ b/qt/res/MapsWithMe.desktop @@ -4,9 +4,9 @@ Name=MapsWithMe Version=1.0 GenericName=Detailed Offline Maps of the World GenericName[ru]=Подробная оффлайновая карта мира -Icon=MapsWithMe -TryExec=/usr/bin/MapsWithMe -Exec=/usr/bin/MapsWithMe +Icon=/opt/MapsWithMe/share/logo.png +TryExec=/opt/MapsWithMe/bin/MapsWithMe +Exec=/opt/MapsWithMe/bin/MapsWithMe Terminal=false StartupNotify=false Categories=Qt;Education;Science;Geography;Geoscience diff --git a/qt/res/icons/128/MapsWithMe.png b/qt/res/icons/128/MapsWithMe.png deleted file mode 100644 index 6dd5e09a619338506d2119110d7c37f49b92d23e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17651 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 Z|9|EG9?MWRFf{-G002ovPDHLkV1fW{m9+o>