commit 8ffaf7d9d96b0fd93f1b479691cb4ae98b47a439
Author: leigh123linux <leigh123linux(a)googlemail.com>
Date: Sat Jul 8 22:32:30 2017 +0100
Clean up spec file and fix rpmlint errors
1.2.4-ftbfs-fix-gcc-7-boost-1.64.patch | 933 +++++++++++++++++++++++++++++++++
bombono-dvd.spec | 38 +-
2 files changed, 953 insertions(+), 18 deletions(-)
---
diff --git a/1.2.4-ftbfs-fix-gcc-7-boost-1.64.patch
b/1.2.4-ftbfs-fix-gcc-7-boost-1.64.patch
new file mode 100644
index 0000000..c57df84
--- /dev/null
+++ b/1.2.4-ftbfs-fix-gcc-7-boost-1.64.patch
@@ -0,0 +1,933 @@
+From 50a3dd96b7197c667e529ded0ed173e2074dbde2 Mon Sep 17 00:00:00 2001
+From: Behnam Momeni <sbmomeni(a)gmail.com>
+Date: Thu, 1 Jun 2017 15:29:35 +0430
+Subject: [PATCH 1/8] Fixing ffmpeg codecid
+
+---
+ src/mgui/ffviewer.cpp | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/mgui/ffviewer.cpp b/src/mgui/ffviewer.cpp
+index 64ea813..ac37183 100644
+--- a/src/mgui/ffviewer.cpp
++++ b/src/mgui/ffviewer.cpp
+@@ -74,7 +74,7 @@ C_LINKAGE_BEGIN
+
+ typedef struct AVCodecTag {
+ #if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,39,00)
+- enum CodecID id;
++ enum AVCodecID id;
+ #else
+ int id;
+ #endif
+@@ -82,14 +82,14 @@ typedef struct AVCodecTag {
+ } AVCodecTag;
+
+ #if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,34,00)
+-static uint FFCodecID2Tag(CodecID codec_id)
++static uint FFCodecID2Tag(AVCodecID codec_id)
+ {
+ unsigned int ff_codec_get_tag(const AVCodecTag *tags, int id);
+ extern const AVCodecTag ff_codec_bmp_tags[];
+ return ff_codec_get_tag(ff_codec_bmp_tags, codec_id);
+ }
+ #else
+-static uint FFCodecID2Tag(CodecID codec_id)
++static uint FFCodecID2Tag(AVCodecID codec_id)
+ {
+ unsigned int codec_get_tag(const AVCodecTag *tags, int id);
+ extern const AVCodecTag codec_bmp_tags[];
+@@ -400,7 +400,7 @@ static unsigned char GetChar(uint tag, int bit_begin)
+ return (tag>>bit_begin) & 0xFF;
+ }
+
+-static std::string CodecID2Str(CodecID codec_id)
++static std::string CodecID2Str(AVCodecID codec_id)
+ {
+ #ifdef _MSC_VER
+ std::string tag_str = boost::format("%1%") % codec_id % bf::stop;
+
+From f27c249cba3fc1dcd22e6bb9d4c96331bfa6a8d2 Mon Sep 17 00:00:00 2001
+From: Behnam Momeni <sbmomeni(a)gmail.com>
+Date: Thu, 1 Jun 2017 15:30:26 +0430
+Subject: [PATCH 2/8] Pointer cannot be casted to boolean implicitly
+
+---
+ src/mgui/dvdimport.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/mgui/dvdimport.cpp b/src/mgui/dvdimport.cpp
+index 44dcdec..47f334b 100644
+--- a/src/mgui/dvdimport.cpp
++++ b/src/mgui/dvdimport.cpp
+@@ -275,7 +275,7 @@ static ReaderPtr OpenDVD(const std::string& dvd_path,
ImportData& id)
+ id.errLbl.hide();
+
+ id.reader = rd;
+- SetCurPageComplete(id.ast, id.reader);
++ SetCurPageComplete(id.ast, bool(id.reader));
+
+ return rd;
+ }
+
+From 7bf94ff30c256415d76e445ba43447e485e8bdfb Mon Sep 17 00:00:00 2001
+From: Behnam Momeni <sbmomeni(a)gmail.com>
+Date: Thu, 1 Jun 2017 15:32:36 +0430
+Subject: [PATCH 3/8] Fixing C++11 literal warnings
+
+---
+ src/mgui/author/burn.cpp | 6 +++---
+ src/mgui/author/execute.cpp | 14 +++++++-------
+ src/mgui/author/render.cpp | 10 +++++-----
+ src/mgui/author/script.cpp | 8 ++++----
+ src/mgui/project/browser.cpp | 2 +-
+ src/mlib/regex.h | 2 +-
+ 6 files changed, 21 insertions(+), 21 deletions(-)
+
+diff --git a/src/mgui/author/burn.cpp b/src/mgui/author/burn.cpp
+index ddfad0a..578429e 100644
+--- a/src/mgui/author/burn.cpp
++++ b/src/mgui/author/burn.cpp
+@@ -85,7 +85,7 @@ BurnData& GetInitedBD()
+ return bd;
+ }
+
+-re::pattern WriteSpeed_RE("Write Speed #"RG_NUM":"RG_SPS
RG_NUM"\\."RG_NUM "x1385");
++re::pattern WriteSpeed_RE("Write Speed #" RG_NUM ":" RG_SPS RG_NUM
"\\." RG_NUM "x1385");
+
+ RefPtr<Gtk::ListStore> sp_store;
+
+@@ -253,7 +253,7 @@ DVDInfo ParseDVDInfo(bool is_good, const std::string& out_info)
+ }
+ else
+ {
+- static re::pattern media_type_re("Mounted
Media:"RG_SPS"[0-9A-F]+h, ([^ \n]+)");
++ static re::pattern media_type_re("Mounted Media:" RG_SPS
"[0-9A-F]+h, ([^ \n]+)");
+ re::match_results what;
+
+ bool is_found = re::search(out_info, what, media_type_re);
+@@ -277,7 +277,7 @@ DVDInfo ParseDVDInfo(bool is_good, const std::string& out_info)
+ // isBlank
+ if( res != dvdOTHER )
+ {
+- static re::pattern media_status_re("Disc
status:"RG_SPS"([a-z]+)\n");
++ static re::pattern media_status_re("Disc status:" RG_SPS
"([a-z]+)\n");
+ bool is_found = re::search(out_info, what, media_status_re);
+ ASSERT_RTL( is_found );
+
+diff --git a/src/mgui/author/execute.cpp b/src/mgui/author/execute.cpp
+index 5b2330c..e308552 100644
+--- a/src/mgui/author/execute.cpp
++++ b/src/mgui/author/execute.cpp
+@@ -64,9 +64,9 @@ static void InitFoundStageTag(RefPtr<Gtk::TextTag> tag)
+ tag->property_foreground() = "darkgreen";
+ }
+
+-re::pattern DVDAuthorRE(RG_CMD_BEG"dvdauthor"RG_EW ".*-x"RG_EW
RG_SPS RG_BW"DVDAuthor\\.xml"RG_EW);
+-re::pattern MkIsoFsRE(RG_CMD_BEG MK_ISO_CMD RG_EW ".*-dvd-video"RG_EW
".*>.*"RG_BW"dvd.iso"RG_EW);
+-re::pattern GrowIsoFsRE(RG_CMD_BEG"growisofs"RG_EW
".*-dvd-compat"RG_EW ".*-dvd-video"RG_EW);
++re::pattern DVDAuthorRE(RG_CMD_BEG"dvdauthor" RG_EW ".*-x" RG_EW
RG_SPS RG_BW "DVDAuthor\\.xml" RG_EW);
++re::pattern MkIsoFsRE(RG_CMD_BEG MK_ISO_CMD RG_EW ".*-dvd-video" RG_EW
".*>.*" RG_BW "dvd.iso" RG_EW);
++re::pattern GrowIsoFsRE(RG_CMD_BEG"growisofs" RG_EW ".*-dvd-compat"
RG_EW ".*-dvd-video" RG_EW);
+
+ //static void PrintMatchResults(const re::match_results& what)
+ //{
+@@ -94,7 +94,7 @@ class MkIsoFsPP: public ProgressParser
+ virtual void Filter(const std::string& line);
+ };
+
+-re::pattern MkIsoFsPercent_RE( RG_FLT"?% done");
++re::pattern MkIsoFsPercent_RE( RG_FLT "?% done");
+
+ void MkIsoFsPP::Filter(const std::string& line)
+ {
+@@ -126,8 +126,8 @@ class DVDAuthorPP: public ProgressParser
+ bool fixStage;
+ };
+
+-re::pattern DVDAuthorVOB_RE( "^STAT: VOBU "RG_NUM" at
"RG_NUM"MB");
+-re::pattern DVDAuthorFix_RE( "^STAT: fixing VOBU at "RG_NUM"MB
\\("RG_NUM"/"RG_NUM", "RG_NUM"%\\)");
++re::pattern DVDAuthorVOB_RE( "^STAT: VOBU " RG_NUM " at " RG_NUM
"MB");
++re::pattern DVDAuthorFix_RE( "^STAT: fixing VOBU at " RG_NUM "MB
\\(" RG_NUM "/" RG_NUM ", " RG_NUM "%\\)");
+
+ void DVDAuthorPP::Filter(const std::string& line)
+ {
+@@ -157,7 +157,7 @@ void DVDAuthorPP::Filter(const std::string& line)
+ if( p )
+ of.SetProgress(p);
+
+- static re::pattern ch_error_re("ERR:.*Cannot jump to chapter "RG_NUM"
of title "RG_NUM", only "RG_NUM" exist");
++ static re::pattern ch_error_re("ERR:.*Cannot jump to chapter " RG_NUM
" of title " RG_NUM ", only " RG_NUM " exist");
+ if( re::search(line, what, ch_error_re) )
+ {
+ std::string& err_str = of.firstError;
+diff --git a/src/mgui/author/render.cpp b/src/mgui/author/render.cpp
+index 1ffbca2..93557b2 100644
+--- a/src/mgui/author/render.cpp
++++ b/src/mgui/author/render.cpp
+@@ -866,7 +866,7 @@ std::string FFmpegPostArgs(const std::string& out_fname, bool
is_4_3, bool is_pa
+ //
+ // :KLUDGE: (только) в ffmpeg, avformat 53.13.0, поменяли . на : => надо
+ // самим открывать файл и узнавать индекс!
+- static re::pattern audio_idx("Stream
#"RG_NUM"[\\.|:]"RG_NUM".*Audio:");
++ static re::pattern audio_idx("Stream #" RG_NUM "[\\.|:]"
RG_NUM ".*Audio:");
+
+ re::match_results what;
+ // флаг означает, что перевод строки не может быть точкой
+@@ -1221,17 +1221,17 @@ void TestFFmpegForDVDEncoding(const std::string& conts)
+ {
+ CheckNoCodecs(CheckForCodecList(conts));
+
+- static re::pattern dvd_format("^ .E dvd"RG_EW);
++ static re::pattern dvd_format("^ .E dvd" RG_EW);
+ CheckStrippedFFmpeg(dvd_format, conts, "dvd format");
+
+ // :TRICKY: с версии libavcodec 54 при выводе начальный пробел не ставят => поэтому
?
+ // ("спасибо" Anton Khirnov за очередное "улучшение")
+ #define _CPP_ "^ ?"
+- static re::pattern mpeg2video_codec(_CPP_".EV... mpeg2video"RG_EW);
++ static re::pattern mpeg2video_codec(_CPP_ ".EV... mpeg2video" RG_EW);
+ CheckStrippedFFmpeg(mpeg2video_codec, conts, "mpeg2 video encoder");
+
+ // по факту ffmpeg всегда использует ac3, однако mp2 тоже возможен
+- static re::pattern ac3_codec(_CPP_".EA... ac3"RG_EW);
++ static re::pattern ac3_codec(_CPP_ ".EA... ac3" RG_EW);
+ CheckStrippedFFmpeg(ac3_codec, conts, "ac3 audio encoder");
+ #undef _CPP_
+ }
+@@ -1241,7 +1241,7 @@ TripleVersion FindAVVersion(const std::string& conts, const
char* avlib_name)
+ // * ищем версию libavfilter
+ // пример: " libavfilter 0. 4. 0 / "
+ #define RG_PADNUM RG_SPS RG_NUM
+- std::string reg_str =
boost::format(RG_BW"%1%"RG_PADNUM"\\."RG_PADNUM"\\."RG_PADNUM"
/ ")
++ std::string reg_str = boost::format(RG_BW "%1%" RG_PADNUM "\\."
RG_PADNUM "\\." RG_PADNUM " / ")
+ % avlib_name % bf::stop;
+ re::pattern avfilter_version(reg_str.c_str());
+ return FindVersion(conts, avfilter_version, AVCnvBin(), avlib_name);
+diff --git a/src/mgui/author/script.cpp b/src/mgui/author/script.cpp
+index ccfd32f..5fecb0e 100644
+--- a/src/mgui/author/script.cpp
++++ b/src/mgui/author/script.cpp
+@@ -755,9 +755,9 @@ static void CalcTransPercent(double cur_dur, Job& job,
JobData& jd, double full_
+ // ffmpeg выводит статистику первого создаваемого файла каждые полсекунды,
+ // см. print_report() (при verbose=1, по умолчанию)
+ // Формат размера: "size=%8.0fkB"
+-re::pattern FFmpegSizePat( "size= *"RG_NUM"kB");
++re::pattern FFmpegSizePat( "size= *" RG_NUM "kB");
+ // Формат длительности: "time=%0.2f"
+-re::pattern FFmpegDurPat( "time="RG_FLT);
++re::pattern FFmpegDurPat( "time=" RG_FLT);
+
+ static void OnTranscodePrintParse(const char* dat, int sz, const PercentFunctor&
fnr)
+ {
+@@ -787,7 +787,7 @@ static void OnTranscodePrintParse(const char* dat, int sz, const
PercentFunctor&
+
+ // Формат длительности для ffmpeg c коммита dd471070:
"time=%02d:%02d:%02d.%02d"
+ // Образец: frame= 208 fps= 58 q=2.0 size= 476kB time=00:00:08.44 bitrate=
461.9kbits/s dup=1 drop=0
+-re::pattern FFmpegNewDurPat(
"time="RG_NUM":"RG_NUM":"RG_FLT);
++re::pattern FFmpegNewDurPat( "time=" RG_NUM ":" RG_NUM ":"
RG_FLT);
+
+ static void OnTranscodeHMSParse(const char* dat, int sz, const PercentFunctor& fnr)
+ {
+@@ -1136,7 +1136,7 @@ static void AuthorImpl(const std::string& out_dir)
+ // 2) парсер dvdauthor не любит незнакомые ему атрибуты => spumux <
0.7 не работает
+ std::string help_str;
+ PipeOutput("spumux -h", help_str);
+- static re::pattern spumux_version("DVDAuthor::spumux, version
"RG_NUM"\\."RG_NUM"\\."RG_NUM"\\.\n");
++ static re::pattern spumux_version("DVDAuthor::spumux, version "
RG_NUM "\\." RG_NUM "\\." RG_NUM "\\.\n");
+ if( IsVersionGE(FindVersion(help_str, spumux_version, "spumux"),
TripleVersion(0, 7, 0)) )
+ AddFormatAttr(sp);
+
+diff --git a/src/mgui/project/browser.cpp b/src/mgui/project/browser.cpp
+index 02d95a1..47b730b 100644
+--- a/src/mgui/project/browser.cpp
++++ b/src/mgui/project/browser.cpp
+@@ -328,7 +328,7 @@ Gtk::HButtonBox& CreateMListButtonBox()
+ return hb;
+ }
+
+-std::string MediaItemDnDTVType() { return
"DnDTreeView<"DND_MI_NAME">"; }
++std::string MediaItemDnDTVType() { return "DnDTreeView<" DND_MI_NAME
">"; }
+
+ void SetupBrowser(ObjectBrowser& brw, int dnd_column, bool is_media_brw)
+ {
+diff --git a/src/mlib/regex.h b/src/mlib/regex.h
+index 4a18717..a138e3c 100644
+--- a/src/mlib/regex.h
++++ b/src/mlib/regex.h
+@@ -185,7 +185,7 @@ bool search(const std::string& s,
+ #define RG_EW "\\>" // конец слова
+ #define RG_SPS "[[:space:]]*" // пробелы
+ #define RG_NUM "([0-9]+)" // число
+-#define RG_FLT RG_NUM"([\\.,]"RG_NUM")" // вещ. число, в паре с
ExtractDouble()
++#define RG_FLT RG_NUM "([\\.,]" RG_NUM ")" // вещ. число, в паре с
ExtractDouble()
+ #define RG_CMD_BEG RG_BW // "^"RG_SPS // начало команды
+
+ bool ExtractDouble(double& val, const re::match_results& what, int idx = 1);
+
+From 5b1741fa8523186799baa21a83dfe9bae774864e Mon Sep 17 00:00:00 2001
+From: Behnam Momeni <sbmomeni(a)gmail.com>
+Date: Thu, 1 Jun 2017 15:33:24 +0430
+Subject: [PATCH 4/8] Replacing the deprecated autoptr
+
+---
+ libs/boost-logging/boost/logging/detail/tss/tss_impl_pthread.hpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/libs/boost-logging/boost/logging/detail/tss/tss_impl_pthread.hpp
b/libs/boost-logging/boost/logging/detail/tss/tss_impl_pthread.hpp
+index 3077276..af9afd2 100644
+--- a/libs/boost-logging/boost/logging/detail/tss/tss_impl_pthread.hpp
++++ b/libs/boost-logging/boost/logging/detail/tss/tss_impl_pthread.hpp
+@@ -39,7 +39,7 @@ inline tss_slots* get_slots()
+ slots = static_cast<tss_slots*>( pthread_getspecific(tss_data_native_key()));
+ if (slots == 0)
+ {
+- std::auto_ptr<tss_slots> temp( new_object_ensure_delete<tss_slots>()
);
++ std::unique_ptr<tss_slots> temp(
new_object_ensure_delete<tss_slots>() );
+ // pre-allocate a few elems, so that we'll be fast
+ temp->resize(BOOST_LOG_TSS_SLOTS_SIZE);
+
+
+From dce7fdf4f938487a9d1b6d1a219bd9cdc3299385 Mon Sep 17 00:00:00 2001
+From: Behnam Momeni <sbmomeni(a)gmail.com>
+Date: Thu, 1 Jun 2017 15:34:03 +0430
+Subject: [PATCH 5/8] Replacing the deprecated boost APIs
+
+---
+ src/mbase/project/table.cpp | 4 ++--
+ src/mbase/project/tests/test_table.cpp | 2 +-
+ src/mgui/author/script.cpp | 2 +-
+ src/mgui/mux.cpp | 2 +-
+ src/mgui/project/add.cpp | 2 +-
+ src/mgui/project/serialize.cpp | 2 +-
+ src/mgui/timeline/select.cpp | 2 +-
+ src/mlib/filesystem.cpp | 19 +++++--------------
+ src/mlib/tests/test_utils.cpp | 10 +++++-----
+ 9 files changed, 18 insertions(+), 27 deletions(-)
+
+diff --git a/src/mbase/project/table.cpp b/src/mbase/project/table.cpp
+index 455c334..c7d99cc 100644
+--- a/src/mbase/project/table.cpp
++++ b/src/mbase/project/table.cpp
+@@ -154,7 +154,7 @@ NameValueT<Media> LoadMedia(Archieve& ar, MediaList&
md_list)
+ void SerializePath(Archieve& ar, const char* tag_name, std::string& fpath)
+ {
+ //ar & NameValue("Path", mdPath);
+- fs::path rel_to_dir = fs::path(AData().GetProjectFName()).branch_path();
++ fs::path rel_to_dir = fs::path(AData().GetProjectFName()).parent_path();
+ if( ar.IsLoad() )
+ {
+ ar >> NameValue(tag_name, fpath);
+@@ -162,7 +162,7 @@ void SerializePath(Archieve& ar, const char* tag_name,
std::string& fpath)
+ if( !fpath.empty() )
+ {
+ fs::path pth(fpath);
+- if( !pth.is_complete() )
++ if( !pth.is_absolute() )
+ fpath = (rel_to_dir/fpath).string();
+ }
+ }
+diff --git a/src/mbase/project/tests/test_table.cpp
b/src/mbase/project/tests/test_table.cpp
+index f8a1c20..3e7115a 100644
+--- a/src/mbase/project/tests/test_table.cpp
++++ b/src/mbase/project/tests/test_table.cpp
+@@ -129,7 +129,7 @@ BOOST_AUTO_TEST_CASE( TestMediaList )
+ // проверка чтения/записи путей
+ boost::intrusive_ptr<StillImageMD> pict2 =
ptr::dynamic_pointer_cast<StillImageMD>(ml[2]);
+ fs::path pth = pict2->GetPath();
+- BOOST_CHECK( pth.is_complete() );
++ BOOST_CHECK( pth.is_absolute() );
+ BOOST_CHECK( fs::exists(pth) );
+
+ // проверка ссылок
+diff --git a/src/mgui/author/script.cpp b/src/mgui/author/script.cpp
+index 5fecb0e..6b1db57 100644
+--- a/src/mgui/author/script.cpp
++++ b/src/mgui/author/script.cpp
+@@ -676,7 +676,7 @@ static void CheckSpumuxFontFile()
+ if( !fs::exists(font_path) )
+ {
+ std::string err_str;
+- if( !CreateDirs(font_path.branch_path(), err_str) )
++ if( !CreateDirs(font_path.parent_path(), err_str) )
+ Error(err_str.c_str());
+ fs::copy_file(DataDirPath("copy-n-paste/FreeSans.ttf"), font_path);
+ }
+diff --git a/src/mgui/mux.cpp b/src/mgui/mux.cpp
+index 427058e..885dde7 100644
+--- a/src/mgui/mux.cpp
++++ b/src/mgui/mux.cpp
+@@ -162,7 +162,7 @@ static void OnVideoSelected(Gtk::FileChooserButton& v_btn,
Gtk::FileChooserButto
+ fs::path pth = GetFilename(v_btn);
+ if( pth.empty() )
+ return;
+- std::string folder = pth.branch_path().string();
++ std::string folder = pth.parent_path().string();
+
+ if( a_btn.get_filename().empty() )
+ a_btn.set_current_folder(folder);
+diff --git a/src/mgui/project/add.cpp b/src/mgui/project/add.cpp
+index 9454578..ce7a705 100644
+--- a/src/mgui/project/add.cpp
++++ b/src/mgui/project/add.cpp
+@@ -479,7 +479,7 @@ void TryAddMedias(const Str::List& paths, MediaBrowser& brw,
+ MessageBox(BF_("The file \"%1%\" looks like VOB from
DVD.\nRun import?") % leaf % bf::stop,
+ Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL) ==
Gtk::RESPONSE_OK )
+ {
+- DVD::RunImport(*GetTopWindow(brw), pth.branch_path().string());
++ DVD::RunImport(*GetTopWindow(brw), pth.parent_path().string());
+ return;
+ }
+ }
+diff --git a/src/mgui/project/serialize.cpp b/src/mgui/project/serialize.cpp
+index a5366aa..03583ec 100644
+--- a/src/mgui/project/serialize.cpp
++++ b/src/mgui/project/serialize.cpp
+@@ -73,7 +73,7 @@ static std::string MakeProjectTitle(bool with_path_breakdown = false)
+ fs::path full_path(db.GetProjectFName());
+ std::string res_str = fs::name_str(full_path);
+ if( with_path_breakdown )
+- res_str += " (" + full_path.branch_path().string() + ")";
++ res_str += " (" + full_path.parent_path().string() + ")";
+ return res_str;
+ }
+
+diff --git a/src/mgui/timeline/select.cpp b/src/mgui/timeline/select.cpp
+index 9d8ec5a..337ada6 100644
+--- a/src/mgui/timeline/select.cpp
++++ b/src/mgui/timeline/select.cpp
+@@ -152,7 +152,7 @@ static void SaveFrame(DAMonitor& mon)
+
+ mon.FramePixbuf()->save(fnam, ext);
+
+- SaveFrameDir() = fs::path(fnam).branch_path().string();
++ SaveFrameDir() = fs::path(fnam).parent_path().string();
+ if( add_btn.get_active() )
+ Project::TryAddMediaQuiet(fnam, "SaveFrame");
+ }
+diff --git a/src/mlib/filesystem.cpp b/src/mlib/filesystem.cpp
+index 7ae7162..c60b753 100644
+--- a/src/mlib/filesystem.cpp
++++ b/src/mlib/filesystem.cpp
+@@ -161,25 +161,16 @@ namespace Project
+
+ fs::path MakeAbsolutePath(const fs::path& pth, const fs::path& cur_dir)
+ {
+- fs::path res;
+-
+- if( pth.is_complete() )
+- res = pth;
+- else
+- {
+- fs::path dir = cur_dir.empty() ? fs::current_path() : cur_dir ;
+- res = dir/pth;
+- }
+- return res.normalize();
++ return absolute(pth, cur_dir);
+ }
+
+ // оба аргумента должны быть абсолютными путями
+ bool MakeRelativeToDir(fs::path& pth, fs::path dir)
+ {
+- pth.normalize();
+- dir.normalize();
+- ASSERT( pth.is_complete() );
+- ASSERT( dir.is_complete() );
++ pth = canonical(pth);
++ dir = canonical(dir);
++ ASSERT( pth.is_absolute() );
++ ASSERT( dir.is_absolute() );
+
+ fs::path::iterator p_itr = pth.begin(), p_end = pth.end();
+ fs::path::iterator d_itr = dir.begin(), d_end = dir.end();
+diff --git a/src/mlib/tests/test_utils.cpp b/src/mlib/tests/test_utils.cpp
+index c4712e8..99a2e94 100644
+--- a/src/mlib/tests/test_utils.cpp
++++ b/src/mlib/tests/test_utils.cpp
+@@ -139,17 +139,17 @@ BOOST_AUTO_TEST_CASE( TestFilesystem )
+ #endif
+ }
+
+- // is_complete
++ // is_absolute
+ {
+ fs::path pth("../some_file");
+- BOOST_CHECK( !pth.is_complete() );
+- BOOST_CHECK( fs::current_path().is_complete() );
++ BOOST_CHECK( !pth.is_absolute() );
++ BOOST_CHECK( fs::current_path().is_absolute() );
+
+ fs::path apth = Project::MakeAbsolutePath(pth);
+ //LOG_INF << "Making abs path: " << pth.string() <<
" => " << apth.string() << io::endl;
+
+- BOOST_CHECK( Project::MakeAbsolutePath(pth,
MakeRootComplete("/")).is_complete() );
+- BOOST_CHECK( !Project::MakeAbsolutePath(pth, "./").is_complete() );
++ BOOST_CHECK( Project::MakeAbsolutePath(pth,
MakeRootComplete("/")).is_absolute() );
++ BOOST_CHECK( !Project::MakeAbsolutePath(pth, "./").is_absolute() );
+ }
+
+ // MakeRelativeToDir
+
+From a1c81a5a3c2a710decd82ec81c9c8c6b546e111f Mon Sep 17 00:00:00 2001
+From: Behnam Momeni <sbmomeni(a)gmail.com>
+Date: Thu, 1 Jun 2017 15:34:44 +0430
+Subject: [PATCH 6/8] Making it compatible with ffmpeg30
+
+---
+ src/mgui/ffviewer.cpp | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/src/mgui/ffviewer.cpp b/src/mgui/ffviewer.cpp
+index ac37183..a8dc6cb 100644
+--- a/src/mgui/ffviewer.cpp
++++ b/src/mgui/ffviewer.cpp
+@@ -36,6 +36,10 @@
+ #define AVFORMAT_54
+ #endif
+
++C_LINKAGE_BEGIN
++#include <libavutil/imgutils.h>
++C_LINKAGE_END
++
+ // разрабы libav считают себя самыми умными и потому решили
+ // закрыть простым смертным доступ к ffurl_register_protocol()
+ // (бывшая av_register_protocol2()),-
https://bugzilla.libav.org/show_bug.cgi?id=224
+@@ -807,7 +811,7 @@ static void DoVideoDecode(FFViewer& ffv, int& got_picture,
AVPacket* pkt)
+ #ifdef AVFRAME_INIT_CHANGE
+ // avcodec_get_frame_defaults() перенесли в avcodec_decode_video2()
+ #else
+- avcodec_get_frame_defaults(&picture); // ffmpeg.c очищает каждый раз
++ av_frame_unref (&picture);
+ #endif
+
+ #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,25,00)
+
+From 65d32508d2b045f5ce42d000b5a846e08165118d Mon Sep 17 00:00:00 2001
+From: Behnam Momeni <sbmomeni(a)gmail.com>
+Date: Thu, 1 Jun 2017 15:35:26 +0430
+Subject: [PATCH 7/8] Removing deprecated throw specifications
+
+---
+ src/mbase/project/srl-db.cpp | 2 +-
+ src/mbase/project/table.h | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/mbase/project/srl-db.cpp b/src/mbase/project/srl-db.cpp
+index c3babec..e50a523 100644
+--- a/src/mbase/project/srl-db.cpp
++++ b/src/mbase/project/srl-db.cpp
+@@ -102,7 +102,7 @@ void DbSerializeProjectImpl(Archieve& ar)
+ }
+
+ void ADatabase::Load(const std::string& fname,
+- const std::string& cur_dir) throw (std::exception)
++ const std::string& cur_dir)
+ {
+ try
+ {
+diff --git a/src/mbase/project/table.h b/src/mbase/project/table.h
+index 7c73085..cc7e36d 100644
+--- a/src/mbase/project/table.h
++++ b/src/mbase/project/table.h
+@@ -128,7 +128,7 @@ class ADatabase: public Singleton<ADatabase>, public DataWare
+ void ClearSettings();
+
+ void Load(const std::string& fname,
+- const std::string& cur_dir = std::string()) throw
(std::exception);
++ const std::string& cur_dir = std::string());
+ bool Save();
+
+ bool SaveAs(const std::string& fname,
+
+From aa1421ecbe35ce04b23f4c8b0d1af2592406e320 Mon Sep 17 00:00:00 2001
+From: Behnam Momeni <sbmomeni(a)gmail.com>
+Date: Thu, 1 Jun 2017 15:36:13 +0430
+Subject: [PATCH 8/8] Resolving operator ambiguity (required for g++ 7.1)
+
+---
+ src/mbase/project/media.cpp | 4 +++-
+ src/mbase/project/menu.cpp | 13 +++++++++----
+ src/mbase/project/serialization.h | 4 +++-
+ src/mbase/project/srl-common.cpp | 10 ++++++----
+ src/mdemux/dvdread.cpp | 14 +++++++++-----
+ src/mdemux/mpeg2demux.cpp | 8 ++++++--
+ src/mdemux/seek.cpp | 6 ++++--
+ src/mgui/author/render.cpp | 4 +++-
+ src/mgui/author/script.cpp | 20 +++++++++++++++-----
+ src/mgui/dvdimport.cpp | 9 +++++----
+ src/mgui/project/add.cpp | 8 ++++++--
+ src/mgui/sdk/cairo_utils.cpp | 4 +++-
+ src/mgui/timeline/layout.cpp | 6 ++++--
+ src/mgui/win_utils.cpp | 4 +++-
+ src/mlib/sdk/misc.cpp | 8 ++++++--
+ src/mlib/sdk/system.cpp | 4 +++-
+ 16 files changed, 88 insertions(+), 38 deletions(-)
+
+diff --git a/src/mbase/project/media.cpp b/src/mbase/project/media.cpp
+index 81e44d2..5f9e4f6 100644
+--- a/src/mbase/project/media.cpp
++++ b/src/mbase/project/media.cpp
+@@ -58,7 +58,9 @@ void StorageMD::MakeByPath(const std::string& path, bool
cnv_to_utf8,
+
+ std::string MakeAutoName(const std::string& str, int old_sz)
+ {
+- return (str::stream() << str << " " << old_sz+1).str();
++ str::stream ss;
++ ss << str << " " << old_sz+1;
++ return ss.str();
+ }
+
+ void VideoMD::AddChapter(ChapterItem chp)
+diff --git a/src/mbase/project/menu.cpp b/src/mbase/project/menu.cpp
+index 1f25817..94b8755 100644
+--- a/src/mbase/project/menu.cpp
++++ b/src/mbase/project/menu.cpp
+@@ -166,7 +166,9 @@ void MenuMD::SerializeImpl(Archieve& ar)
+ static std::string MakeObjectPath(int idx, const char* type)
+ {
+ ASSERT( idx != NO_HNDL );
+- return (str::stream() << type << "." << idx).str();
++ str::stream ss;
++ ss << type << "." << idx;
++ return ss.str();
+ }
+
+ std::string GetMediaRef(MediaItem mi)
+@@ -197,7 +199,9 @@ class RefMaker: public ObjVisitor
+ void RefMaker::Visit(VideoChapterMD& obj)
+ {
+ refStr = GetMediaRef(obj.owner);
+- refStr += (str::stream() << "." <<
ChapterPosInt(&obj)).str();
++ str::stream ss;
++ ss << "." << ChapterPosInt(&obj);
++ refStr += ss.str();
+ }
+
+ std::string Media2Ref(MediaItem mi)
+@@ -233,8 +237,9 @@ int GetRefIndex(const char*& str)
+
+ std::string ThrowBadIndex(const char* prefix, int idx)
+ {
+- throw std::runtime_error(
+- (str::stream() << prefix << idx).str() );
++ str::stream ss;
++ ss << prefix << idx;
++ throw std::runtime_error(ss.str());
+ }
+
+ MediaItem TryGetMedia(int idx)
+diff --git a/src/mbase/project/serialization.h b/src/mbase/project/serialization.h
+index ff5b7a9..547c438 100644
+--- a/src/mbase/project/serialization.h
++++ b/src/mbase/project/serialization.h
+@@ -75,7 +75,9 @@ namespace ToString
+ template<typename T>
+ std::string MakeString(const T& t)
+ {
+- return (str::stream() << t).str();
++ str::stream ss;
++ ss << t;
++ return ss.str();
+ }
+
+ template<typename T>
+diff --git a/src/mbase/project/srl-common.cpp b/src/mbase/project/srl-common.cpp
+index c2c92b5..ab1c62b 100644
+--- a/src/mbase/project/srl-common.cpp
++++ b/src/mbase/project/srl-common.cpp
+@@ -36,10 +36,12 @@ void Serialize(Archieve& ar, MenuParams& mp)
+ std::string ToString(const RGBA::Pixel& pxl)
+ {
+ using Mpeg::set_hms;
+- return (str::stream("#") << std::hex
+- << set_hms() << (int)pxl.red
+- << set_hms() << (int)pxl.green
+- << set_hms() << (int)pxl.blue << (int)pxl.alpha).str();
++ str::stream ss ("#");
++ ss << std::hex
++ << set_hms() << (int)pxl.red
++ << set_hms() << (int)pxl.green
++ << set_hms() << (int)pxl.blue << (int)pxl.alpha;
++ return ss.str();
+ }
+
+ // как pango_color_parse()
+diff --git a/src/mdemux/dvdread.cpp b/src/mdemux/dvdread.cpp
+index d8392b1..12fcae6 100644
+--- a/src/mdemux/dvdread.cpp
++++ b/src/mdemux/dvdread.cpp
+@@ -35,8 +35,10 @@ namespace DVD {
+ std::string VobFName(VobPos& pos, const std::string& suffix)
+ {
+ using Mpeg::set_hms;
+- return (str::stream("Video") << set_hms() << int(pos.Vts())
+- << "-" << set_hms() << pos.VobId() <<
suffix << ".vob").str();
++ str::stream ss ("Video");
++ ss << set_hms() << int(pos.Vts())
++ << "-" << set_hms() << pos.VobId() << suffix
<< ".vob";
++ return ss.str();
+ }
+
+ typedef boost::function<void(int, double)> VobTimeFnr;
+@@ -282,9 +284,11 @@ VobPtr FindVob(VobArr& dvd_vobs, uint8_t vts, uint16_t vob_id)
+ static void TryDVDReadBlocks(dvd_file_t* file, int off, size_t cnt, char* buf)
+ {
+ int real_cnt = DVDReadBlocks(file, off, cnt, (unsigned char*)buf);
+- if( (int)cnt != real_cnt )
+- throw std::runtime_error( (str::stream() << real_cnt <<
+- " != DVDReadBlocks(" << cnt <<
")").str() );
++ if( (int)cnt != real_cnt ) {
++ str::stream ss;
++ ss << real_cnt << " != DVDReadBlocks(" << cnt
<< ")";
++ throw std::runtime_error( ss.str() );
++ }
+ }
+
+ // размер буфера должен соответствовать читаемому диапазону
+diff --git a/src/mdemux/mpeg2demux.cpp b/src/mdemux/mpeg2demux.cpp
+index bb7b1b1..ecb3774 100644
+--- a/src/mdemux/mpeg2demux.cpp
++++ b/src/mdemux/mpeg2demux.cpp
+@@ -71,7 +71,9 @@ bool DemuxSvc::Filter(uint32_t code)
+
+ static std::string MakePESKey(int id, const char* ext)
+ {
+- return (str::stream() << id << "." << ext).str();
++ str::stream ss;
++ ss << id << "." << ext;
++ return ss.str();
+ }
+
+ static bool ReadPart(io::stream& strm, uint8_t* buf, int sz, int& len)
+@@ -110,7 +112,9 @@ static std::string MakeKeyNameForLPCM(int track, uint8_t inf)
+ ASSERT(0);
+ }
+
+- std::string header_str = (str::stream() << sample_rate << ":"
<< channels << ":" << bps << ".lpcm").str();
++ str::stream ss;
++ ss << sample_rate << ":" << channels <<
":" << bps << ".lpcm";
++ std::string header_str = ss.str();
+ return MakePESKey(track, header_str.c_str());
+ }
+
+diff --git a/src/mdemux/seek.cpp b/src/mdemux/seek.cpp
+index e46658f..f0ce934 100644
+--- a/src/mdemux/seek.cpp
++++ b/src/mdemux/seek.cpp
+@@ -37,8 +37,10 @@ std::string SecToHMS(double len, bool round_sec)
+ int hh = min / 60;
+ int mm = min - hh*60;
+
+- return (str::stream() << set_hms() << hh << ":"
+- << set_hms() << mm << ":" <<
set_hms() << ss).str();
++ str::stream strss;
++ strss << set_hms() << hh << ":"
++ << set_hms() << mm << ":" << set_hms() <<
ss;
++ return strss.str();
+ }
+
+ bool MediaInfo::InitBegin(VideoLine& vl)
+diff --git a/src/mgui/author/render.cpp b/src/mgui/author/render.cpp
+index 93557b2..81720d7 100644
+--- a/src/mgui/author/render.cpp
++++ b/src/mgui/author/render.cpp
+@@ -1307,7 +1307,9 @@ FFmpegVersion CheckFFDVDEncoding()
+
+ bool RenderMainPicture(const std::string& out_dir, Menu mn, int i)
+ {
+- Author::Info((str::stream() << "Rendering menu \"" <<
mn->mdName << "\" ...").str());
++ str::stream ss;
++ ss << "Rendering menu \"" << mn->mdName <<
"\" ...";
++ Author::Info(ss.str());
+ const std::string mn_dir = MakeMenuPath(out_dir, mn, i);
+
+ if( IsMotion(mn) )
+diff --git a/src/mgui/author/script.cpp b/src/mgui/author/script.cpp
+index 6b1db57..f2b1c7e 100644
+--- a/src/mgui/author/script.cpp
++++ b/src/mgui/author/script.cpp
+@@ -130,7 +130,9 @@ static std::string MakeFPTarget(MediaItem mi)
+ {
+ VideoItem vi = IsVideo(mi);
+ ASSERT( vi );
+- str = (str::stream() << "title " <<
GetAuthorNumber(vi)).str();
++ str::stream ss;
++ ss << "title " << GetAuthorNumber(vi);
++ str = ss.str();
+ }
+ return str;
+ }
+@@ -179,7 +181,9 @@ void TargetCommandVis::Visit(VideoChapterMD& obj)
+ // Потому: для удоства пользователей даем создавать нулевую главу, разрешая это
здесь
+ // (однако доп. нулевые главы будут приводить к ошибке Cannot jump to chapter N ...
only M exist)
+ int c_num = ChapterPosInt(&obj) + (owner->List()[0]->chpTime ? 2 : 1) ;
+- res = (str::stream() << "jump title " << v_num << "
chapter " << c_num << ";").str();
++ str::stream ss;
++ ss << "jump title " << v_num << " chapter "
<< c_num << ";";
++ res = ss.str();
+ }
+
+ static std::string MakeButtonJump(MediaItem mi, bool vts_domain)
+@@ -204,7 +208,9 @@ std::string MenuAuthorDir(Menu mn, int idx, bool cnv_from_utf8)
+ if( !fs::native(name) )
+ name = "Menu";
+
+- std::string fname = (str::stream() << idx+1 << "." <<
name).str();
++ str::stream ss;
++ ss << idx+1 << "." << name;
++ std::string fname = ss.str();
+ return cnv_from_utf8 ? ConvertPathFromUtf8(fname) : fname ;
+ }
+
+@@ -626,7 +632,9 @@ static void CopyRootFile(const std::string& fname, const
std::string& out_dir)
+ void AuthorSectionInfo(const std::string& str)
+ {
+ Author::Info("\n#", false);
+- Author::Info((str::stream() << "# " << str).str(), false);
++ str::stream ss;
++ ss << "# " << str;
++ Author::Info(ss.str(), false);
+ Author::Info("#\n", false);
+ }
+
+@@ -1082,7 +1090,9 @@ static void TranscodeVideos(int pass, const std::string&
out_dir)
+
+ static void AuthorImpl(const std::string& out_dir)
+ {
+- AuthorSectionInfo((str::stream() << "Build DVD-Video in folder: "
<< out_dir).str());
++ str::stream ss;
++ ss << "Build DVD-Video in folder: " << out_dir;
++ AuthorSectionInfo(ss.str());
+ IteratePendingEvents();
+
+ IndexVideosForAuthoring();
+diff --git a/src/mgui/dvdimport.cpp b/src/mgui/dvdimport.cpp
+index 47f334b..fc9b965 100644
+--- a/src/mgui/dvdimport.cpp
++++ b/src/mgui/dvdimport.cpp
+@@ -211,10 +211,11 @@ static void OnPreparePage(ImportData& id)
+ row[VF().selState] = false;
+ row[VF().name] = VobFName(vob.pos);
+ row[VF().thumbnail] = vob.aspect == af4_3 ? pix4_3 : pix16_9;
+- std::string desc = (str::stream(Mpeg::SecToHMS(vob.tmLen, true))
<< ", "
+- << vob.sz.x << "x" <<
vob.sz.y << ", "
+- << (vob.aspect == af4_3 ? "4:3" :
"16:9") << ", "
+- << std::fixed << std::setprecision(2)
<< vob.Count()/512. << " " << _("MB")).str();
++ str::stream ss (Mpeg::SecToHMS(vob.tmLen, true));
++ ss << ", " << vob.sz.x << "x"
<< vob.sz.y << ", "
++ << (vob.aspect == af4_3 ? "4:3" : "16:9")
<< ", "
++ << std::fixed << std::setprecision(2) <<
vob.Count()/512. << " " << _("MB");
++ std::string desc = ss.str();
+ row[VF().desc] = desc;
+ }
+ CompleteSelection(id, false);
+diff --git a/src/mgui/project/add.cpp b/src/mgui/project/add.cpp
+index ce7a705..e8ae94f 100644
+--- a/src/mgui/project/add.cpp
++++ b/src/mgui/project/add.cpp
+@@ -86,7 +86,9 @@ static void SetImportError(ErrorDesc& ed, bool is_good, const
std::string& out_s
+
+ static std::string FpsToStr(const Point& frate)
+ {
+- return (str::stream() << (double)frate.x/frate.y).str();
++ str::stream ss;
++ ss << (double)frate.x/frate.y;
++ return ss.str();
+ }
+
+ static std::string TVTypeStr(bool is_ntsc)
+@@ -163,7 +165,9 @@ void CheckVideoFormat(ErrorDesc& ed, const
Mpeg::SequenceData& vid, bool is_ntsc
+ // *
+ bool is_aspect_ok = vid.sarCode == af4_3 || vid.sarCode == af16_9;
+ Point aspect = vid.SizeAspect();
+- std::string aspect_str = (str::stream() << aspect.x << ':'
<< aspect.y).str();
++ str::stream ss;
++ ss << aspect.x << ':' << aspect.y;
++ std::string aspect_str = ss.str();
+ SetImportError(ed, is_aspect_ok,
+ std::string(_("Aspect ratio")) + ": \t" +
MarkError(aspect_str, is_aspect_ok),
+ BF_(Descriptions[2]) % tv_type % bf::stop);
+diff --git a/src/mgui/sdk/cairo_utils.cpp b/src/mgui/sdk/cairo_utils.cpp
+index 14f11be..10c1f97 100644
+--- a/src/mgui/sdk/cairo_utils.cpp
++++ b/src/mgui/sdk/cairo_utils.cpp
+@@ -27,6 +27,8 @@
+ std::string MakeSVGFilename(const char* prefix)
+ {
+ static int idx = 1;
+- return (str::stream() << prefix << "-" <<
Mpeg::set_hms() << idx++ << ".svg" ).str();
++ str::stream ss;
++ ss << prefix << "-" << Mpeg::set_hms() << idx++
<< ".svg";
++ return ss.str();
+ }
+
+diff --git a/src/mgui/timeline/layout.cpp b/src/mgui/timeline/layout.cpp
+index c139626..b5b5ca7 100644
+--- a/src/mgui/timeline/layout.cpp
++++ b/src/mgui/timeline/layout.cpp
+@@ -600,8 +600,10 @@ time4_t FramesToTime(int cnt, double fps)
+ void FramesToTime(std::string& str, int cnt, double fps)
+ {
+ time4_t t4 = FramesToTime(cnt, fps);
+- str = (str::stream() << Mpeg::set_hms() << t4.hh << ":"
<< Mpeg::set_hms() << t4.mm << ":"
+- << Mpeg::set_hms() << t4.ss << ";"
<< Mpeg::set_hms() << t4.ff).str();
++ str::stream ss;
++ ss << Mpeg::set_hms() << t4.hh << ":" <<
Mpeg::set_hms() << t4.mm << ":"
++ << Mpeg::set_hms() << t4.ss << ";" <<
Mpeg::set_hms() << t4.ff;
++ str = ss.str();
+ }
+
+ } // namespace TimeLine
+diff --git a/src/mgui/win_utils.cpp b/src/mgui/win_utils.cpp
+index e135f1a..beafca8 100644
+--- a/src/mgui/win_utils.cpp
++++ b/src/mgui/win_utils.cpp
+@@ -132,7 +132,9 @@ void Scale(RefPtr<Context> cr, RefPtr<ImageSurface> src,
+
+ std::string ColorToString(const unsigned int rgba)
+ {
+- return (str::stream() << std::hex << (rgba >> 8)).str();
++ str::stream ss;
++ ss << std::hex << (rgba >> 8);
++ return ss.str();
+ }
+
+ CR::Color GetBGColor(Gtk::Widget& wdg)
+diff --git a/src/mlib/sdk/misc.cpp b/src/mlib/sdk/misc.cpp
+index 5d3f297..803187b 100644
+--- a/src/mlib/sdk/misc.cpp
++++ b/src/mlib/sdk/misc.cpp
+@@ -173,12 +173,16 @@ std::string PointToStr(const Point& pnt)
+ std::string Double2Str(double val)
+ {
+ //return boost::format("%1%") % val % bf::stop;
+- return (str::stream() << val).str();
++ str::stream ss;
++ ss << val;
++ return ss.str();
+ }
+
+ std::string Int2Str(int val)
+ {
+- return (str::stream() << val).str();
++ str::stream ss;
++ ss << val;
++ return ss.str();
+ }
+
+ static bool ICaseMatch(const std::string& str, const std::string& pat_str)
+diff --git a/src/mlib/sdk/system.cpp b/src/mlib/sdk/system.cpp
+index 8d10e3f..e9508bd 100644
+--- a/src/mlib/sdk/system.cpp
++++ b/src/mlib/sdk/system.cpp
+@@ -28,7 +28,9 @@
+ int GetMemSize()
+ {
+ pid_t pid = getpid();
+- std::string str = (str::stream() << "/proc/" << pid <<
"/statm").str();
++ str::stream ss;
++ ss << "/proc/" << pid << "/statm";
++ std::string str = ss.str();
+
+ io::stream strm(str.c_str(), iof::in);
+ int mem;
diff --git a/bombono-dvd.spec b/bombono-dvd.spec
index 09cf68d..f030374 100644
--- a/bombono-dvd.spec
+++ b/bombono-dvd.spec
@@ -1,20 +1,13 @@
-#global rel_tag .20120615gitcdab110
-
Name: bombono-dvd
Version: 1.2.4
-Release: 3%{?rel_tag}%{?dist}
+Release: 5%{?dist}
Summary: DVD authoring program with nice and clean GUI
# License breakdown in README.
License: GPLv2 and GPLv2+ and Boost and Python and LGPLv2+
-Group: Applications/Productivity
-Url:
http://www.bombono.org
-# To create source tarball:
-# git clone
https://git.gitorious.org/bombono-dvd/bombono-dvd.git bombono-dvd
-# tag=.20120616gitcdab110; cd bombono-dvd; git reset --hard ${tag##*git}; cd ..
-# tar czf bombono-dvd-1.2.0$tag.tar.gz --exclude .git bombono-dvd
-#Source: bombono-dvd-%%{version}%%{?rel_tag}.tar.gz
-Source:
https://github.com/muravjov/bombono-dvd/archive/%{version}.tar.gz#/%{name...
+URL:
https://github.com/muravjov/bombono-dvd
+Source0: %{url}/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz
Patch0: filesys-include-path.patch
+Patch1: %{url}/pull/15.patch#/%{version}-ftbfs-fix-gcc-7-boost-1.64.patch
# needs to match TBB - from adobe-source-libraries
ExclusiveArch: i686 x86_64 ia64
@@ -44,7 +37,7 @@ Provides: bundled(boost-logging) = 0.22.7.20120126svn76686
%global boost_flags \\\
-DBOOST_SYSTEM_NO_DEPRECATED -DBOOST_FILESYSTEM_VERSION=3
%global warn_flags \
- -Wno-reorder -Wno-unused-variable
+ -Wno-unused-variable
%global scons \
scons %{?_smp_mflags} \\\
BUILD_CFG=debug \\\
@@ -69,10 +62,11 @@ to folder, making an ISO-image or burning directly to DVD as well as
re-authoring by importing video from DVD discs is also supported.
%prep
-%setup -q
-%patch0 -p1
+%autosetup -p1
-sed -i '\;#![ ]*/usr/bin/env;d' $(find . -name SCons\*)
+sed -i -e 's@#!/usr/bin/env python@#!/usr/bin/python2@g' $(find . -name SCons\*)
\
+ resources/scons_authoring/menu_SConscript \
+ resources/scons_authoring/ADVD.py
rm -r debian libs/boost-lib src/mlib/tests libs/mpeg2dec ./libs/asl/adobe
%build
@@ -82,19 +76,19 @@ rm -r debian libs/boost-lib src/mlib/tests libs/mpeg2dec
./libs/asl/adobe
rm config.opts
%scons DESTDIR=%{buildroot} install
rm -rf docs/man docs/TechTasks docs/Atom.planner
-%find_lang %{name}
+
desktop-file-validate \
%{buildroot}%{_datadir}/applications/bombono-dvd.desktop
+%find_lang %{name}
+
%postun
-/usr/bin/update-desktop-database &> /dev/null || :
if [ $1 -eq 0 ] ; then
/bin/touch --no-create %{_datadir}/icons/hicolor &> /dev/null
/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &> /dev/null || :
fi
%post
-/usr/bin/update-desktop-database &> /dev/null || :
/bin/touch --no-create %{_datadir}/icons/hicolor &> /dev/null || :
%posttrans
@@ -112,6 +106,14 @@ fi
%{_mandir}/man1/*
%changelog
+* Sat Jul 08 2017 Leigh Scott <leigh123linux(a)googlemail.com> - 1.2.4-5
+- Clean up spec file and fix rpmlint errors
+- Change url to github
+- Pull patch from last commit directly
+
+* Sat Jul 8 2017 Link Dupont <link.dupont(a)gmail.com> - 1.2.4-4
+- patch for boost, g++ and ffmpeg changes
+
* Sat Mar 18 2017 RPM Fusion Release Engineering <kwizart(a)rpmfusion.org> - 1.2.4-3
- Rebuilt for
https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild