view CMakeLists.txt @ 187:9613d72b097e

*: multiple performance improvements like marking `static const` when it makes sense... date: change old stupid heap-based method to a structure which should make copying the thing actually make a copy. also many performance-based changes, like removing the std::tie dependency and forward-declaring nlohmann json *: replace every instance of QString::fromUtf8 to Strings::ToQString. the main difference is that our function will always convert exactly what is in the string, while some other times it would only convert up to the nearest NUL byte
author Paper <mrpapersonic@gmail.com>
date Wed, 06 Dec 2023 13:43:54 -0500
parents 9c4645100fec
children 649786bae914
line wrap: on
line source

cmake_minimum_required(VERSION 3.18)
project(minori LANGUAGES CXX VERSION 0.1.0)

if(APPLE)
	enable_language(OBJCXX)
endif()

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")

option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
option(USE_QT6 "Force build with Qt 6" OFF)
option(USE_QT5 "Force build with Qt 5" OFF)
option(UPDATE_TRANSLATIONS "Update *.ts translation files" OFF)

add_subdirectory(dep/anitomy)
add_subdirectory(dep/animia)
add_subdirectory(dep/pugixml)

# Fix for mingw64
list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES ".dll.a" ".a")

if(USE_QT6)
	set(QT_VERSION_MAJOR 6)
elseif(USE_QT5)
	set(QT_VERSION_MAJOR 5)
else()
	find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
endif()

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets LinguistTools)

find_package(CURL REQUIRED)

set(LIBRARIES
	${CURL_LIBRARIES}
	${Qt${QT_VERSION_MAJOR}Widgets_LIBRARIES}
	anitomy
	animia
	pugixml
)

# We need Cocoa for some OS X stuff
if(APPLE)
	find_library(FOUNDATION_LIBRARY Foundation)
	find_library(APPKIT_LIBRARY AppKit)
	list(APPEND LIBRARIES ${FOUNDATION_LIBRARY} ${APPKIT_LIBRARY})
endif()

set(SRC_FILES
	# Main entrypoint
	src/main.cc

	# Core files and datatype declarations...
	src/core/anime.cc
	src/core/anime_db.cc
	src/core/config.cc
	src/core/date.cc
	src/core/filesystem.cc
	src/core/http.cc
	src/core/json.cc
	src/core/strings.cc
	src/core/time.cc

	# Main window
	src/gui/window.cc
	src/gui/theme.cc
	src/gui/locale.cc

	# Main window pages
	src/gui/pages/anime_list.cc
	src/gui/pages/now_playing.cc
	src/gui/pages/statistics.cc
	src/gui/pages/search.cc
	src/gui/pages/seasons.cc
	src/gui/pages/torrents.cc
	src/gui/pages/history.cc

	# Custom widgets
	src/gui/widgets/anime_info.cc
	src/gui/widgets/poster.cc
	src/gui/widgets/clickable_label.cc
	src/gui/widgets/sidebar.cc
	src/gui/widgets/text.cc
	src/gui/widgets/optional_date.cc

	# Dialogs
	src/gui/dialog/about.cc
	src/gui/dialog/information.cc
	src/gui/dialog/settings.cc
	src/gui/dialog/settings/application.cc
	src/gui/dialog/settings/services.cc
	src/gui/dialog/settings/torrents.cc
	src/gui/dialog/settings/recognition.cc

	# Translate
	src/gui/translate/anime.cc
	src/gui/translate/anilist.cc
	src/gui/translate/config.cc

	# Services (only AniList for now)
	src/services/services.cc
	src/services/anilist.cc

	# Tracking
	src/track/constants.cc
	src/track/media.cc

	# Qt resources
	rc/icons.qrc
	rc/dark.qrc
	rc/player_data.qrc
)

set(INCLUDE
	include
	dep/pugixml/src
	dep/animia/include
	dep/anitomy
	dep
)

set(TS_FILES
	rc/locale/en_GB.ts
	rc/locale/es.ts
)

set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/rc/locale")

# dumb little hack to get this working on Qt5 and Qt6
if(UPDATE_TRANSLATIONS)
	cmake_language(CALL qt${QT_VERSION_MAJOR}_create_translation ${SRC_FILES} ${TS_FILES} OPTIONS "-I${CMAKE_CURRENT_SOURCE_DIR}/include")
endif()
cmake_language(CALL qt${QT_VERSION_MAJOR}_add_translation QM_FILES ${TS_FILES})
list(APPEND SRC_FILES ${QM_FILES})

function(qt_create_resource_file outfile)
	set(QRC "<!DOCTYPE rcc><RCC version=\"1.0\">\n\t<qresource>\n")
	get_filename_component(DIR ${outfile} DIRECTORY)
	foreach (qm ${ARGN})
		file(RELATIVE_PATH name ${DIR} ${qm})
		string(APPEND QRC "\t\t<file>${name}</file>\n")
	endforeach()
	string(APPEND QRC "\t</qresource>\n</RCC>\n")
	file(WRITE ${outfile} ${QRC})
endfunction()

qt_create_resource_file("${CMAKE_CURRENT_BINARY_DIR}/rc/locale.qrc" ${QM_FILES})
list(APPEND SRC_FILES "${CMAKE_CURRENT_BINARY_DIR}/rc/locale.qrc")

# This is also used in the Win32 rc file
set(RC_INFO_STRING "A lightweight anime tracker built with Qt.")

if(APPLE) # Mac OS X (or OS X (or macOS))
	set(MACOSX_BUNDLE_BUNDLE_NAME "Minori")
	set(MACOSX_BUNDLE_BUNDLE_VERSION ${minori_VERSION})
	set(MACOSX_BUNDLE_COPYRIGHT "Copyright (C) Paper 2023")
	set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.eu.us.paper.minori")
	set(MACOSX_BUNDLE_INFO_STRING ${RC_INFO_STRING})
	set(MACOSX_BUNDLE_ICON_FILE rc/osx/favicon.icns)
	set(app_icon_osx "${CMAKE_CURRENT_SOURCE_DIR}/rc/osx/favicon.icns")
	set_source_files_properties(${app_icon_osx} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")

	list(APPEND SRC_FILES
		src/sys/osx/dark_theme.mm
		src/sys/osx/filesystem.mm
		${app_icon_osx}
	)
elseif(WIN32) # Windows
	configure_file(
		${CMAKE_CURRENT_SOURCE_DIR}/rc/win32/version.rc.in
		${CMAKE_CURRENT_BINARY_DIR}/rc/version.rc
		@ONLY
	)
	list(APPEND SRC_FILES
		src/sys/win32/dark_theme.cc
		rc/win32/resource.rc
		${CMAKE_CURRENT_BINARY_DIR}/rc/version.rc
	)
elseif(LINUX)
	configure_file(
		${CMAKE_CURRENT_SOURCE_DIR}/rc/linux/Minori.desktop.in
		${CMAKE_CURRENT_BINARY_DIR}/rc/Minori.desktop
		@ONLY
	)
	configure_file(
		${CMAKE_CURRENT_SOURCE_DIR}/rc/favicon256.png
		${CMAKE_CURRENT_BINARY_DIR}/rc/Minori.png
		COPYONLY
	)
endif()

add_executable(minori WIN32 MACOSX_BUNDLE ${SRC_FILES})
set_property(TARGET minori PROPERTY CXX_STANDARD 17)
set_property(TARGET minori PROPERTY AUTOMOC ON)
set_property(TARGET minori PROPERTY AUTORCC ON)

target_include_directories(minori PUBLIC ${CURL_INCLUDE_DIRS} PRIVATE ${INCLUDE})
target_include_directories(minori PUBLIC ${Qt${QT_VERSION_MAJOR}Widgets_INCLUDE_DIRS})
target_compile_options(minori PRIVATE -Wall -Wpedantic -Wextra -Wsuggest-override -Wold-style-cast)
if(APPLE)
	target_compile_definitions(minori PUBLIC MACOSX)
elseif(WIN32)
	target_compile_definitions(minori PUBLIC WIN32)
endif()
target_link_libraries(minori ${LIBRARIES})

if(WIN32)
	install(FILES $<TARGET_RUNTIME_DLLS:minori> TYPE BIN)
endif()