From d9549d41b30b29b23a8aac29008eca2dd382a509 Mon Sep 17 00:00:00 2001 From: Nicolas Porcel Date: Wed, 17 Mar 2021 01:09:40 +0000 Subject: [PATCH] New package: FreeFileSync-11.8 --- .../FreeFileSync/files/FreeFileSync.desktop | 11 ++ .../FreeFileSync/files/RealTimeSync.desktop | 11 ++ .../patches/reversions_11-1.patch | 62 ++++++ .../patches/revert_bulk_append.patch | 51 +++++ .../patches/revert_linkflags.patch | 33 ++++ .../patches/revert_wxgtk_3.1.0.patch | 181 ++++++++++++++++++ srcpkgs/FreeFileSync/template | 42 ++++ 7 files changed, 391 insertions(+) create mode 100755 srcpkgs/FreeFileSync/files/FreeFileSync.desktop create mode 100644 srcpkgs/FreeFileSync/files/RealTimeSync.desktop create mode 100644 srcpkgs/FreeFileSync/patches/reversions_11-1.patch create mode 100644 srcpkgs/FreeFileSync/patches/revert_bulk_append.patch create mode 100644 srcpkgs/FreeFileSync/patches/revert_linkflags.patch create mode 100644 srcpkgs/FreeFileSync/patches/revert_wxgtk_3.1.0.patch create mode 100644 srcpkgs/FreeFileSync/template diff --git a/srcpkgs/FreeFileSync/files/FreeFileSync.desktop b/srcpkgs/FreeFileSync/files/FreeFileSync.desktop new file mode 100755 index 000000000000..b94e4799d123 --- /dev/null +++ b/srcpkgs/FreeFileSync/files/FreeFileSync.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=Application +Name=FreeFileSync +GenericName=Folder Comparison and Synchronization +GenericName[de_DE]=Ordnervergleich und Synchronisation +Exec=FreeFileSync %F +Icon=/usr/share/pixmaps/FreeFileSync.png +NoDisplay=false +Terminal=false +Categories=Utility;FileTools; +StartupNotify=true diff --git a/srcpkgs/FreeFileSync/files/RealTimeSync.desktop b/srcpkgs/FreeFileSync/files/RealTimeSync.desktop new file mode 100644 index 000000000000..dfd533ffd88a --- /dev/null +++ b/srcpkgs/FreeFileSync/files/RealTimeSync.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=Application +Name=RealTimeSync +GenericName=Automated Synchronization +GenericName[de_DE]=Automatisierte Synchronisation +Exec=RealTimeSync %f +Icon=/usr/share/pixmaps/RealTimeSync.png +NoDisplay=false +Terminal=false +Categories=Utility;FileTools; +StartupNotify=true diff --git a/srcpkgs/FreeFileSync/patches/reversions_11-1.patch b/srcpkgs/FreeFileSync/patches/reversions_11-1.patch new file mode 100644 index 000000000000..2d55eafe4748 --- /dev/null +++ b/srcpkgs/FreeFileSync/patches/reversions_11-1.patch @@ -0,0 +1,62 @@ +--- FreeFileSync/Source/ui/gui_status_handler.cpp ++++ FreeFileSync/Source/ui/gui_status_handler.cpp +@@ -43,8 +43,8 @@ StatusHandlerTemporaryPanel::StatusHandlerTemporaryPanel(MainDialog& dlg, + mainDlg_.Update(); //don't wait until idle event! + + //register keys +- mainDlg_. Bind(wxEVT_CHAR_HOOK, &StatusHandlerTemporaryPanel::onLocalKeyEvent, this); +- mainDlg_.m_buttonCancel->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &StatusHandlerTemporaryPanel::onAbortCompare, this); ++ mainDlg_.Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(StatusHandlerTemporaryPanel::OnKeyPressed), nullptr, this); ++ mainDlg_.m_buttonCancel->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusHandlerTemporaryPanel::OnAbortCompare), nullptr, this); + } + + +@@ -128,9 +128,8 @@ StatusHandlerTemporaryPanel::~StatusHandlerTemporaryPanel() + mainDlg_.auiMgr_.Update(); + + //unregister keys +- [[maybe_unused]] bool ubOk1 = mainDlg_. Unbind(wxEVT_CHAR_HOOK, &StatusHandlerTemporaryPanel::onLocalKeyEvent, this); +- [[maybe_unused]] bool ubOk2 = mainDlg_.m_buttonCancel->Unbind(wxEVT_COMMAND_BUTTON_CLICKED, &StatusHandlerTemporaryPanel::onAbortCompare, this); +- assert(ubOk1 && ubOk2); ++ mainDlg_.Disconnect(wxEVT_CHAR_HOOK, wxKeyEventHandler(StatusHandlerTemporaryPanel::OnKeyPressed), nullptr, this); ++ mainDlg_.m_buttonCancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusHandlerTemporaryPanel::OnAbortCompare), nullptr, this); + + mainDlg_.compareStatus_->teardown(); + +@@ -314,20 +313,20 @@ void StatusHandlerTemporaryPanel::forceUiUpdateNoThrow() + } + + +-void StatusHandlerTemporaryPanel::onLocalKeyEvent(wxKeyEvent& event) ++void StatusHandlerTemporaryPanel::OnKeyPressed(wxKeyEvent& event) + { + const int keyCode = event.GetKeyCode(); + if (keyCode == WXK_ESCAPE) + { + wxCommandEvent dummy; +- onAbortCompare(dummy); ++ OnAbortCompare(dummy); + } + + event.Skip(); + } + + +-void StatusHandlerTemporaryPanel::onAbortCompare(wxCommandEvent& event) ++void StatusHandlerTemporaryPanel::OnAbortCompare(wxCommandEvent& event) + { + userRequestAbort(); + } +--- FreeFileSync/Source/ui/gui_status_handler.h ++++ FreeFileSync/Source/ui/gui_status_handler.h +@@ -41,8 +41,8 @@ public: + Result reportResults(); //noexcept!! + + private: +- void onLocalKeyEvent(wxKeyEvent& event); +- void onAbortCompare(wxCommandEvent& event); //handle abort button click ++ void OnKeyPressed(wxKeyEvent& event); ++ void OnAbortCompare(wxCommandEvent& event); //handle abort button click + void showStatsPanel(); + + MainDialog& mainDlg_; diff --git a/srcpkgs/FreeFileSync/patches/revert_bulk_append.patch b/srcpkgs/FreeFileSync/patches/revert_bulk_append.patch new file mode 100644 index 000000000000..bf9e9288afe9 --- /dev/null +++ b/srcpkgs/FreeFileSync/patches/revert_bulk_append.patch @@ -0,0 +1,51 @@ +--- FreeFileSync/Source/ui/command_box.cpp 2020-06-18 19:16:52.000000000 +0200 ++++ FreeFileSync/Source/ui/command_box.cpp 2020-06-21 10:45:23.265579023 +0200 +@@ -120,7 +120,8 @@ + + //this->Clear(); -> NO! emits yet another wxEVT_COMMAND_TEXT_UPDATED!!! + wxItemContainer::Clear(); //suffices to clear the selection items only! +- this->Append(items); //expensive as fuck! => only call when absolutely needed! ++ for (const wxString& item : items) ++ this->Append(item); + + //this->SetSelection(wxNOT_FOUND); //don't select anything + ChangeValue(value); //preserve main text! +--- FreeFileSync/Source/ui/folder_history_box.cpp 2020-06-18 19:16:52.000000000 +0200 ++++ FreeFileSync/Source/ui/folder_history_box.cpp 2020-06-21 10:45:23.265579023 +0200 +@@ -90,7 +90,8 @@ + + //this->Clear(); -> NO! emits yet another wxEVT_COMMAND_TEXT_UPDATED!!! + wxItemContainer::Clear(); //suffices to clear the selection items only! +- this->Append(items); //expensive as fuck! => only call when absolutely needed! ++ for (const wxString& item : items) ++ this->Append(item); + + //this->SetSelection(wxNOT_FOUND); //don't select anything + ChangeValue(folderPathPhrase); //preserve main text! +--- FreeFileSync/Source/ui/small_dlgs.cpp 2020-06-18 19:16:52.000000000 +0200 ++++ FreeFileSync/Source/ui/small_dlgs.cpp 2020-06-21 11:35:53.494412284 +0200 +@@ -293,7 +293,9 @@ + { + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); + } +- m_listBoxGdriveUsers->Append(gdriveAccounts); ++ for (auto const& account: gdriveAccounts) { ++ m_listBoxGdriveUsers->Append(account); ++ } + + //set default values for Google Drive: use first item of m_listBoxGdriveUsers + if (!gdriveAccounts.empty() && !acceptsItemPathPhraseGdrive(folderPathPhrase)) +--- wx+/choice_enum.h 2020-06-18 19:16:51.000000000 +0200 ++++ wx+/choice_enum.h 2020-06-21 10:45:23.268912329 +0200 +@@ -79,7 +79,10 @@ + + if (items != itemsSetLast) + { +- ctrl.Set(items); //expensive as fuck! => only call when absolutely needed! ++ ctrl.Clear(); ++ for (auto item : items) { ++ ctrl.Append(item); ++ } + itemsSetLast = std::move(items); + } + //----------------------------------------------------------------- diff --git a/srcpkgs/FreeFileSync/patches/revert_linkflags.patch b/srcpkgs/FreeFileSync/patches/revert_linkflags.patch new file mode 100644 index 000000000000..7e59d423f4a3 --- /dev/null +++ b/srcpkgs/FreeFileSync/patches/revert_linkflags.patch @@ -0,0 +1,33 @@ +--- FreeFileSync/Source/Makefile ++++ FreeFileSync/Source/Makefile +@@ -4,7 +4,7 @@ + -Wall -Wfatal-errors -Wmissing-include-dirs -Wswitch-enum -Wcast-align -Wshadow -Wnon-virtual-dtor \ + -O3 -DNDEBUG `wx-config --cxxflags --debug=no` -pthread + +-linkFlags = -s -no-pie `wx-config --libs std, aui, richtext --debug=no` -pthread ++linkFlags = -s -no-pie `wx-config --libs std, aui, richtext --debug=no` -lz -pthread + + + cxxFlags += `pkg-config --cflags openssl` +@@ -17,6 +17,7 @@ + linkFlags += `pkg-config --libs libssh2` + + cxxFlags += `pkg-config --cflags gtk+-2.0` ++linkFlags += `pkg-config --libs gtk+-2.0` + #treat as system headers so that warnings are hidden: + cxxFlags += -isystem/usr/include/gtk-2.0 + +--- FreeFileSync/Source/RealTimeSync/Makefile ++++ FreeFileSync/Source/RealTimeSync/Makefile +@@ -4,10 +4,11 @@ + -Wall -Wfatal-errors -Wmissing-include-dirs -Wswitch-enum -Wcast-align -Wshadow -Wnon-virtual-dtor \ + -O3 -DNDEBUG `wx-config --cxxflags --debug=no` -pthread + +-linkFlags = -s -no-pie `wx-config --libs std, aui, richtext --debug=no` -pthread ++linkFlags = -s -no-pie `wx-config --libs std, aui, richtext --debug=no` -lz -pthread + + #Gtk - support "no button border" + cxxFlags += `pkg-config --cflags gtk+-2.0` ++linkFlags += `pkg-config --libs gtk+-2.0` + #treat as system headers so that warnings are hidden: + cxxFlags += -isystem/usr/include/gtk-2.0 diff --git a/srcpkgs/FreeFileSync/patches/revert_wxgtk_3.1.0.patch b/srcpkgs/FreeFileSync/patches/revert_wxgtk_3.1.0.patch new file mode 100644 index 000000000000..6e13fbd55a77 --- /dev/null +++ b/srcpkgs/FreeFileSync/patches/revert_wxgtk_3.1.0.patch @@ -0,0 +1,181 @@ +--- FreeFileSync/Source/RealTimeSync/folder_selector2.cpp 2021-03-03 20:06:02.000000000 +0000 ++++ FreeFileSync/Source/RealTimeSync/folder_selector2.cpp 2021-03-17 00:43:34.001731441 +0000 +@@ -158,7 +158,7 @@ + } + + Zstring newFolderPath; +- wxDirDialog folderSelector(parent_, _("Select a folder"), utfTo(defaultFolderPath), wxDD_DEFAULT_STYLE | wxDD_SHOW_HIDDEN); ++ wxDirDialog folderSelector(parent_, _("Select a folder"), utfTo(defaultFolderPath)); + if (folderSelector.ShowModal() != wxID_OK) + return; + newFolderPath = utfTo(folderSelector.GetPath()); +--- FreeFileSync/Source/afs/sftp.cpp 2021-03-03 20:06:01.000000000 +0000 ++++ FreeFileSync/Source/afs/sftp.cpp 2021-03-17 00:43:34.003731440 +0000 +@@ -67,9 +67,9 @@ + + //attention: if operation fails due to time out, e.g. file copy, the cleanup code may hang, too => total delay = 2 x time out interval + +-const size_t SFTP_OPTIMAL_BLOCK_SIZE_READ = 8 * MAX_SFTP_READ_SIZE; //https://github.com/libssh2/libssh2/issues/90 +-const size_t SFTP_OPTIMAL_BLOCK_SIZE_WRITE = 8 * MAX_SFTP_OUTGOING_SIZE; // +-static_assert(MAX_SFTP_READ_SIZE == 30000 && MAX_SFTP_OUTGOING_SIZE == 30000, "reevaluate optimal block sizes if these constants change!"); ++const size_t SFTP_OPTIMAL_BLOCK_SIZE_READ = 8 * 30000; //https://github.com/libssh2/libssh2/issues/90 ++const size_t SFTP_OPTIMAL_BLOCK_SIZE_WRITE = 8 * 30000; // ++static_assert(30000 == 30000 && 30000 == 30000, "reevaluate optimal block sizes if these constants change!"); + + /* Perf Test, Sourceforge frs, SFTP upload, compressed 25 MB test file: + +--- FreeFileSync/Source/ui/command_box.h 2021-03-03 20:06:00.000000000 +0000 ++++ FreeFileSync/Source/ui/command_box.h 2021-03-17 00:43:34.005731439 +0000 +@@ -30,7 +30,7 @@ + const wxString choices[] = nullptr, + long style = 0, + const wxValidator& validator = wxDefaultValidator, +- const wxString& name = wxASCII_STR(wxComboBoxNameStr)); ++ const wxString& name = wxString::FromAscii(wxComboBoxNameStr)); + + void setHistory(const std::vector& history, size_t historyMax) { history_ = history; historyMax_ = historyMax; } + std::vector getHistory() const { return history_; } +--- FreeFileSync/Source/ui/folder_history_box.h 2021-03-03 20:06:00.000000000 +0000 ++++ FreeFileSync/Source/ui/folder_history_box.h 2021-03-17 00:43:34.005731439 +0000 +@@ -68,7 +68,7 @@ + const wxString choices[] = nullptr, + long style = 0, + const wxValidator& validator = wxDefaultValidator, +- const wxString& name = wxASCII_STR(wxComboBoxNameStr)); ++ const wxString& name = wxString::FromAscii(wxComboBoxNameStr)); + + void setHistory(std::shared_ptr sharedHistory) { sharedHistory_ = std::move(sharedHistory); } + std::shared_ptr getHistory() { return sharedHistory_; } +--- FreeFileSync/Source/ui/folder_selector.cpp 2021-03-03 20:06:01.000000000 +0000 ++++ FreeFileSync/Source/ui/folder_selector.cpp 2021-03-17 00:43:34.005731439 +0000 +@@ -236,7 +236,7 @@ + + Zstring shellItemPath; + //default size? Windows: not implemented, Linux(GTK2): not implemented, macOS: not implemented => wxWidgets, what is this shit!? +- wxDirDialog folderSelector(parent_, _("Select a folder"), utfTo(defaultFolderNative), wxDD_DEFAULT_STYLE | wxDD_SHOW_HIDDEN); ++ wxDirDialog folderSelector(parent_, _("Select a folder"), utfTo(defaultFolderNative)); + //GTK2: "Show hidden" is also available as a context menu option in the folder picker! + //It looks like wxDD_SHOW_HIDDEN only sets the default when opening for the first time!? + if (folderSelector.ShowModal() != wxID_OK) +--- FreeFileSync/Source/ui/small_dlgs.cpp 2021-03-17 00:53:28.014536756 +0000 ++++ FreeFileSync/Source/ui/small_dlgs.cpp 2021-03-17 00:46:53.668666002 +0000 +@@ -1682,7 +1682,6 @@ + //setMainInstructionFont(*m_staticTextMain); + + m_bitmapActivation->SetBitmap(loadImage("internet")); +- m_textCtrlOfflineActivationKey->ForceUpper(); + + setTextWithUrls(*m_richTextLastError, lastErrorMsg); + setTextWithUrls(*m_richTextManualActivationUrl, manualActivationUrl); +--- wx+/bitmap_button.h 2021-03-03 20:06:00.000000000 +0000 ++++ wx+/bitmap_button.h 2021-03-17 00:43:34.008731438 +0000 +@@ -26,7 +26,7 @@ + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, +- const wxString& name = wxASCII_STR(wxButtonNameStr)) : ++ const wxString& name = wxString::FromAscii(wxButtonNameStr)) : + wxBitmapButton(parent, id, wxNullBitmap, pos, size, style, validator, name) + { + SetLabel(label); +--- wx+/choice_enum.h 2021-03-17 00:53:28.014536756 +0000 ++++ wx+/choice_enum.h 2021-03-17 00:43:34.007731439 +0000 +@@ -81,7 +81,7 @@ + { + ctrl.Clear(); + for (auto item : items) { +- ctrl.Append(item); ++ ctrl.Append(item); + } + itemsSetLast = std::move(items); + } +--- wx+/dc.h 2021-03-03 20:06:00.000000000 +0000 ++++ wx+/dc.h 2021-03-17 00:43:34.007731439 +0000 +@@ -68,13 +68,6 @@ + inline + int fastFromDIP(int d) //like wxWindow::FromDIP (but tied to primary monitor and buffered) + { +-#ifndef wxHAVE_DPI_INDEPENDENT_PIXELS +-#error why is wxHAVE_DPI_INDEPENDENT_PIXELS not defined? +-#endif +- //GTK2 doesn't properly support high DPI: https://freefilesync.org/forum/viewtopic.php?t=6114 +- //=> requires general fix at wxWidgets-level +- +- //https://github.com/wxWidgets/wxWidgets/blob/d9d05c2bb201078f5e762c42458ca2f74af5b322/include/wx/window.h#L2060 + return d; //e.g. macOS, GTK3 + } + int fastFromDIP(double d) = delete; +--- wx+/graph.h 2021-03-03 20:06:00.000000000 +0000 ++++ wx+/graph.h 2021-03-17 00:43:34.008731438 +0000 +@@ -192,7 +192,7 @@ + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL | wxNO_BORDER, +- const wxString& name = wxASCII_STR(wxPanelNameStr)); ++ const wxString& name = wxString::FromAscii(wxPanelNameStr)); + + class CurveAttributes + { +--- wx+/grid.cpp 2021-03-03 20:06:02.000000000 +0000 ++++ wx+/grid.cpp 2021-03-17 00:46:17.124677980 +0000 +@@ -263,7 +263,7 @@ + { + public: + SubWindow(Grid& parent) : +- wxWindow(&parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS | wxBORDER_NONE, wxASCII_STR(wxPanelNameStr)), ++ wxWindow(&parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS | wxBORDER_NONE, wxString::FromAscii(wxPanelNameStr)), + parent_(parent) + { + Bind(wxEVT_PAINT, [this](wxPaintEvent& event) { onPaintEvent(event); }); +@@ -1357,7 +1357,7 @@ + { + if (overlapPix != 0) + { +- const double scrollSpeed = wnd_.ToDIP(overlapPix) * mouseDragSpeedIncScrollU; //unit: [scroll units / sec] ++ const double scrollSpeed = 6; // wnd_.ToDIP(overlapPix) * mouseDragSpeedIncScrollU; //unit: [scroll units / sec] + toScroll += scrollSpeed * deltaSecs; + } + else +--- wx+/grid.h 2021-03-03 20:06:00.000000000 +0000 ++++ wx+/grid.h 2021-03-17 00:43:34.008731438 +0000 +@@ -150,7 +150,7 @@ + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL | wxNO_BORDER, +- const wxString& name = wxASCII_STR(wxPanelNameStr)); ++ const wxString& name = wxString::FromAscii(wxPanelNameStr)); + + size_t getRowCount() const; + +--- wx+/no_flicker.h 2021-03-03 20:06:00.000000000 +0000 ++++ wx+/no_flicker.h 2021-03-17 00:43:34.008731438 +0000 +@@ -69,9 +69,6 @@ + richCtrl.BeginSuppressUndo(); + ZEN_ON_SCOPE_EXIT(richCtrl.EndSuppressUndo()); + +- //fix mouse scroll speed: why the FUCK is this even necessary! +- richCtrl.SetLineHeight(richCtrl.GetCharHeight()); +- + //get rid of margins and space between text blocks/"paragraphs" + richCtrl.SetMargins({0, 0}); + richCtrl.BeginParagraphSpacing(0, 0); +--- wx+/toggle_button.h 2021-03-03 20:06:00.000000000 +0000 ++++ wx+/toggle_button.h 2021-03-17 00:43:34.008731438 +0000 +@@ -24,7 +24,7 @@ + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, +- const wxString& name = wxASCII_STR(wxButtonNameStr)) : ++ const wxString& name = wxString::FromAscii(wxButtonNameStr)) : + wxBitmapButton(parent, id, bitmap, pos, size, style, validator, name) {} + + //wxButton constructor +@@ -35,7 +35,7 @@ + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator, +- const wxString& name = wxASCII_STR(wxButtonNameStr)) : ++ const wxString& name = wxString::FromAscii(wxButtonNameStr)) : + wxBitmapButton(parent, id, wxNullBitmap, pos, size, style, validator, name) + { + SetLabel(label); diff --git a/srcpkgs/FreeFileSync/template b/srcpkgs/FreeFileSync/template new file mode 100644 index 000000000000..da1be246d6f9 --- /dev/null +++ b/srcpkgs/FreeFileSync/template @@ -0,0 +1,42 @@ +# Template file for 'FreeFileSync' +pkgname=FreeFileSync +version=11.8 +revision=1 +archs="i686 x86_64" +create_wrksrc=yes +build_style=gnu-makefile +make_cmd="make -C ${pkgname}/Source exeName=FreeFileSync" +hostmakedepends="unzip" +makedepends="pkg-config libglib-devel wxWidgets-devel libcurl-devel gtk+-devel openssl-devel" +depends="wxWidgets libcurl" +short_desc="Backup software to synchronize files and folders" +maintainer="Nicolas Porcel " +license="GPL-3.0-or-later" +homepage="https://freefilesync.org" +distfiles="${homepage}/download/FreeFileSync_${version}_Source.zip" +checksum=bf892a6eb9159fb746021d898c4a6b979b80cd12de90a95e75baec4124d83041 + +nopie_files="/opt/${pkgname}/Bin/FreeFileSync /opt/${pkgname}/Bin/RealTimeSync" + +do_build() { + make ${makejobs} exeName=FreeFileSync -C FreeFileSync/Source + make ${makejobs} exeName=RealTimeSync -C FreeFileSync/Source/RealTimeSync + unzip FreeFileSync/Build/Resources/Icons.zip FreeFileSync.png RealTimeSync.png -d FreeFileSync/Build +} + +do_install() { + vmkdir opt/${pkgname} + vcopy FreeFileSync/Build/Bin opt/${pkgname} + vcopy FreeFileSync/Build/Resources opt/${pkgname} + + vmkdir usr/share/pixmaps + vinstall FreeFileSync/Build/FreeFileSync.png 0644 usr/share/pixmaps + vinstall FreeFileSync/Build/RealTimeSync.png 0644 usr/share/pixmaps + + vmkdir usr/share/applications + vinstall ${FILESDIR}/FreeFileSync.desktop 0644 usr/share/applications + vinstall ${FILESDIR}/RealTimeSync.desktop 0644 usr/share/applications + + vmkdir usr/bin + ln -s /opt/FreeFileSync/Bin/{FreeFileSync,RealTimeSync} ${DESTDIR}/usr/bin +}