From d69e5458f99695e74d1c289c88c5a0d37571c005 Mon Sep 17 00:00:00 2001 From: David Faure Date: Sat, 9 Sep 2017 20:20:57 +0200 Subject: [PATCH] First steps towards a cmake buildsystem, currently only builds src/lib. USE_DATADIR no longer exists, QStandardPaths::standardLocations is used unless NO_SYSTEM_DATAPATH is set. --- CMakeLists.txt | 117 +++++++ src/CMakeLists.txt | 3 + .../qtsingleapplication/qtsingleapplication.h | 4 + src/lib/CMakeLists.txt | 319 ++++++++++++++++++ src/lib/app/datapaths.cpp | 23 +- src/lib/cookies/cookiejar.cpp | 2 +- .../schemehandlers/falkonschemehandler.cpp | 2 +- 7 files changed, 457 insertions(+), 13 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 src/CMakeLists.txt create mode 100644 src/lib/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..31dc8edc1 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,117 @@ +# CMake version required. This must be the very first line, because it sets default policies affecting everything else +cmake_minimum_required(VERSION 3.1) + +# Project name and version +project(Falkon VERSION 2.1.99) + +# Find ECM, with nice error handling in case of failure +include(FeatureSummary) +find_package(ECM 5.27.0 CONFIG) +set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://projects.kde.org/projects/frameworks/extra-cmake-modules") +feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) +set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +# Many includes from ECM, to get all the nice cmake functions and settings +include(KDEInstallDirs) +include(KDECMakeSettings) +include(KDECompilerSettings NO_POLICY_SCOPE) +include(ECMInstallIcons) +include(ECMSetupVersion) +include(ECMAddAppIcon) +include(ECMQtDeclareLoggingCategory) + +# Output dirs (like ECM 5.38 does) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + +# Version (TODO: move to a generated header once qmake support is dropped, to avoid full recompilations when changing this +add_definitions(-DFALKON_VERSION=\"${PROJECT_VERSION}\") + +# Defines that are always set +add_definitions(-DQT_NO_URL_CAST_FROM_STRING -DQT_USE_QSTRINGBUILDER) + +# Configurable options (TODO: move all defines to a generated header) +option(NO_SYSTEM_DATAPATH "TODO" OFF) +if (NO_SYSTEM_DATAPATH) + add_definitions(-DNO_SYSTEM_DATAPATH) +endif() +option(KDE_INTEGRATION "TODO" OFF) +if (KDE_INTEGRATION) + add_definitions(-DKDE_INTEGRATION) +endif() +option(GNOME_INTEGRATION "TODO" OFF) +if (GNOME_INTEGRATION) + add_definitions(-DGNOME_INTEGRATION) +endif() +option(NO_X11 "TODO" OFF) +if (NO_X11) + add_definitions(-DNO_X11) +endif() +option(PORTABLE_BUILD "TODO" OFF) +if (PORTABLE_BUILD) + add_definitions(-DPORTABLE_BUILD) +endif() +option(NONBLOCK_JS_DIALOGS "TODO" OFF) +if (NONBLOCK_JS_DIALOGS) + add_definitions(-DNONBLOCK_JS_DIALOGS) +endif() +option(USE_LIBPATH "TODO" "") # REMOVE? +if (USE_LIBPATH) + add_definitions(-DUSE_LIBPATH=\"${USE_LIBPATH}\") +endif() +option(DISABLE_DBUS "TODO" OFF) +if (DISABLE_DBUS) + add_definitions(-DDISABLE_DBUS) +endif() +option(DISABLE_UPDATES_CHECK "TODO" OFF) +if (DISABLE_UPDATES_CHECK) + add_definitions(-DDISABLE_UPDATES_CHECK) +endif() +# Note: the old qmake option DEBUG_BUILD is now -DCMAKE_BUILD_TYPE=Debug, and FALKON_PREFIX is now -DCMAKE_INSTALL_PREFIX +# SHARE_FOLDER is now auto-detected, so is USE_LIBPATH. + +# Mandatory: Qt5 +set(QT_MIN_VERSION "5.8.0") +find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS Core Widgets Network Sql QuickWidgets PrintSupport WebEngineWidgets WebChannel) +if (NOT DISABLE_DBUS) + find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS DBus) +endif() + +# Optional: KF5 +set(KF5_MIN_VERSION "5.27.0") +find_package(KF5 ${KF5_MIN_VERSION} COMPONENTS Wallet) + +if (UNIX AND NOT APPLE AND NOT NO_X11) + find_package(X11) + if (X11_FOUND) + add_definitions(-DQZ_WS_X11) + endif() + find_package(XCB COMPONENTS XCB) + find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS X11Extras) +endif() +if (WIN32) + add_definitions(-DW7API) + find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS WinExtras) + # TODO set var for LIBS += User32.lib Ole32.lib Shell32.lib ShlWapi.lib Gdi32.lib ComCtl32.lib ? +endif() + +# Git revision +if (EXISTS "${CMAKE_SOURCE_DIR}/.git") + find_package(Git QUIET) + if(GIT_FOUND) + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_REVISION + ) + string(REGEX REPLACE "\n" "" GIT_REVISION "${GIT_REVISION}") + add_definitions(-DGIT_REVISION=\"${GIT_REVISION}\") + else() + message(STATUS "Git revision could not be determined") + endif() +endif() + +# Finally, go into the src subdir +add_subdirectory(src) + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 000000000..ecfd93df6 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,3 @@ +add_subdirectory(lib) +# TODO add_subdirectory(main) +# TODO add_subdirectory(plugins) diff --git a/src/lib/3rdparty/qtsingleapplication/qtsingleapplication.h b/src/lib/3rdparty/qtsingleapplication/qtsingleapplication.h index e899d9d7c..035dac6df 100644 --- a/src/lib/3rdparty/qtsingleapplication/qtsingleapplication.h +++ b/src/lib/3rdparty/qtsingleapplication/qtsingleapplication.h @@ -44,6 +44,8 @@ ** ****************************************************************************/ +#ifndef QTSINGLEAPPLICATION_H +#define QTSINGLEAPPLICATION_H #include @@ -100,3 +102,5 @@ private: QtLocalPeer* peer; QWidget* actWin; }; + +#endif diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt new file mode 100644 index 000000000..0fe2b3a13 --- /dev/null +++ b/src/lib/CMakeLists.txt @@ -0,0 +1,319 @@ +add_definitions(-DFALKON_SHAREDLIBRARY) + +set(CMAKE_CXX_STANDARD 14) # Enable C++14, with cmake >= 3.1 +set(CMAKE_CXX_EXTENSIONS OFF) # Don't enable gcc-specific extensions + +if (WIN32) +add_definitions(-DQT_QTSINGLEAPPLICATION_EXPORT=) +endif() + +set(SRCS + 3rdparty/qtsingleapplication/qtsingleapplication.cpp + 3rdparty/qtsingleapplication/qtlocalpeer.cpp +) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qtsingleapplication) + +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(SRCS ${SRCS} ${CMAKE_SOURCE_DIR}/tests/modeltest/modeltest.cpp) + include_directories(${CMAKE_SOURCE_DIR}/tests/modeltest) +endif() + +include_directories( + 3rdparty + adblock + app + autofill + bookmarks + cookies + downloads + history + navigation + network + notifications + opensearch + other + plugins + popupwindow + preferences + session + sidebar + tabwidget + tools + webengine + webtab +) + +set(SRCS ${SRCS} + 3rdparty/fancytabwidget.cpp + 3rdparty/lineedit.cpp + 3rdparty/processinfo.cpp + 3rdparty/squeezelabelv1.cpp + 3rdparty/squeezelabelv2.cpp + 3rdparty/stylehelper.cpp + adblock/adblockaddsubscriptiondialog.cpp + adblock/adblockurlinterceptor.cpp + adblock/adblockdialog.cpp + adblock/adblockicon.cpp + adblock/adblockmanager.cpp + adblock/adblockmatcher.cpp + adblock/adblockrule.cpp + adblock/adblocksearchtree.cpp + adblock/adblocksubscription.cpp + adblock/adblocktreewidget.cpp + app/autosaver.cpp + app/browserwindow.cpp + app/commandlineoptions.cpp + app/datapaths.cpp + app/mainapplication.cpp + app/mainmenu.cpp + app/profilemanager.cpp + app/proxystyle.cpp + app/qzcommon.cpp + app/settings.cpp + autofill/autofill.cpp + autofill/autofillicon.cpp + autofill/autofillnotification.cpp + autofill/autofillwidget.cpp + autofill/passwordbackends/databaseencryptedpasswordbackend.cpp + autofill/passwordbackends/databasepasswordbackend.cpp + autofill/passwordbackends/passwordbackend.cpp + autofill/passwordmanager.cpp + bookmarks/bookmarkitem.cpp + bookmarks/bookmarks.cpp + bookmarks/bookmarksexport/bookmarksexportdialog.cpp + bookmarks/bookmarksexport/bookmarksexporter.cpp + bookmarks/bookmarksexport/htmlexporter.cpp + bookmarks/bookmarksicon.cpp + bookmarks/bookmarksimport/bookmarksimportdialog.cpp + bookmarks/bookmarksimport/bookmarksimporter.cpp + bookmarks/bookmarksimport/firefoximporter.cpp + bookmarks/bookmarksimport/htmlimporter.cpp + bookmarks/bookmarksimport/chromeimporter.cpp + bookmarks/bookmarksimport/ieimporter.cpp + bookmarks/bookmarksimport/operaimporter.cpp + bookmarks/bookmarksitemdelegate.cpp + bookmarks/bookmarksmanager.cpp + bookmarks/bookmarksmenu.cpp + bookmarks/bookmarksmodel.cpp + bookmarks/bookmarkstoolbarbutton.cpp + bookmarks/bookmarkstoolbar.cpp + bookmarks/bookmarkstools.cpp + bookmarks/bookmarkstreeview.cpp + bookmarks/bookmarkswidget.cpp + cookies/cookiejar.cpp + cookies/cookiemanager.cpp + downloads/downloaditem.cpp + downloads/downloadmanager.cpp + downloads/downloadoptionsdialog.cpp + history/history.cpp + history/historyitem.cpp + history/historymanager.cpp + history/historymenu.cpp + history/historymodel.cpp + history/historytreeview.cpp + navigation/completer/locationcompleter.cpp + navigation/completer/locationcompleterdelegate.cpp + navigation/completer/locationcompletermodel.cpp + navigation/completer/locationcompleterrefreshjob.cpp + navigation/completer/locationcompleterview.cpp + navigation/downicon.cpp + navigation/goicon.cpp + navigation/locationbar.cpp + navigation/locationbarpopup.cpp + navigation/navigationbar.cpp + navigation/navigationcontainer.cpp + navigation/reloadstopbutton.cpp + navigation/siteicon.cpp + navigation/websearchbar.cpp + network/networkmanager.cpp + network/networkproxyfactory.cpp + network/networkurlinterceptor.cpp + network/schemehandlers/falkonschemehandler.cpp + network/sslerrordialog.cpp + notifications/desktopnotification.cpp + notifications/desktopnotificationsfactory.cpp + opensearch/editsearchengine.cpp + opensearch/opensearchengine.cpp + opensearch/opensearchenginedelegate.cpp + opensearch/opensearchreader.cpp + opensearch/searchenginesdialog.cpp + opensearch/searchenginesmanager.cpp + other/aboutdialog.cpp + other/browsinglibrary.cpp + other/clearprivatedata.cpp + other/checkboxdialog.cpp + other/iconchooser.cpp + other/licenseviewer.cpp + other/qzsettings.cpp + other/siteinfo.cpp + other/siteinfowidget.cpp + other/statusbarmessage.cpp + other/updater.cpp + other/useragentmanager.cpp + plugins/pluginproxy.cpp + plugins/plugins.cpp + plugins/speeddial.cpp + popupwindow/popuplocationbar.cpp + popupwindow/popupstatusbarmessage.cpp + popupwindow/popupwebview.cpp + popupwindow/popupwindow.cpp + preferences/acceptlanguage.cpp + preferences/autofillmanager.cpp + preferences/jsoptions.cpp + preferences/pluginlistdelegate.cpp + preferences/pluginsmanager.cpp + preferences/preferences.cpp + preferences/thememanager.cpp + preferences/useragentdialog.cpp + session/recoveryjsobject.cpp + session/restoremanager.cpp + session/sessionmanager.cpp + session/sessionmanagerdialog.cpp + sidebar/bookmarkssidebar.cpp + sidebar/historysidebar.cpp + sidebar/sidebar.cpp + tabwidget/combotabbar.cpp + tabwidget/tabbar.cpp + tabwidget/tabicon.cpp + tabwidget/tabstackedwidget.cpp + tabwidget/tabwidget.cpp + tools/aesinterface.cpp + tools/animatedwidget.cpp + tools/buttonbox.cpp + tools/buttonwithmenu.cpp + tools/certificateinfowidget.cpp + tools/clickablelabel.cpp + tools/closedtabsmanager.cpp + tools/colors.cpp + tools/delayedfilewatcher.cpp + tools/docktitlebarwidget.cpp + tools/emptynetworkreply.cpp + tools/enhancedmenu.cpp + tools/focusselectlineedit.cpp + tools/frame.cpp + tools/headerview.cpp + tools/horizontallistwidget.cpp + tools/html5permissions/html5permissionsdialog.cpp + tools/html5permissions/html5permissionsmanager.cpp + tools/html5permissions/html5permissionsnotification.cpp + tools/iconprovider.cpp + tools/listitemdelegate.cpp + tools/mactoolbutton.cpp + tools/menubar.cpp + tools/pagethumbnailer.cpp + tools/progressbar.cpp + tools/qzregexp.cpp + tools/qztools.cpp + tools/removeitemfocusdelegate.cpp + tools/scripts.cpp + tools/sqldatabase.cpp + tools/toolbutton.cpp + tools/treewidget.cpp + tools/widget.cpp + tools/wheelhelper.cpp + webengine/javascript/autofilljsobject.cpp + webengine/javascript/externaljsobject.cpp + webengine/loadrequest.cpp + webengine/webhittestresult.cpp + webengine/webinspector.cpp + webengine/webpage.cpp + webengine/webview.cpp + webengine/webscrollbar.cpp + webengine/webscrollbarmanager.cpp + webtab/searchtoolbar.cpp + webtab/tabbedwebview.cpp + webtab/webtab.cpp +) + +if (WIN32) + set(SRCS ${SRCS} other/registerqappassociation.cpp) +endif() +if (APPLE) + set(SRCS ${SRCS} tools/disablewindowtabbbing.mm) +endif() + +# TODO: use ki18n_wrap_ui? +qt5_wrap_ui(SRCS + adblock/adblockaddsubscriptiondialog.ui + adblock/adblockdialog.ui + autofill/autofillnotification.ui + autofill/autofillwidget.ui + autofill/passwordbackends/masterpassworddialog.ui + bookmarks/bookmarksexport/bookmarksexportdialog.ui + bookmarks/bookmarksimport/bookmarksimportdialog.ui + bookmarks/bookmarksmanager.ui + bookmarks/bookmarkswidget.ui + cookies/cookiemanager.ui + downloads/downloaditem.ui + downloads/downloadmanager.ui + downloads/downloadoptionsdialog.ui + history/historymanager.ui + network/sslerrordialog.ui + notifications/desktopnotification.ui + opensearch/editsearchengine.ui + opensearch/searchenginesdialog.ui + other/aboutdialog.ui + other/browsinglibrary.ui + other/clearprivatedata.ui + other/iconchooser.ui + other/siteinfo.ui + other/siteinfowidget.ui + preferences/acceptlanguage.ui + preferences/addacceptlanguage.ui + preferences/autofillmanager.ui + preferences/jsoptions.ui + preferences/pluginslist.ui + preferences/preferences.ui + preferences/thememanager.ui + preferences/useragentdialog.ui + session/sessionmanagerdialog.ui + sidebar/bookmarkssidebar.ui + sidebar/historysidebar.ui + tools/certificateinfowidget.ui + tools/docktitlebarwidget.ui + tools/html5permissions/html5permissionsdialog.ui + tools/html5permissions/html5permissionsnotification.ui + webengine/jsalert.ui + webengine/jsconfirm.ui + webengine/jsprompt.ui + webtab/searchtoolbar.ui +) + +qt5_add_resources(SRCS + data/data.qrc + data/html.qrc + data/icons.qrc + data/breeze-fallback.qrc +) + +add_library(FalkonPrivate SHARED ${SRCS}) + +target_link_libraries(FalkonPrivate Qt5::Widgets Qt5::WebEngineWidgets Qt5::Network Qt5::Sql Qt5::PrintSupport Qt5::QuickWidgets Qt5::WebChannel) + +if (UNIX AND NOT APPLE) + if (NOT NO_X11) + target_link_libraries(FalkonPrivate XCB::XCB Qt5::X11Extras) + endif() + target_link_libraries(FalkonPrivate crypto) + + set_target_properties(FalkonPrivate PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION "5") + install(TARGETS FalkonPrivate ${KDE_INSTALL_TARGETS_DEFAULT_ARGS} LIBRARY NAMELINK_SKIP) +endif() + +if (WIN32) + target_link_libraries(FalkonPrivate Qt5::WinExtras) + target_link_libraries(FalkonPrivate libeay32) +endif() + +if (APPLE) + # homebrew openssl + execute_process(COMMAND "readlink `brew --prefix openssl` | sed 's/..//'" + OUTPUT_VARIABLE READLINK_OUTPUT) + set(BREW_OPENSSL "/usr/local${READLINK_OUTPUT}") + include_directories(${BREW_OPENSSL}/include) + target_link_libraries(FalkonPrivate ${BREW_OPENSSL}/lib/libcrypto.so "-framework CoreServices -framework AppKit") +endif() + +if (NOT DISABLE_DBUS) + target_link_libraries(FalkonPrivate Qt5::DBus) +endif() diff --git a/src/lib/app/datapaths.cpp b/src/lib/app/datapaths.cpp index 4a566f508..1235150a0 100644 --- a/src/lib/app/datapaths.cpp +++ b/src/lib/app/datapaths.cpp @@ -88,21 +88,22 @@ void DataPaths::init() #if defined(Q_OS_MACOS) m_paths[AppData].append(QApplication::applicationDirPath() + QLatin1String("/../Resources")); #elif defined(Q_OS_UNIX) && !defined(NO_SYSTEM_DATAPATH) - m_paths[AppData].append(USE_DATADIR); + // Add standard data lookup paths (our appname has a capital F so we manually construct + // the final paths for now) + for (const auto& location : QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation)) { + m_paths[AppData].append(location + QLatin1String("/falkon")); + m_paths[Translations].append(location + QLatin1String("/falkon/locale")); + m_paths[Themes].append(location + QLatin1String("/falkon/themes")); + m_paths[Plugins].append(location + QLatin1String("/falkon/plugins")); + } #else m_paths[AppData].append(QApplication::applicationDirPath()); #endif - m_paths[Translations].append(m_paths[AppData].at(0) + QLatin1String("/locale")); - m_paths[Themes].append(m_paths[AppData].at(0) + QLatin1String("/themes")); - m_paths[Plugins].append(m_paths[AppData].at(0) + QLatin1String("/plugins")); - - // Add standard data lookup paths (our appname has a capital F so we manually construct - // the final paths for now) - for (auto location : QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation)) { - m_paths[Translations].append(location + QLatin1String("/falkon/locale")); - m_paths[Themes].append(location + QLatin1String("/falkon/themes")); - m_paths[Plugins].append(location + QLatin1String("/falkon/plugins")); + if (m_paths[Translations].isEmpty()) { + m_paths[Translations].append(m_paths[AppData].at(0) + QLatin1String("/locale")); + m_paths[Themes].append(m_paths[AppData].at(0) + QLatin1String("/themes")); + m_paths[Plugins].append(m_paths[AppData].at(0) + QLatin1String("/plugins")); } // Config diff --git a/src/lib/cookies/cookiejar.cpp b/src/lib/cookies/cookiejar.cpp index 0c968cff9..619c1a67b 100644 --- a/src/lib/cookies/cookiejar.cpp +++ b/src/lib/cookies/cookiejar.cpp @@ -149,7 +149,7 @@ bool CookieJar::rejectCookie(const QString &domain, const QNetworkCookie &cookie } } -#if QTWEBENGINE_DISABLED +#ifdef QTWEBENGINE_DISABLED if (m_filterThirdParty) { bool result = matchDomain(cookieDomain, domain); if (!result) { diff --git a/src/lib/network/schemehandlers/falkonschemehandler.cpp b/src/lib/network/schemehandlers/falkonschemehandler.cpp index 92d74895e..413b439e9 100644 --- a/src/lib/network/schemehandlers/falkonschemehandler.cpp +++ b/src/lib/network/schemehandlers/falkonschemehandler.cpp @@ -382,7 +382,7 @@ QString FalkonSchemeReply::configPage() QString("
%1
%2
").arg(tr("Themes"), DataPaths::path(DataPaths::Themes)) + QString("
%1
%2
").arg(tr("Translations"), DataPaths::path(DataPaths::Translations))); -#ifdef FALKON_DEBUG_BUILD +#ifdef QT_DEBUG QString debugBuild = tr("Enabled"); #else QString debugBuild = tr("Disabled");