feat: add windeploy CMake target

This commit is contained in:
shenlebantongying 2023-08-06 07:16:53 -04:00
parent c251a8f93b
commit ff8aa2ae42
3 changed files with 65 additions and 38 deletions

View file

@ -30,14 +30,10 @@ else ()
set(GOLDENDICT "goldendict-ng") set(GOLDENDICT "goldendict-ng")
endif () endif ()
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
#### Importing Libraries #### Qt
find_package(Qt6 REQUIRED COMPONENTS find_package(Qt6 REQUIRED COMPONENTS
Concurrent Concurrent
@ -51,7 +47,10 @@ find_package(Qt6 REQUIRED COMPONENTS
TextToSpeech TextToSpeech
) )
#### Compile time files and preprocessor flags qt_standard_project_setup() # availiable after find_package(Qt6 .... Core
set(CMAKE_AUTORCC ON) # not included in the qt_standard_project_setup
#### Things required during configuration
block() # generate version.txt block() # generate version.txt
string(TIMESTAMP build_time) string(TIMESTAMP build_time)
@ -67,6 +66,12 @@ block() # generate version.txt
endif () endif ()
endblock() endblock()
if (WIN32)
# Binaries output dir for windows. The default ${CMAKE_BINARY_DIR} is too messy, use subfolder instead
# So that we can directly use windeployqt inside the output folder and obtain a redistributable GD
set(GD_WIN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/${GOLDENDICT})
endif ()
#### Sources Files #### Sources Files
# auto discovery of ui files https://cmake.org/cmake/help/v3.26/prop_tgt/AUTOUIC_SEARCH_PATHS.html # auto discovery of ui files https://cmake.org/cmake/help/v3.26/prop_tgt/AUTOUIC_SEARCH_PATHS.html
@ -81,18 +86,18 @@ if (APPLE)
file(GLOB_RECURSE MACOS_SOURCE_FILES CONFIGURE_DEPENDS src/macos/*.mm) file(GLOB_RECURSE MACOS_SOURCE_FILES CONFIGURE_DEPENDS src/macos/*.mm)
endif () endif ()
if (WIN32)
set(WINDOWS_ICON_RC icons/programicon.rc)
endif ()
set(QSINGLEAPP_SOURCE_FILES set(QSINGLEAPP_SOURCE_FILES
thirdparty/qtsingleapplication/src/qtlocalpeer.cpp thirdparty/qtsingleapplication/src/qtlocalpeer.cpp
thirdparty/qtsingleapplication/src/qtlocalpeer.h thirdparty/qtsingleapplication/src/qtlocalpeer.h
thirdparty/qtsingleapplication/src/qtsingleapplication.cpp thirdparty/qtsingleapplication/src/qtsingleapplication.cpp
thirdparty/qtsingleapplication/src/qtsingleapplication.h thirdparty/qtsingleapplication/src/qtsingleapplication.h
) )
if(WIN32) qt_add_executable(${GOLDENDICT})
qt_add_executable(${GOLDENDICT} WIN32 MANUAL_FINALIZATION icons/programicon.rc)
else()
qt_add_executable(${GOLDENDICT} MANUAL_FINALIZATION)
endif()
target_sources(${GOLDENDICT} PRIVATE target_sources(${GOLDENDICT} PRIVATE
icons/flags.qrc icons/flags.qrc
@ -101,7 +106,9 @@ target_sources(${GOLDENDICT} PRIVATE
src/stylesheets/css.qrc src/stylesheets/css.qrc
${ALL_SOURCE_FILES} ${ALL_SOURCE_FILES}
${MACOS_SOURCE_FILES} ${MACOS_SOURCE_FILES}
${QSINGLEAPP_SOURCE_FILES}) ${QSINGLEAPP_SOURCE_FILES}
${WINDOWS_ICON_RC}
)
if (NOT USE_SYSTEM_FMT) if (NOT USE_SYSTEM_FMT)
target_sources(${GOLDENDICT} PRIVATE thirdparty/fmt/format.cc) target_sources(${GOLDENDICT} PRIVATE thirdparty/fmt/format.cc)
@ -177,22 +184,20 @@ endif ()
#### add translations #### add translations
install(TARGETS ${GOLDENDICT}
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${GOLDENDICT})
# include all *ts files under locale # include all *ts files under locale
file(GLOB TRANS_FILES "locale/*.ts") file(GLOB TRANS_FILES "locale/*.ts")
# Put generated files to output dir's locale if (WIN32)
set_source_files_properties(${TRANS_FILES} # Put generated files to output dir's locale
PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/locale") set_source_files_properties(${TRANS_FILES} PROPERTIES OUTPUT_LOCATION "${GD_WIN_OUTPUT_DIR}/locale")
else ()
set_source_files_properties(${TRANS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/locale")
endif ()
# a wrapper over qt_add_lupdate and qt_add_lrelease # a wrapper over qt_add_lupdate and qt_add_lrelease
qt_add_translations(${GOLDENDICT} TS_FILES ${TRANS_FILES} qt_add_translations(${GOLDENDICT} TS_FILES ${TRANS_FILES}
QM_FILES_OUTPUT_VARIABLE qm_files) QM_FILES_OUTPUT_VARIABLE qm_files)
#### installation #### installation or assemble redistribution
if (APPLE) if (APPLE)
set_target_properties(${GOLDENDICT} PROPERTIES set_target_properties(${GOLDENDICT} PROPERTIES
@ -204,6 +209,7 @@ if (APPLE)
endif () endif ()
if (LINUX OR BSD) if (LINUX OR BSD)
install(TARGETS ${GOLDENDICT})
install(FILES ${CMAKE_SOURCE_DIR}/redist/io.github.xiaoyifang.goldendict_ng.desktop DESTINATION share/applications) install(FILES ${CMAKE_SOURCE_DIR}/redist/io.github.xiaoyifang.goldendict_ng.desktop DESTINATION share/applications)
install(FILES ${CMAKE_SOURCE_DIR}/redist/io.github.xiaoyifang.goldendict_ng.metainfo.xml DESTINATION share/metainfo) install(FILES ${CMAKE_SOURCE_DIR}/redist/io.github.xiaoyifang.goldendict_ng.metainfo.xml DESTINATION share/metainfo)
@ -227,6 +233,25 @@ if (LINUX OR BSD)
endif () endif ()
endif () endif ()
qt_finalize_target(${GOLDENDICT}) if (WIN32)
set_target_properties(${GOLDENDICT}
PROPERTIES
WIN32_EXECUTABLE TRUE
RUNTIME_OUTPUT_DIRECTORY "${GD_WIN_OUTPUT_DIR}"
LIBRARY_OUTPUT_DIRECTORY "${GD_WIN_OUTPUT_DIR}"
)
add_custom_target(windeploy
COMMENT "Deploy everything to the output dir"
DEPENDS ${GOLDENDICT} # build this target will check if Goldendict.exe is already built
COMMAND windeployqt --no-quick-import "${GD_WIN_OUTPUT_DIR}/${GOLDENDICT}.exe" --plugindir "${GD_WIN_OUTPUT_DIR}/plugins"
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/opencc" "${GD_WIN_OUTPUT_DIR}/opencc"
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/LICENSE.txt" "${GD_WIN_OUTPUT_DIR}/LICENSE.txt"
COMMAND ${CMAKE_COMMAND} -E rm -f "${GD_WIN_OUTPUT_DIR}/goldendict.exe.manifest" "${GD_WIN_OUTPUT_DIR}/eb.dll.manifest"
WORKING_DIRECTORY ${GD_WIN_OUTPUT_DIR}
)
#TODO: use CPack to make the output folder as NSIS installer
endif ()
feature_summary(WHAT ALL DESCRIPTION "Build configuration:") feature_summary(WHAT ALL DESCRIPTION "Build configuration:")

View file

@ -31,7 +31,7 @@ target_link_libraries(${GOLDENDICT} PRIVATE ${THIRD_PARTY_LIBARY})
file(GLOB DLL_FILES LIST_DIRECTORIES false "${CMAKE_SOURCE_DIR}/winlibs/lib/msvc/*.dll") file(GLOB DLL_FILES LIST_DIRECTORIES false "${CMAKE_SOURCE_DIR}/winlibs/lib/msvc/*.dll")
foreach (A_DLL_FILE ${DLL_FILES}) foreach (A_DLL_FILE ${DLL_FILES})
get_filename_component(TEMP_VAR_HOLDING_DLL_FILENAME ${A_DLL_FILE} NAME) get_filename_component(TEMP_VAR_HOLDING_DLL_FILENAME ${A_DLL_FILE} NAME)
configure_file("${A_DLL_FILE}" "${CMAKE_BINARY_DIR}/${TEMP_VAR_HOLDING_DLL_FILENAME}" COPYONLY) configure_file("${A_DLL_FILE}" "${GD_WIN_OUTPUT_DIR}/${TEMP_VAR_HOLDING_DLL_FILENAME}" COPYONLY)
endforeach () endforeach ()
if (CMAKE_BUILD_TYPE MATCHES Debug) if (CMAKE_BUILD_TYPE MATCHES Debug)
@ -41,7 +41,7 @@ else ()
endif () endif ()
foreach (A_DLL_FILE ${DLL_FILES}) foreach (A_DLL_FILE ${DLL_FILES})
get_filename_component(TEMP_VAR_HOLDING_DLL_FILENAME ${A_DLL_FILE} NAME) get_filename_component(TEMP_VAR_HOLDING_DLL_FILENAME ${A_DLL_FILE} NAME)
configure_file("${A_DLL_FILE}" "${CMAKE_BINARY_DIR}/${TEMP_VAR_HOLDING_DLL_FILENAME}" COPYONLY) configure_file("${A_DLL_FILE}" "${GD_WIN_OUTPUT_DIR}/${TEMP_VAR_HOLDING_DLL_FILENAME}" COPYONLY)
endforeach () endforeach ()
if (WITH_EPWING_SUPPORT) if (WITH_EPWING_SUPPORT)
@ -51,5 +51,5 @@ if (WITH_EPWING_SUPPORT)
) )
target_link_libraries(${GOLDENDICT} PRIVATE eb) target_link_libraries(${GOLDENDICT} PRIVATE eb)
set_target_properties(eb PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set_target_properties(eb PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${GD_WIN_OUTPUT_DIR})
endif () endif ()

View file

@ -53,28 +53,30 @@ cmake --install ./build_dir/
Append `-D{flag_names}=ON/OFF` to cmake's config step Append `-D{flag_names}=ON/OFF` to cmake's config step
Available flags: Available flags can be found on the top of `CMakeLists.txt`
* `WITH_FFMPEG_PLAYER` "Enable support for FFMPEG player"
* `WITH_EPWING_SUPPORT` "Enable epwing support"
* `WITH_XAPIAN` "enable Xapian support"
* `WITH_ZIM` "enable zim support"
* `USE_SYSTEM_FMT` "use system fmt instead of bundled one"
* `USE_SYSTEM_TOML` "use system toml++ instead of bundled one"
### Windows ### Windows
Install Qt6(msvc) through the standard installer Install Qt6(msvc) through the standard installer and pass Qt's path to CMake
Pass those parameters to cmake, the path should be changed to your actual installation paths
``` ```
-DCMAKE_PREFIX_PATH=F:\Qt\6.4.1\msvc2019_64 -DCMAKE_PREFIX_PATH=F:\Qt\6.4.1\msvc2019_64
``` ```
The built artifacts will end up in `build_dir/goldendict`
To run the built `goldendict.exe` directly, you have to add `F:\Qt\6.5.2\msvc2019_64\bin` to your PATH environment variable
To have a redistributable goldendict (runable on someone else's computer by just copying the folder), you can build the deployment target which will copy necessary files to the folder
```
cmake --build . --target windeploy
```
The `build_dir/goldendict` will be ready to share with others.
Use`windeployqt.exe {your_build_dir}/goldendict.exe` which will copy the qt related `.dll` and other necessary files automatically. Use`windeployqt.exe {your_build_dir}/goldendict.exe` which will copy the qt related `.dll` and other necessary files automatically.
Due to the `winlibs` are built on Release mode, there are troubles to build GoldenDict on Debug mode.
### macOS ### macOS