set(LIBRARY_PROJECT "${PROJECT_NAME}-lib") set(EXECUTABLE_PROJECT "${PROJECT_NAME}") add_compile_definitions(QT_DISABLE_DEPRECATED_BEFORE=0x050F00) set(SOURCE_FILES Application.cpp Application.hpp BaseSettings.cpp BaseSettings.hpp BrowserExtension.cpp BrowserExtension.hpp RunGui.cpp RunGui.hpp common/Args.cpp common/Args.hpp common/Channel.cpp common/Channel.hpp common/ChannelChatters.cpp common/ChannelChatters.hpp common/ChatterinoSetting.cpp common/ChatterinoSetting.hpp common/ChatterSet.cpp common/ChatterSet.hpp common/CompletionModel.cpp common/CompletionModel.hpp common/Credentials.cpp common/Credentials.hpp common/DownloadManager.cpp common/DownloadManager.hpp common/Env.cpp common/Env.hpp common/LinkParser.cpp common/LinkParser.hpp common/Modes.cpp common/Modes.hpp common/NetworkCommon.cpp common/NetworkCommon.hpp common/NetworkManager.cpp common/NetworkManager.hpp common/NetworkPrivate.cpp common/NetworkPrivate.hpp common/NetworkRequest.cpp common/NetworkRequest.hpp common/NetworkResult.cpp common/NetworkResult.hpp common/QLogging.cpp common/QLogging.hpp common/Version.cpp common/Version.hpp common/WindowDescriptors.cpp common/WindowDescriptors.hpp controllers/accounts/Account.cpp controllers/accounts/Account.hpp controllers/accounts/AccountController.cpp controllers/accounts/AccountController.hpp controllers/accounts/AccountModel.cpp controllers/accounts/AccountModel.hpp controllers/commands/builtin/twitch/ChatSettings.cpp controllers/commands/builtin/twitch/ChatSettings.hpp controllers/commands/CommandContext.hpp controllers/commands/CommandController.cpp controllers/commands/CommandController.hpp controllers/commands/Command.cpp controllers/commands/Command.hpp controllers/commands/CommandModel.cpp controllers/commands/CommandModel.hpp controllers/filters/FilterModel.cpp controllers/filters/FilterModel.hpp controllers/filters/FilterRecord.cpp controllers/filters/FilterRecord.hpp controllers/filters/FilterSet.cpp controllers/filters/FilterSet.hpp controllers/filters/parser/FilterParser.cpp controllers/filters/parser/FilterParser.hpp controllers/filters/parser/Tokenizer.cpp controllers/filters/parser/Tokenizer.hpp controllers/filters/parser/Types.cpp controllers/filters/parser/Types.hpp controllers/highlights/BadgeHighlightModel.cpp controllers/highlights/BadgeHighlightModel.hpp controllers/highlights/HighlightBadge.cpp controllers/highlights/HighlightBadge.hpp controllers/highlights/HighlightBlacklistModel.cpp controllers/highlights/HighlightBlacklistModel.hpp controllers/highlights/HighlightController.cpp controllers/highlights/HighlightController.hpp controllers/highlights/HighlightModel.cpp controllers/highlights/HighlightModel.hpp controllers/highlights/HighlightPhrase.cpp controllers/highlights/HighlightPhrase.hpp controllers/highlights/UserHighlightModel.cpp controllers/highlights/UserHighlightModel.hpp controllers/hotkeys/ActionNames.hpp controllers/hotkeys/Hotkey.cpp controllers/hotkeys/Hotkey.hpp controllers/hotkeys/HotkeyCategory.hpp controllers/hotkeys/HotkeyController.cpp controllers/hotkeys/HotkeyController.hpp controllers/hotkeys/HotkeyHelpers.cpp controllers/hotkeys/HotkeyHelpers.hpp controllers/hotkeys/HotkeyModel.cpp controllers/hotkeys/HotkeyModel.hpp controllers/ignores/IgnoreController.cpp controllers/ignores/IgnoreController.hpp controllers/ignores/IgnoreModel.cpp controllers/ignores/IgnoreModel.hpp controllers/ignores/IgnorePhrase.cpp controllers/ignores/IgnorePhrase.hpp controllers/moderationactions/ModerationAction.cpp controllers/moderationactions/ModerationAction.hpp controllers/moderationactions/ModerationActionModel.cpp controllers/moderationactions/ModerationActionModel.hpp controllers/logging/ChannelLog.cpp controllers/logging/ChannelLog.hpp controllers/logging/ChannelLoggingModel.cpp controllers/logging/ChannelLoggingModel.hpp controllers/nicknames/NicknamesModel.cpp controllers/nicknames/NicknamesModel.hpp controllers/nicknames/Nickname.hpp controllers/notifications/NotificationController.cpp controllers/notifications/NotificationController.hpp controllers/notifications/NotificationModel.cpp controllers/notifications/NotificationModel.hpp controllers/pings/MutedChannelModel.cpp controllers/pings/MutedChannelModel.hpp controllers/plugins/LuaApi.cpp controllers/plugins/LuaApi.hpp controllers/plugins/Plugin.cpp controllers/plugins/Plugin.hpp controllers/plugins/PluginController.hpp controllers/plugins/PluginController.cpp controllers/plugins/LuaUtilities.cpp controllers/plugins/LuaUtilities.hpp controllers/userdata/UserDataController.cpp controllers/userdata/UserDataController.hpp controllers/userdata/UserData.hpp controllers/sound/SoundController.cpp controllers/sound/SoundController.hpp debug/Benchmark.cpp debug/Benchmark.hpp messages/Emote.cpp messages/Emote.hpp messages/Image.cpp messages/Image.hpp messages/ImageSet.cpp messages/ImageSet.hpp messages/Link.cpp messages/Link.hpp messages/Message.cpp messages/Message.hpp messages/MessageBuilder.cpp messages/MessageBuilder.hpp messages/MessageColor.cpp messages/MessageColor.hpp messages/MessageElement.cpp messages/MessageElement.hpp messages/MessageThread.cpp messages/MessageThread.hpp messages/SharedMessageBuilder.cpp messages/SharedMessageBuilder.hpp messages/layouts/MessageLayout.cpp messages/layouts/MessageLayout.hpp messages/layouts/MessageLayoutContainer.cpp messages/layouts/MessageLayoutContainer.hpp messages/layouts/MessageLayoutElement.cpp messages/layouts/MessageLayoutElement.hpp messages/search/AuthorPredicate.cpp messages/search/AuthorPredicate.hpp messages/search/BadgePredicate.cpp messages/search/BadgePredicate.hpp messages/search/ChannelPredicate.cpp messages/search/ChannelPredicate.hpp messages/search/LinkPredicate.cpp messages/search/LinkPredicate.hpp messages/search/MessageFlagsPredicate.cpp messages/search/MessageFlagsPredicate.hpp messages/search/RegexPredicate.cpp messages/search/RegexPredicate.hpp messages/search/SubstringPredicate.cpp messages/search/SubstringPredicate.hpp messages/search/SubtierPredicate.cpp messages/search/SubtierPredicate.hpp providers/IvrApi.cpp providers/IvrApi.hpp providers/LinkResolver.cpp providers/LinkResolver.hpp providers/RecentMessagesApi.cpp providers/RecentMessagesApi.hpp providers/bttv/BttvEmotes.cpp providers/bttv/BttvEmotes.hpp providers/bttv/BttvLiveUpdates.cpp providers/bttv/BttvLiveUpdates.hpp providers/bttv/liveupdates/BttvLiveUpdateMessages.cpp providers/bttv/liveupdates/BttvLiveUpdateMessages.hpp providers/bttv/liveupdates/BttvLiveUpdateSubscription.cpp providers/bttv/liveupdates/BttvLiveUpdateSubscription.hpp providers/chatterino/ChatterinoBadges.cpp providers/chatterino/ChatterinoBadges.hpp providers/colors/ColorProvider.cpp providers/colors/ColorProvider.hpp providers/emoji/Emojis.cpp providers/emoji/Emojis.hpp providers/ffz/FfzBadges.cpp providers/ffz/FfzBadges.hpp providers/ffz/FfzEmotes.cpp providers/ffz/FfzEmotes.hpp providers/irc/AbstractIrcServer.cpp providers/irc/AbstractIrcServer.hpp providers/irc/Irc2.cpp providers/irc/Irc2.hpp providers/irc/IrcAccount.cpp providers/irc/IrcAccount.hpp providers/irc/IrcChannel2.cpp providers/irc/IrcChannel2.hpp providers/irc/IrcCommands.cpp providers/irc/IrcCommands.hpp providers/irc/IrcConnection2.cpp providers/irc/IrcConnection2.hpp providers/irc/IrcMessageBuilder.cpp providers/irc/IrcMessageBuilder.hpp providers/irc/IrcServer.cpp providers/irc/IrcServer.hpp providers/liveupdates/BasicPubSubClient.hpp providers/liveupdates/BasicPubSubManager.hpp providers/liveupdates/BasicPubSubWebsocket.hpp providers/seventv/SeventvBadges.cpp providers/seventv/SeventvBadges.hpp providers/seventv/SeventvEmotes.cpp providers/seventv/SeventvEmotes.hpp providers/seventv/SeventvEventAPI.cpp providers/seventv/SeventvEventAPI.hpp providers/seventv/eventapi/SeventvEventAPIClient.cpp providers/seventv/eventapi/SeventvEventAPIClient.hpp providers/seventv/eventapi/SeventvEventAPIDispatch.cpp providers/seventv/eventapi/SeventvEventAPIDispatch.hpp providers/seventv/eventapi/SeventvEventAPIMessage.cpp providers/seventv/eventapi/SeventvEventAPIMessage.hpp providers/seventv/eventapi/SeventvEventAPISubscription.cpp providers/seventv/eventapi/SeventvEventAPISubscription.hpp providers/twitch/ChannelPointReward.cpp providers/twitch/ChannelPointReward.hpp providers/twitch/IrcMessageHandler.cpp providers/twitch/IrcMessageHandler.hpp providers/twitch/PubSubActions.cpp providers/twitch/PubSubActions.hpp providers/twitch/PubSubClient.cpp providers/twitch/PubSubClient.hpp providers/twitch/PubSubClientOptions.hpp providers/twitch/PubSubHelpers.hpp providers/twitch/PubSubManager.cpp providers/twitch/PubSubManager.hpp providers/twitch/PubSubMessages.hpp providers/twitch/PubSubWebsocket.hpp providers/twitch/TwitchAccount.cpp providers/twitch/TwitchAccount.hpp providers/twitch/TwitchAccountManager.cpp providers/twitch/TwitchAccountManager.hpp providers/twitch/TwitchBadge.cpp providers/twitch/TwitchBadge.hpp providers/twitch/TwitchBadges.cpp providers/twitch/TwitchBadges.hpp providers/twitch/TwitchChannel.cpp providers/twitch/TwitchChannel.hpp providers/twitch/TwitchEmotes.cpp providers/twitch/TwitchEmotes.hpp providers/twitch/TwitchHelpers.cpp providers/twitch/TwitchHelpers.hpp providers/twitch/TwitchIrcServer.cpp providers/twitch/TwitchIrcServer.hpp providers/twitch/TwitchMessageBuilder.cpp providers/twitch/TwitchMessageBuilder.hpp providers/twitch/TwitchUser.cpp providers/twitch/TwitchUser.hpp providers/twitch/pubsubmessages/AutoMod.cpp providers/twitch/pubsubmessages/AutoMod.hpp providers/twitch/pubsubmessages/Base.cpp providers/twitch/pubsubmessages/Base.hpp providers/twitch/pubsubmessages/ChannelPoints.cpp providers/twitch/pubsubmessages/ChannelPoints.hpp providers/twitch/pubsubmessages/ChatModeratorAction.cpp providers/twitch/pubsubmessages/ChatModeratorAction.hpp providers/twitch/pubsubmessages/Listen.cpp providers/twitch/pubsubmessages/Listen.hpp providers/twitch/pubsubmessages/Message.hpp providers/twitch/pubsubmessages/Unlisten.cpp providers/twitch/pubsubmessages/Unlisten.hpp providers/twitch/pubsubmessages/Whisper.cpp providers/twitch/pubsubmessages/Whisper.hpp providers/twitch/api/Helix.cpp providers/twitch/api/Helix.hpp singletons/Badges.cpp singletons/Badges.hpp singletons/Emotes.cpp singletons/Emotes.hpp singletons/Fonts.cpp singletons/Fonts.hpp singletons/Logging.cpp singletons/Logging.hpp singletons/NativeMessaging.cpp singletons/NativeMessaging.hpp singletons/Paths.cpp singletons/Paths.hpp singletons/Resources.cpp singletons/Resources.hpp singletons/Settings.cpp singletons/Settings.hpp singletons/Theme.cpp singletons/Theme.hpp singletons/Toasts.cpp singletons/Toasts.hpp singletons/Updates.cpp singletons/Updates.hpp singletons/WindowManager.cpp singletons/WindowManager.hpp singletons/helper/GifTimer.cpp singletons/helper/GifTimer.hpp singletons/helper/LoggingChannel.cpp singletons/helper/LoggingChannel.hpp util/AttachToConsole.cpp util/AttachToConsole.hpp util/Clipboard.cpp util/Clipboard.hpp util/ConcurrentMap.hpp util/DebugCount.cpp util/DebugCount.hpp util/DisplayBadge.cpp util/DisplayBadge.hpp util/FormatTime.cpp util/FormatTime.hpp util/FunctionEventFilter.cpp util/FunctionEventFilter.hpp util/FuzzyConvert.cpp util/FuzzyConvert.hpp util/Helpers.cpp util/Helpers.hpp util/IncognitoBrowser.cpp util/IncognitoBrowser.hpp util/InitUpdateButton.cpp util/InitUpdateButton.hpp util/LayoutHelper.cpp util/LayoutHelper.hpp util/NuulsUploader.cpp util/NuulsUploader.hpp util/RapidjsonHelpers.cpp util/RapidjsonHelpers.hpp util/RatelimitBucket.cpp util/RatelimitBucket.hpp util/SampleData.cpp util/SampleData.hpp util/SharedPtrElementLess.hpp util/SplitCommand.cpp util/SplitCommand.hpp util/StreamLink.cpp util/StreamLink.hpp util/StreamerMode.cpp util/StreamerMode.hpp util/ThreadGuard.hpp util/Twitch.cpp util/Twitch.hpp util/TypeName.hpp util/WindowsHelper.cpp util/WindowsHelper.hpp util/serialize/Container.hpp widgets/AccountSwitchPopup.cpp widgets/AccountSwitchPopup.hpp widgets/AccountSwitchWidget.cpp widgets/AccountSwitchWidget.hpp widgets/AttachedWindow.cpp widgets/AttachedWindow.hpp widgets/BasePopup.cpp widgets/BasePopup.hpp widgets/BaseWidget.cpp widgets/BaseWidget.hpp widgets/BaseWindow.cpp widgets/BaseWindow.hpp widgets/DraggablePopup.cpp widgets/DraggablePopup.hpp widgets/FramelessEmbedWindow.cpp widgets/FramelessEmbedWindow.hpp widgets/Label.cpp widgets/Label.hpp widgets/Notebook.cpp widgets/Notebook.hpp widgets/Scrollbar.cpp widgets/Scrollbar.hpp widgets/StreamView.cpp widgets/StreamView.hpp widgets/TooltipWidget.cpp widgets/TooltipWidget.hpp widgets/Window.cpp widgets/Window.hpp widgets/dialogs/BadgePickerDialog.cpp widgets/dialogs/BadgePickerDialog.hpp widgets/dialogs/ChannelFilterEditorDialog.cpp widgets/dialogs/ChannelFilterEditorDialog.hpp widgets/dialogs/ColorPickerDialog.cpp widgets/dialogs/ColorPickerDialog.hpp widgets/dialogs/EditHotkeyDialog.cpp widgets/dialogs/EditHotkeyDialog.hpp widgets/dialogs/EmotePopup.cpp widgets/dialogs/EmotePopup.hpp widgets/dialogs/IrcConnectionEditor.cpp widgets/dialogs/IrcConnectionEditor.hpp widgets/dialogs/IrcConnectionEditor.ui widgets/dialogs/LastRunCrashDialog.cpp widgets/dialogs/LastRunCrashDialog.hpp widgets/dialogs/LoginDialog.cpp widgets/dialogs/LoginDialog.hpp widgets/dialogs/NotificationPopup.cpp widgets/dialogs/NotificationPopup.hpp widgets/dialogs/QualityPopup.cpp widgets/dialogs/QualityPopup.hpp widgets/dialogs/ReplyThreadPopup.cpp widgets/dialogs/ReplyThreadPopup.hpp widgets/dialogs/SelectChannelDialog.cpp widgets/dialogs/SelectChannelDialog.hpp widgets/dialogs/SelectChannelFiltersDialog.cpp widgets/dialogs/SelectChannelFiltersDialog.hpp widgets/dialogs/SettingsDialog.cpp widgets/dialogs/SettingsDialog.hpp widgets/dialogs/UpdateDialog.cpp widgets/dialogs/UpdateDialog.hpp widgets/dialogs/UserInfoPopup.cpp widgets/dialogs/UserInfoPopup.hpp widgets/dialogs/WelcomeDialog.cpp widgets/dialogs/WelcomeDialog.hpp widgets/dialogs/switcher/NewPopupItem.cpp widgets/dialogs/switcher/NewPopupItem.hpp widgets/dialogs/switcher/NewTabItem.cpp widgets/dialogs/switcher/NewTabItem.hpp widgets/dialogs/switcher/QuickSwitcherModel.cpp widgets/dialogs/switcher/QuickSwitcherModel.hpp widgets/dialogs/switcher/QuickSwitcherPopup.cpp widgets/dialogs/switcher/QuickSwitcherPopup.hpp widgets/dialogs/switcher/SwitchSplitItem.cpp widgets/dialogs/switcher/SwitchSplitItem.hpp widgets/helper/Button.cpp widgets/helper/Button.hpp widgets/helper/ChannelView.cpp widgets/helper/ChannelView.hpp widgets/helper/ColorButton.cpp widgets/helper/ColorButton.hpp widgets/helper/ComboBoxItemDelegate.cpp widgets/helper/ComboBoxItemDelegate.hpp widgets/helper/DebugPopup.cpp widgets/helper/DebugPopup.hpp widgets/helper/EditableModelView.cpp widgets/helper/EditableModelView.hpp widgets/helper/EffectLabel.cpp widgets/helper/EffectLabel.hpp widgets/helper/NotebookButton.cpp widgets/helper/NotebookButton.hpp widgets/helper/NotebookTab.cpp widgets/helper/NotebookTab.hpp widgets/helper/QColorPicker.cpp widgets/helper/QColorPicker.hpp widgets/helper/RegExpItemDelegate.cpp widgets/helper/RegExpItemDelegate.hpp widgets/helper/TrimRegExpValidator.cpp widgets/helper/TrimRegExpValidator.hpp widgets/helper/ResizingTextEdit.cpp widgets/helper/ResizingTextEdit.hpp widgets/helper/ScrollbarHighlight.cpp widgets/helper/ScrollbarHighlight.hpp widgets/helper/SearchPopup.cpp widgets/helper/SearchPopup.hpp widgets/helper/SettingsDialogTab.cpp widgets/helper/SettingsDialogTab.hpp widgets/helper/SignalLabel.cpp widgets/helper/SignalLabel.hpp widgets/helper/TitlebarButton.cpp widgets/helper/TitlebarButton.hpp widgets/listview/GenericItemDelegate.cpp widgets/listview/GenericItemDelegate.hpp widgets/listview/GenericListItem.cpp widgets/listview/GenericListItem.hpp widgets/listview/GenericListModel.cpp widgets/listview/GenericListModel.hpp widgets/listview/GenericListView.cpp widgets/listview/GenericListView.hpp widgets/settingspages/AboutPage.cpp widgets/settingspages/AboutPage.hpp widgets/settingspages/AccountsPage.cpp widgets/settingspages/AccountsPage.hpp widgets/settingspages/CommandPage.cpp widgets/settingspages/CommandPage.hpp widgets/settingspages/ExternalToolsPage.cpp widgets/settingspages/ExternalToolsPage.hpp widgets/settingspages/FiltersPage.cpp widgets/settingspages/FiltersPage.hpp widgets/settingspages/GeneralPage.cpp widgets/settingspages/GeneralPage.hpp widgets/settingspages/GeneralPageView.cpp widgets/settingspages/GeneralPageView.hpp widgets/settingspages/HighlightingPage.cpp widgets/settingspages/HighlightingPage.hpp widgets/settingspages/IgnoresPage.cpp widgets/settingspages/IgnoresPage.hpp widgets/settingspages/KeyboardSettingsPage.cpp widgets/settingspages/KeyboardSettingsPage.hpp widgets/settingspages/ModerationPage.cpp widgets/settingspages/ModerationPage.hpp widgets/settingspages/NicknamesPage.cpp widgets/settingspages/NicknamesPage.hpp widgets/settingspages/NotificationPage.cpp widgets/settingspages/NotificationPage.hpp widgets/settingspages/PluginsPage.cpp widgets/settingspages/PluginsPage.hpp widgets/settingspages/SettingsPage.cpp widgets/settingspages/SettingsPage.hpp widgets/splits/ClosedSplits.cpp widgets/splits/ClosedSplits.hpp widgets/splits/DraggedSplit.cpp widgets/splits/DraggedSplit.hpp widgets/splits/InputCompletionItem.cpp widgets/splits/InputCompletionItem.hpp widgets/splits/InputCompletionPopup.cpp widgets/splits/InputCompletionPopup.hpp widgets/splits/Split.cpp widgets/splits/Split.hpp widgets/splits/SplitContainer.cpp widgets/splits/SplitContainer.hpp widgets/splits/SplitHeader.cpp widgets/splits/SplitHeader.hpp widgets/splits/SplitInput.cpp widgets/splits/SplitInput.hpp widgets/splits/SplitOverlay.cpp widgets/splits/SplitOverlay.hpp ${CMAKE_SOURCE_DIR}/resources/resources.qrc ) if (WIN32) # clang-cl doesn't support resource files if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") list(APPEND SOURCE_FILES "${CMAKE_SOURCE_DIR}/resources/windows.rc") endif () elseif (APPLE) set(MACOS_BUNDLE_ICON_FILE "${CMAKE_SOURCE_DIR}/resources/chatterino.icns") list(APPEND SOURCE_FILES "${MACOS_BUNDLE_ICON_FILE}") set_source_files_properties(${MACOS_BUNDLE_ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") endif () # Generate source groups for use in IDEs source_group(TREE ${CMAKE_SOURCE_DIR} FILES ${SOURCE_FILES}) # Add autogenerated files list(APPEND SOURCE_FILES ${RES_AUTOGEN_FILES}) add_library(${LIBRARY_PROJECT} OBJECT ${SOURCE_FILES}) if (CHATTERINO_GENERATE_COVERAGE) include(CodeCoverage) append_coverage_compiler_flags_to_target(${LIBRARY_PROJECT}) target_link_libraries(${LIBRARY_PROJECT} PUBLIC gcov) message(STATUS "project source dir: ${PROJECT_SOURCE_DIR}/src") setup_target_for_coverage_lcov( NAME coverage EXECUTABLE ./bin/chatterino-test BASE_DIRECTORY ${PROJECT_SOURCE_DIR}/src EXCLUDE "/usr/include/*" EXCLUDE "build-*/*" EXCLUDE "lib/*" ) endif () target_link_libraries(${LIBRARY_PROJECT} PUBLIC Qt${MAJOR_QT_VERSION}::Core Qt${MAJOR_QT_VERSION}::Widgets Qt${MAJOR_QT_VERSION}::Gui Qt${MAJOR_QT_VERSION}::Network Qt${MAJOR_QT_VERSION}::Svg Qt${MAJOR_QT_VERSION}::Concurrent LibCommuni::LibCommuni Pajlada::Serialize Pajlada::Settings Pajlada::Signals websocketpp::websocketpp Threads::Threads RapidJSON::RapidJSON LRUCache MagicEnum ) if (CHATTERINO_PLUGINS) target_link_libraries(${LIBRARY_PROJECT} PUBLIC lua) endif() if (BUILD_WITH_QTKEYCHAIN) target_link_libraries(${LIBRARY_PROJECT} PUBLIC qt${MAJOR_QT_VERSION}keychain ) else() target_compile_definitions(${LIBRARY_PROJECT} PUBLIC NO_QTKEYCHAIN ) endif() if (BUILD_APP) if (APPLE) add_executable(${EXECUTABLE_PROJECT} ${MACOS_BUNDLE_ICON_FILE} main.cpp) else() add_executable(${EXECUTABLE_PROJECT} main.cpp) endif() add_sanitizers(${EXECUTABLE_PROJECT}) target_include_directories(${EXECUTABLE_PROJECT} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_BINARY_DIR}/autogen/) target_link_libraries(${EXECUTABLE_PROJECT} PUBLIC ${LIBRARY_PROJECT}) set_target_properties(${EXECUTABLE_PROJECT} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/bin" RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/bin" RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/bin" ) if (WIN32) if (NOT WINDEPLOYQT_PATH) get_target_property(Qt_Core_Location Qt${MAJOR_QT_VERSION}::Core LOCATION) get_filename_component(QT_BIN_DIR ${Qt_Core_Location} DIRECTORY) string(APPEND WINDEPLOYQT_PATH ${QT_BIN_DIR} /windeployqt.exe) else() file(TO_CMAKE_PATH "${WINDEPLOYQT_PATH}" WINDEPLOYQT_PATH) endif() if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(WINDEPLOYQT_MODE --debug) else() set(WINDEPLOYQT_MODE --release) endif() set(WINDEPLOYQT_COMMAND_ARGV "${WINDEPLOYQT_PATH}" "$" ${WINDEPLOYQT_MODE} --no-compiler-runtime --no-translations --no-opengl-sw) string(REPLACE ";" " " WINDEPLOYQT_COMMAND "${WINDEPLOYQT_COMMAND_ARGV}") if (X_VCPKG_APPLOCAL_DEPS_INSTALL) install(TARGETS ${EXECUTABLE_PROJECT} RUNTIME DESTINATION .) else() install(TARGETS ${EXECUTABLE_PROJECT} RUNTIME_DEPENDENCIES PRE_EXCLUDE_REGEXES "api-ms-" "ext-ms-" POST_EXCLUDE_REGEXES ".*system32/.*\\.dll" DIRECTORIES ${QT_BIN_DIR} RUNTIME DESTINATION .) install(CODE "message(\"-- Running: ${WINDEPLOYQT_COMMAND} --dir \\\"\${CMAKE_INSTALL_PREFIX}\\\"\")") install(CODE "execute_process(COMMAND ${WINDEPLOYQT_COMMAND} --dir \"\${CMAKE_INSTALL_PREFIX}\" COMMAND_ERROR_IS_FATAL ANY)") endif() elseif (APPLE) install(TARGETS ${EXECUTABLE_PROJECT} RUNTIME DESTINATION bin BUNDLE DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib/static ) else () install(TARGETS ${EXECUTABLE_PROJECT} RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib/static ) install(FILES ${CMAKE_SOURCE_DIR}/resources/com.chatterino.chatterino.desktop DESTINATION share/applications ) install(FILES ${CMAKE_SOURCE_DIR}/resources/icon.png RENAME com.chatterino.chatterino.png DESTINATION share/icons/hicolor/256x256/apps ) endif () if(CHATTERINO_ENABLE_LTO) message(STATUS "Enabling LTO for ${EXECUTABLE_PROJECT}") set_property(TARGET ${EXECUTABLE_PROJECT} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) endif() endif () if (USE_PRECOMPILED_HEADERS) message(STATUS "Building with precompiled headers") target_precompile_headers(${LIBRARY_PROJECT} PRIVATE PrecompiledHeader.hpp) else () message(STATUS "Building without precompiled headers") endif () # Enable autogeneration of Qts MOC/RCC/UIC set_target_properties(${LIBRARY_PROJECT} PROPERTIES AUTOMOC ON AUTORCC ON AUTOUIC ON ) # Used to provide a date of build in the About page (for nightly builds). Getting the actual time of # compilation in CMake is a more involved, as documented in https://stackoverflow.com/q/24292898. # For CI runs, however, the date of build file generation should be consistent with the date of # compilation so this approximation is "good enough" for our purpose. if (DEFINED ENV{CHATTERINO_SKIP_DATE_GEN}) set(cmake_gen_date "1970-01-01") else () string(TIMESTAMP cmake_gen_date "%Y-%m-%d") endif () target_compile_definitions(${LIBRARY_PROJECT} PUBLIC CHATTERINO UNICODE AB_CUSTOM_SETTINGS IRC_STATIC IRC_NAMESPACE=Communi CHATTERINO_GIT_HASH=\"${GIT_HASH}\" CHATTERINO_GIT_RELEASE=\"${GIT_RELEASE}\" CHATTERINO_GIT_COMMIT=\"${GIT_COMMIT}\" CHATTERINO_CMAKE_GEN_DATE=\"${cmake_gen_date}\" ) if (GIT_MODIFIED) target_compile_definitions(${LIBRARY_PROJECT} PUBLIC CHATTERINO_GIT_MODIFIED ) endif () if (USE_SYSTEM_QTKEYCHAIN) target_compile_definitions(${LIBRARY_PROJECT} PUBLIC CMAKE_BUILD ) endif () if (WIN32) target_compile_definitions(${LIBRARY_PROJECT} PUBLIC USEWINSDK ) if (BUILD_APP) set_target_properties(${EXECUTABLE_PROJECT} PROPERTIES WIN32_EXECUTABLE TRUE) endif () endif () if (MSVC) target_compile_options(${LIBRARY_PROJECT} PUBLIC /EHsc /bigobj) endif () if (APPLE AND BUILD_APP) set_target_properties(${EXECUTABLE_PROJECT} PROPERTIES MACOSX_BUNDLE TRUE) set_target_properties(${EXECUTABLE_PROJECT} PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Chatterino" MACOSX_BUNDLE_GUI_IDENTIFIER "com.chatterino" MACOSX_BUNDLE_INFO_STRING "Chat client for Twitch" MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_VERSION}" MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}" MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION}" MACOSX_BUNDLE_ICON_FILE chatterino.icns ) endif () target_include_directories(${LIBRARY_PROJECT} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_BINARY_DIR}/autogen/) # semver dependency https://github.com/Neargye/semver target_include_directories(${LIBRARY_PROJECT} PUBLIC ${CMAKE_SOURCE_DIR}/lib/semver/include) # miniaudio dependency https://github.com/mackron/miniaudio target_include_directories(${LIBRARY_PROJECT} PUBLIC ${CMAKE_SOURCE_DIR}/lib/miniaudio) if (UNIX) if (CMAKE_DL_LIBS) # libdl is a requirement for miniaudio on Linux message(STATUS "Linking with CMake DL libs: '${CMAKE_DL_LIBS}'") target_link_libraries(${LIBRARY_PROJECT} PUBLIC ${CMAKE_DL_LIBS}) endif () endif () if (WinToast_FOUND) target_link_libraries(${LIBRARY_PROJECT} PUBLIC WinToast) endif () target_link_libraries(${LIBRARY_PROJECT} PUBLIC ${Boost_LIBRARIES} ) target_link_libraries(${LIBRARY_PROJECT} PUBLIC OpenSSL::SSL OpenSSL::Crypto ) target_include_directories(${LIBRARY_PROJECT} PUBLIC ${RapidJSON_INCLUDE_DIRS}) if (LIBRT) target_link_libraries(${LIBRARY_PROJECT} PUBLIC ${LIBRT} ) endif () # Configure compiler warnings if (MSVC) # Someone adds /W3 before we add /W4. # This makes sure, only /W4 is specified. string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # 4505 - "unreferenced local version has been removed" # Although this might give hints on dead code, # there are some cases where it's distracting. # # 4100 - "unreferenced formal parameter" # There are a lot of functions and methods where # an argument was given a name but never used. # There's a clang-tidy rule that will catch this # for new/updated functions/methods. # # 4267 - "possible loss of data in return" # These are implicit conversions from size_t to int/qsizetype. # We don't use size_t in a lot of cases, since # Qt doesn't use it - it uses int (or qsizetype in Qt6). target_compile_options(${LIBRARY_PROJECT} PUBLIC /W4 # 5038 - warnings about initialization order /w15038 # 4855 - implicit capture of 'this' via '[=]' is deprecated /w14855 # Disable the following warnings (see reasoning above) /wd4505 /wd4100 /wd4267 ) target_compile_definitions(${LIBRARY_PROJECT} PUBLIC NOMINMAX) else () target_compile_options(${LIBRARY_PROJECT} PUBLIC -Wall # Disable the following warnings -Wno-unused-function -Wno-switch -Wno-deprecated-declarations -Wno-sign-compare -Wno-unused-variable # Disabling strict-aliasing warnings for now, although we probably want to re-enable this in the future -Wno-strict-aliasing -Werror=return-type -Werror=reorder ) if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_compile_options(${LIBRARY_PROJECT} PUBLIC -Wno-unused-local-typedef -Wno-unused-private-field -Werror=inconsistent-missing-override -Werror=final-dtor-non-final-class -Werror=ambiguous-reversed-operator ) else () target_compile_options(${LIBRARY_PROJECT} PUBLIC -Wno-class-memaccess ) endif() endif () if(CHATTERINO_ENABLE_LTO) message(STATUS "Enabling LTO for ${LIBRARY_PROJECT}") set_property(TARGET ${LIBRARY_PROJECT} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) endif()