Skip to content
Snippets Groups Projects
Commit c19fb112 authored by Ming Rui Zhang's avatar Ming Rui Zhang
Browse files

build: use cmake entirely for windows

GitLab: #352

Change-Id: Ib373811c9d47164954a19633fd0da389eff5aac6
parent b1d7d540
No related branches found
No related tags found
No related merge requests found
cmake_minimum_required(VERSION 3.7)
cmake_minimum_required(VERSION 3.15)
project(jami-qt)
......@@ -13,22 +13,12 @@ set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(SRC_DIR ${PROJECT_SOURCE_DIR}/src)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}
${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS})
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS})
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH true)
set(QML_RESOURCES ${PROJECT_SOURCE_DIR}/resources.qrc)
set(QML_RESOURCES_QML ${PROJECT_SOURCE_DIR}/qml.qrc)
set(QML_LIBS
Qt5::Quick
Qt5::QuickWidgets
Qt5::Network
Qt5::Svg
Qt5::QuickControls2
Qt5::WebEngine
Qt5::DBus
Qt5::Core)
# library compatibility (boost, libnotify, etc.)
add_definitions(-DQT_NO_KEYWORDS)
......@@ -69,8 +59,6 @@ set(COMMON_SOURCES
${SRC_DIR}/audiomanagerlistmodel.cpp
${SRC_DIR}/qmlregister.cpp
${SRC_DIR}/utilsadapter.cpp
${SRC_DIR}/dbuserrorhandler.cpp
${SRC_DIR}/xrectsel.c
${SRC_DIR}/moderatorlistmodel.cpp
${SRC_DIR}/screensaver.cpp
${SRC_DIR}/systemtray.cpp
......@@ -122,29 +110,156 @@ set(COMMON_HEADERS
${SRC_DIR}/quickimageproviderbase.h
${SRC_DIR}/qtutils.h
${SRC_DIR}/utilsadapter.h
${SRC_DIR}/dbuserrorhandler.h
${SRC_DIR}/xrectsel.h
${SRC_DIR}/moderatorlistmodel.h
${SRC_DIR}/screensaver.h
${SRC_DIR}/systemtray.h
${SRC_DIR}/appsettingsmanager.h
${SRC_DIR}/lrcinstance.h)
find_package(PkgConfig REQUIRED)
set(QML_LIBS
Qt5::Quick
Qt5::QuickWidgets
Qt5::Network
Qt5::Svg
Qt5::Sql
Qt5::Concurrent
Qt5::QuickControls2
Qt5::WebEngine
Qt5::Core)
pkg_check_modules(LIBNM libnm)
if(LIBNM_FOUND)
add_definitions(-DUSE_LIBNM)
endif()
set(QML_LIBS_LIST
Core
Concurrent
Quick
QuickWidgets
Network
Svg
Sql
QuickControls2
WebEngine)
if(MSVC)
# preprocessor defines
add_definitions(-DUNICODE -DQT_NO_DEBUG -DNDEBUG)
# dependencies
set(LRC ${PROJECT_SOURCE_DIR}/../lrc)
set(DRING ${PROJECT_SOURCE_DIR}/../daemon)
set(QRENCODE ${PROJECT_SOURCE_DIR}/qrencode-win32/qrencode-win32)
# compiler options
add_compile_options(/wd4068 /wd4099 /wd4189 /wd4267 /wd4577 /wd4467 /wd4715 /wd4828)
add_compile_options(/MP /GS /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /Zc:inline /fp:precise /errorReport:prompt)
add_compile_options(/Gd /Oi /MD /std:c++17 /FC /EHsc /nologo /sdl)
# linker options
add_link_options("/IGNORE:4006,4049,4078,4098" "/FORCE:MULTIPLE" "/INCREMENTAL:NO" "/DEBUG" "/LTCG" "/NODEFAULTLIB:LIBCMT")
# client deps
set(QRENCODE_LIB ${QRENCODE}/vc8/qrcodelib/x64/Release-Lib/qrcodelib.lib)
# lrc
set(LRC_SRC_PATH ${LRC}/src)
set(RINGCLIENT_STATIC_LIB ${LRC}/build/release/ringclient_static.lib)
set(QTWRAPPER_LIB ${LRC}/build/src/qtwrapper/Release/qtwrapper.lib)
# daemon
set(DRING_SRC_PATH ${DRING}/contrib/msvc/include)
set(DRING_LIB ${DRING}/build/x64/ReleaseLib_win32/bin/dring.lib)
set(GNUTLS_LIB ${DRING}/contrib/msvc/lib/x64/libgnutls.lib)
# ReleaseCompile config
if(ReleaseCompile)
message("ReleaseCompile config enabled")
add_definitions(-DCOMPILE_ONLY)
else()
# Beta config
if(BETA)
message("Beta config enabled")
add_definitions(-DBETA)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/x64/Beta)
else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/x64/Release)
endif()
endif()
include_directories(${DRING_SRC_PATH}
${LRC_SRC_PATH}
${QRENCODE})
else()
list(APPEND COMMON_SOURCES
${SRC_DIR}/xrectsel.c
${SRC_DIR}/dbuserrorhandler.cpp)
list(APPEND COMMON_HEADERS
${SRC_DIR}/dbuserrorhandler.h
${SRC_DIR}/xrectsel.h)
list(APPEND QML_LIBS Qt5::DBus)
list(APPEND QML_LIBS_LIST DBus)
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBNM libnm)
if(LIBNM_FOUND)
add_definitions(-DUSE_LIBNM)
endif()
pkg_check_modules(LIBNOTIFY libnotify>=0.7.6)
if(LIBNOTIFY_FOUND)
add_definitions(-DUSE_LIBNOTIFY)
add_definitions(${LIBNOTIFY_CFLAGS})
pkg_check_modules(LIBGDKPIXBUF gdk-pixbuf-2.0>=2.40.0)
add_definitions(${LIBGDKPIXBUF_CFLAGS})
endif()
if(NOT DEFINED LRC)
if(EXISTS ${PROJECT_SOURCE_DIR}/../install/lrc)
set(LRC ${PROJECT_SOURCE_DIR}/../install/lrc)
endif()
endif()
# If LRC is not globally installed, it's path should be specified
# by setting variable LRC. If library is not inside LRC + suffixes
# lib, build or build-local, it's path should be set with LRCLIB.
if(DEFINED LRC)
if(EXISTS ${LRC}/include/libringclient)
set(LRC_SRC_PATH ${LRC}/include/libringclient)
else()
set(LRC_SRC_PATH ${LRC}/src)
endif()
if(NOT DEFINED LRCLIB)
set(LRCLIB ${LRC})
endif()
find_library(ringclient ringclient
PATHS ${LRCLIB}
PATH_SUFFIXES lib build build-local NO_DEFAULT_PATH)
message("Will expect lrc library in ${LRCLIB} (including \
subdirs /lib, /build and /build-local)")
set(LRC_LIB_NAME ${ringclient})
else()
find_package(LibRingClient REQUIRED)
if (LibRingClient_FOUND)
set(LRC_SRC_PATH ${LIB_RING_CLIENT_INCLUDE_DIR})
set(LRC_LIB_NAME ${LIB_RING_CLIENT_LIBRARY})
else()
message("lrc not found!")
endif()
endif()
message("Will expect lrc headers in ${LRC_SRC_PATH}")
include_directories(${LRC_SRC_PATH}
${LIBNM_INCLUDE_DIRS}
${LIBNOTIFY_INCLUDE_DIRS}
${LIBGDKPIXBUF_INCLUDE_DIRS})
pkg_check_modules(LIBNOTIFY libnotify>=0.7.6)
if(LIBNOTIFY_FOUND)
add_definitions(-DUSE_LIBNOTIFY)
add_definitions(${LIBNOTIFY_CFLAGS})
pkg_check_modules(LIBGDKPIXBUF gdk-pixbuf-2.0>=2.40.0)
add_definitions(${LIBGDKPIXBUF_CFLAGS})
set(JAMI_DATA_PREFIX "${CMAKE_INSTALL_PREFIX}/share")
find_library(ringclient ringclient ${LRCLIBDIR} NO_DEFAULT_PATH)
find_library(qrencode qrencode)
find_library(X11 X11)
endif()
# Qt find package
if(QT5_VER AND QT5_PATH)
string(REPLACE "." ";" VERSION_LIST ${QT5_VER})
list(GET VERSION_LIST 0 QT5_VER_MAJOR)
......@@ -153,200 +268,214 @@ if(QT5_VER AND QT5_PATH)
if((${QT5_VER_MAJOR} GREATER_EQUAL 5) AND (${QT5_VER_MINOR} GREATER_EQUAL 14))
message(STATUS "Using custom Qt version")
find_package(Qt5 ${QT5_VER} REQUIRED COMPONENTS
Core
Quick
QuickWidgets
Network
Svg
QuickControls2
WebEngine
DBus
PATHS ${QT5_PATH} NO_DEFAULT_PATH)
find_package(Qt5LinguistTools ${QT5_VER}
PATHS ${QT5_PATH} NO_DEFAULT_PATH)
find_package(Qt5 ${QT5_VER} REQUIRED COMPONENTS ${QML_LIBS_LIST}
PATHS ${QT5_PATH} NO_DEFAULT_PATH)
find_package(Qt5LinguistTools ${QT5_VER} PATHS ${QT5_PATH} NO_DEFAULT_PATH)
endif()
else()
find_package(Qt5 REQUIRED COMPONENTS
Core
Quick
QuickWidgets
Network
Svg
QuickControls2
WebEngine
DBus)
find_package(Qt5 REQUIRED COMPONENTS ${QML_LIBS_LIST})
find_package(Qt5LinguistTools)
endif()
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH true)
if(NOT DEFINED LRC)
if(EXISTS ${PROJECT_SOURCE_DIR}/../install/lrc)
set(LRC ${PROJECT_SOURCE_DIR}/../install/lrc)
endif()
endif()
# If LRC is not globally installed, it's path should be specified
# by setting variable LRC. If library is not inside LRC + suffixes
# lib, build or build-local, it's path should be set with LRCLIB.
if(DEFINED LRC)
if(EXISTS ${LRC}/include/libringclient)
set(LRC_SRC_PATH ${LRC}/include/libringclient)
else()
set(LRC_SRC_PATH ${LRC}/src)
endif()
if(NOT DEFINED LRCLIB)
set(LRCLIB ${LRC})
endif()
find_library(ringclient ringclient
PATHS ${LRCLIB}
PATH_SUFFIXES lib build build-local NO_DEFAULT_PATH)
message("Will expect lrc library in ${LRCLIB} (including \
subdirs /lib, /build and /build-local)")
set(LRC_LIB_NAME ${ringclient})
else()
find_package(LibRingClient REQUIRED)
if (LibRingClient_FOUND)
set(LRC_SRC_PATH ${LIB_RING_CLIENT_INCLUDE_DIR})
set(LRC_LIB_NAME ${LIB_RING_CLIENT_LIBRARY})
else()
message("lrc not found!")
endif()
endif()
message("Will expect lrc headers in ${LRC_SRC_PATH}")
# common include
include_directories(${PROJECT_SOURCE_DIR}
${SRC_DIR}
${LRC_SRC_PATH}
${LIBNM_INCLUDE_DIRS}
${LIBNOTIFY_INCLUDE_DIRS}
${LIBGDKPIXBUF_INCLUDE_DIRS})
${SRC_DIR})
# common executable sources
add_executable(${PROJECT_NAME}
${SRC_DIR}/main.cpp
${COMMON_HEADERS}
${COMMON_SOURCES}
${QML_RESOURCES}
${QML_RESOURCES_QML}
${LRC_SRC_PATH}/webresource.qrc)
set(JAMI_DATA_PREFIX "${CMAKE_INSTALL_PREFIX}/share")
find_library(ringclient ringclient ${LRCLIBDIR} NO_DEFAULT_PATH)
find_library(qrencode qrencode)
find_library(X11 X11)
target_link_libraries(jami-qt
${QML_LIBS}
${LRC_LIB_NAME}
${qrencode}
${X11}
${LIBNM_LIBRARIES}
${LIBNOTIFY_LIBRARIES}
${LIBGDKPIXBUF_LIBRARIES})
if(ENABLE_TESTS)
message("Add Jami tests")
add_subdirectory(tests)
endif()
${SRC_DIR}/main.cpp
${COMMON_HEADERS}
${COMMON_SOURCES}
${QML_RESOURCES}
${QML_RESOURCES_QML}
${LRC_SRC_PATH}/webresource.qrc)
if(MSVC)
target_link_libraries(${PROJECT_NAME}
${QML_LIBS}
${QRENCODE_LIB}
Shell32.lib
Ole32.lib
Advapi32.lib
Shlwapi.lib
User32.lib
Gdi32.lib
Crypt32.lib
Strmiids.lib)
if(NOT DEFINED ReleaseCompile)
# executable icon
target_sources(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/ico.rc)
target_link_libraries(${PROJECT_NAME}
${RINGCLIENT_STATIC_LIB}
${QTWRAPPER_LIB}
${DRING_LIB}
${GNUTLS_LIB})
# translations
if(Qt5LinguistTools_FOUND)
message("Releasing and copying translation files")
file(MAKE_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE}/share/ring/translations/")
file(MAKE_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE}/share/libringclient/translations/")
file(GLOB TS_CLIENT_FILES ${PROJECT_SOURCE_DIR}/translations/*.ts)
file(GLOB TS_LRC_FILES ${LRC}/translations/*.ts)
set_source_files_properties(${TS_CLIENT_FILES} PROPERTIES OUTPUT_LOCATION
"${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE}/share/ring/translations")
set_source_files_properties(${TS_LRC_FILES} PROPERTIES OUTPUT_LOCATION
"${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE}/share/libringclient/translations")
qt5_add_translation(QM_CLIENT_FILES ${TS_CLIENT_FILES})
qt5_add_translation(QM_LRC_FILES ${TS_LRC_FILES})
target_sources(${PROJECT_NAME} PRIVATE ${QM_CLIENT_FILES})
target_sources(${PROJECT_NAME} PRIVATE ${QM_LRC_FILES})
endif()
# POST_BUILD steps
# check time stamp
set(TIME_STAMP_FILE ".deploy.stamp")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
WORKING_DIRECTORY "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
COMMAND ${CMAKE_COMMAND} -DTIME_STAMP_FILE=${TIME_STAMP_FILE}
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/time_stamp_check.cmake)
# copy runtime files and run windeployqt on target and deploy Qt libs
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
WORKING_DIRECTORY "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
COMMAND ${CMAKE_COMMAND} -DTIME_STAMP_FILE=${TIME_STAMP_FILE}
-DCOPY_TO_PATH=$<TARGET_FILE_DIR:${PROJECT_NAME}>
-DDRING_PATH=${DRING}
-DPROJECT_ROOT_DIR=${PROJECT_SOURCE_DIR}
-DWIN_DEPLOY_QT_PATH=${CMAKE_PREFIX_PATH}/bin
-DQML_SRC_DIR=${SRC_DIR}
-DEXE_NAME=$<TARGET_FILE:${PROJECT_NAME}>
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/windows_deploy.cmake)
# create time stamp
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
WORKING_DIRECTORY "$<TARGET_FILE_DIR:${PROJECT_NAME}>"
COMMAND ${CMAKE_COMMAND} -DTIME_STAMP_FILE=${TIME_STAMP_FILE}
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/time_stamp_create.cmake)
endif()
# Installation rules
install(TARGETS jami-qt
RUNTIME DESTINATION bin)
# install .desktop in XDG desktop dir so that it is recognized by the system
install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop
DESTINATION ${JAMI_DATA_PREFIX}/applications)
# install .desktop in the jami-qt data dir, so that it can be copied to the
# autostart dir by the client
install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop
DESTINATION
"${JAMI_DATA_PREFIX}/${PROJECT_NAME}"
PERMISSIONS
WORLD_READ
OWNER_WRITE
OWNER_READ
GROUP_READ
)
# adjust JAMI_DATA_PREFIX for snap package
# (this must come after all 'install' commands that refer to
# JAMI_DATA_PREFIX; the following value is not meant to be used for
# any install destinations)
if(DEFINED ENV{SNAPCRAFT_PROJECT_NAME})
set(JAMI_DATA_PREFIX "/snap/$ENV{SNAPCRAFT_PROJECT_NAME}/current/usr/share")
endif()
# executable name
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "Jami")
else()
target_link_libraries(${PROJECT_NAME}
${QML_LIBS}
${LRC_LIB_NAME}
${qrencode}
${X11}
${LIBNM_LIBRARIES}
${LIBNOTIFY_LIBRARIES}
${LIBGDKPIXBUF_LIBRARIES})
if(ENABLE_TESTS)
message("Add Jami tests")
add_subdirectory(tests)
endif()
# (this must come after the above adjustment to JAMI_DATA_PREFIX)
target_compile_definitions(jami-qt PRIVATE JAMI_INSTALL_PREFIX="${JAMI_DATA_PREFIX}")
# logos
install(FILES images/jami.svg
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps)
install(FILES images/jami-48px.png
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps
RENAME jami.png)
install(FILES images/jami-32px.xpm
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps
RENAME jami.xpm)
install(FILES jami-qt.appdata.xml
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)
# install jami launcher that selects between clients
install(
FILES
"${PROJECT_SOURCE_DIR}/src/jami"
DESTINATION
${CMAKE_INSTALL_PREFIX}/bin
PERMISSIONS
WORLD_READ
OWNER_WRITE
OWNER_READ
GROUP_READ
OWNER_EXECUTE
GROUP_EXECUTE
WORLD_EXECUTE)
# add a target to generate API documentation with Doxygen and graphviz-dot
find_package(Doxygen)
find_program(dot "dot")
if(Doxygen_FOUND AND dot)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile @ONLY)
add_custom_target(doc
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc
COMMENT "Generating API documentation with Doxygen" VERBATIM)
# create doc/README.md symlink to README since Doxygen doesn't understand file with no extension
add_custom_command(
TARGET doc
PRE_BUILD
COMMAND ln -sf ${CMAKE_CURRENT_SOURCE_DIR}/README ${CMAKE_CURRENT_SOURCE_DIR}/doc/README.md)
endif()
# Installation rules
install(TARGETS jami-qt
RUNTIME DESTINATION bin)
# install .desktop in XDG desktop dir so that it is recognized by the system
install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop
DESTINATION ${JAMI_DATA_PREFIX}/applications)
# install .desktop in the jami-qt data dir, so that it can be copied to the
# autostart dir by the client
install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop
DESTINATION
"${JAMI_DATA_PREFIX}/${PROJECT_NAME}"
PERMISSIONS
WORLD_READ
OWNER_WRITE
OWNER_READ
GROUP_READ
)
# adjust JAMI_DATA_PREFIX for snap package
# (this must come after all 'install' commands that refer to
# JAMI_DATA_PREFIX; the following value is not meant to be used for
# any install destinations)
if(DEFINED ENV{SNAPCRAFT_PROJECT_NAME})
set(JAMI_DATA_PREFIX "/snap/$ENV{SNAPCRAFT_PROJECT_NAME}/current/usr/share")
endif()
# (this must come after the above adjustment to JAMI_DATA_PREFIX)
target_compile_definitions(jami-qt PRIVATE JAMI_INSTALL_PREFIX="${JAMI_DATA_PREFIX}")
# logos
install(FILES images/jami.svg
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps)
install(FILES images/jami-48px.png
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps
RENAME jami.png)
install(FILES images/jami-32px.xpm
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps
RENAME jami.xpm)
install(FILES jami-qt.appdata.xml
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)
# install jami launcher that selects between clients
install(
FILES
"${PROJECT_SOURCE_DIR}/src/jami"
DESTINATION
${CMAKE_INSTALL_PREFIX}/bin
PERMISSIONS
WORLD_READ
OWNER_WRITE
OWNER_READ
GROUP_READ
OWNER_EXECUTE
GROUP_EXECUTE
WORLD_EXECUTE)
# add a target to generate API documentation with Doxygen and graphviz-dot
find_package(Doxygen)
find_program(dot "dot")
if(Doxygen_FOUND AND dot)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile @ONLY)
add_custom_target(doc
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc
COMMENT "Generating API documentation with Doxygen" VERBATIM)
# create doc/README.md symlink to README since Doxygen doesn't understand file with no extension
add_custom_command(
TARGET doc
PRE_BUILD
COMMAND ln -sf ${CMAKE_CURRENT_SOURCE_DIR}/README ${CMAKE_CURRENT_SOURCE_DIR}/doc/README.md)
endif()
# translations
if(Qt5LinguistTools_FOUND)
message("Releasing and copying translation files")
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/share/ring/translations/")
file(GLOB TS_FILES ${PROJECT_SOURCE_DIR}/translations/*.ts)
set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "share/ring/translations")
qt5_add_translation(QM_FILES ${TS_FILES})
add_custom_target(translations ALL DEPENDS ${QM_FILES})
install(DIRECTORY "${CMAKE_BINARY_DIR}/share/ring/translations/"
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/ring/translations)
endif()
# translations
if(Qt5LinguistTools_FOUND)
message("Releasing and copying translation files")
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/share/ring/translations/")
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/share/libringclient/translations/")
file(GLOB TS_CLIENT_FILES ${PROJECT_SOURCE_DIR}/translations/*.ts)
file(GLOB QM_LRC_FILES ${LRC}/share/libringclient/translations/*.qm)
set_source_files_properties(${TS_CLIENT_FILES} PROPERTIES OUTPUT_LOCATION "share/ring/translations")
qt5_add_translation(QM_CLIENT_FILES ${TS_CLIENT_FILES})
add_custom_target(translations_client ALL DEPENDS ${QM_CLIENT_FILES})
install(DIRECTORY "${CMAKE_BINARY_DIR}/share/ring/translations/"
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/ring/translations)
add_custom_target(translations_lrc ALL DEPENDS ${QM_LRC_FILES})
install(DIRECTORY "${LRC}/share/libringclient/translations/"
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/libringclient/translations)
endif()
# uninstall
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)
# uninstall
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()
\ No newline at end of file
execute_process(COMMAND git rev-parse HEAD
OUTPUT_VARIABLE VERSION_PATCH)
# remove leading and trailing spaces
string(STRIP "${VERSION_PATCH}" VERSION_PATCH)
message("Checking time stamp ...")
if(EXISTS ${TIME_STAMP_FILE})
file (STRINGS ${TIME_STAMP_FILE} VERSION_IN_FILE)
if(NOT "${VERSION_IN_FILE}" STREQUAL "${VERSION_PATCH}")
file (REMOVE "${TIME_STAMP_FILE}")
endif()
endif()
\ No newline at end of file
execute_process(COMMAND git rev-parse HEAD
OUTPUT_VARIABLE VERSION_PATCH)
if (EXISTS ${TIME_STAMP_FILE})
message("Keep the old time stamp")
else()
message("Creating time stamp ...")
file(WRITE ${TIME_STAMP_FILE} "${VERSION_PATCH}")
endif()
\ No newline at end of file
if (EXISTS ${TIME_STAMP_FILE})
message("No need to deploy")
else()
message("Deploying ...")
file(COPY "${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/avcodec-58.dll"
"${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/avutil-56.dll"
"${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/avformat-58.dll"
"${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/avdevice-58.dll"
"${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/swresample-3.dll"
"${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/swscale-5.dll"
"${DRING_PATH}/contrib/build/ffmpeg/Build/win32/x64/bin/avfilter-7.dll"
"${DRING_PATH}/contrib/build/openssl/libcrypto-1_1-x64.dll"
"${DRING_PATH}/contrib/build/openssl/libssl-1_1-x64.dll"
"${PROJECT_ROOT_DIR}/qt.conf"
"${PROJECT_ROOT_DIR}/images/jami.ico"
"${PROJECT_ROOT_DIR}/License.rtf"
DESTINATION ${COPY_TO_PATH})
execute_process(COMMAND "${WIN_DEPLOY_QT_PATH}/windeployqt.exe"
--verbose 1
--qmldir ${QML_SRC_DIR}
--release ${EXE_NAME})
endif()
\ No newline at end of file
import tempfile
import re
import sys
import os
import subprocess
import platform
import argparse
import shutil
import fileinput
if platform.system() == "Windows":
from colorama import init
# init ANSI escape character sequences for windows
init()
class bcolors:
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKCYAN = '\033[96m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
def execute_cmd(cmd, use_subprocess_pipe=False):
p = subprocess.Popen(cmd,
shell=True,
stdout=subprocess.PIPE if use_subprocess_pipe else sys.stdout)
output, _ = p.communicate()
if use_subprocess_pipe:
if output:
return output
return -1
else:
if p.returncode != 0:
sys.exit()
class globalVar:
# global var
system_name = platform.system()
client_dir = os.path.dirname(os.path.realpath(__file__))
mode = "Release"
qt_version = ""
qt_path = ""
daemon_path = client_dir + os.sep + '..' + os.sep + 'daemon'
lrc_path = client_dir + os.sep + '..' + os.sep + 'lrc'
output_path = ""
stamp = execute_cmd('git rev-parse HEAD', True)[0:8]
if type(stamp) is bytes:
stamp = stamp.decode("utf-8")
stampFile = client_dir + os.sep + ".deploy.stamp"
def check_stamp():
if os.path.exists(globalVar.stampFile):
with open(globalVar.stampFile) as f:
contents = f.read()
if contents.strip() == globalVar.stamp:
print(bcolors.OKGREEN + "Deployment stamp up-to-date" + bcolors.ENDC)
sys.exit()
def write_stamp():
with open(".deploy.stamp", "w") as file:
file.write(globalVar.stamp)
def setup_parameters(parsed_args):
if globalVar.system_name == "Windows":
if parsed_args.mode:
if parsed_args.mode == "Beta":
globalVar.mode = "Beta"
if parsed_args.qtVersion:
globalVar.qt_version = parsed_args.qtVersion
qt_minor_ver = int(globalVar.qt_version.split('.')[1])
if qt_minor_ver < 14:
print(bcolors.WARNING + "Qt version not supported" + bcolors.ENDC)
sys.exit()
globalVar.qt_path = "C:\\Qt\\" + globalVar.qt_version + \
("\\msvc2017_64" if qt_minor_ver < 15 else "\\msvc2019_64")
else:
globalVar.qt_path = "C:\\Qt\\5.15.0\\msvc2019_64"
else:
if parsed_args.qtPath:
globalVar.qt_path = parsed_args.qtPath
else:
globalVar.qt_version = execute_cmd('qmake -v', True)
if globalVar.qt_version == -1:
print(bcolors.WARNING + "No qmake found, trying qmake-qt5..." + bcolors.ENDC)
globalVar.qt_version = execute_cmd('qmake-qt5 -v', True)
if globalVar.qt_version == -1:
print(bcolors.FAIL + "No qmake found!" + bcolors.ENDC)
sys.exit()
if type(globalVar.qt_version) is bytes:
globalVar.qt_version = globalVar.qt_version.decode("utf-8")
globalVar.qt_version = globalVar.qt_version.split(
'Qt version')[1].split('in')[0].strip()
qt_minor_ver = int(globalVar.qt_version.split('.')[1])
if qt_minor_ver < 14:
print(bcolors.WARNING + "Qt version not supported" + bcolors.ENDC)
sys.exit()
if parsed_args.daemonPath:
globalVar.daemon_path = parsed_args.daemonPath
if parsed_args.lrcPath:
globalVar.lrc_path = parsed_args.lrcPath
if parsed_args.outputPath:
if not os.path.exists(parsed_args.outputPath):
os.makedirs(parsed_args.outputPath)
globalVar.output_path = parsed_args.outputPath
else:
if globalVar.system_name != "Windows":
globalVar.output_path = globalVar.client_dir + os.sep + 'build-local'
else:
globalVar.output_path = globalVar.client_dir + \
os.sep + "x64" + os.sep + globalVar.mode
def copy_deployment_files():
# dependency bin files and misc
files_to_copy = [
globalVar.daemon_path + "\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\avcodec-58.dll",
globalVar.daemon_path + "\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\avutil-56.dll",
globalVar.daemon_path +
"\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\avformat-58.dll",
globalVar.daemon_path +
"\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\avdevice-58.dll",
globalVar.daemon_path +
"\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\swresample-3.dll",
globalVar.daemon_path + "\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\swscale-5.dll",
globalVar.daemon_path + "\\contrib\\build\\ffmpeg\\Build\\win32\\x64\\bin\\avfilter-7.dll",
globalVar.daemon_path + "\\contrib\\build\\openssl\\libcrypto-1_1-x64.dll",
globalVar.daemon_path + "\\contrib\\build\\openssl\\libssl-1_1-x64.dll",
globalVar.client_dir + "\\qt.conf",
globalVar.client_dir + "\\images\\jami.ico",
globalVar.client_dir + "\\License.rtf"
]
for file in files_to_copy:
print(bcolors.OKBLUE + "Copying: " + file +
" -> " + globalVar.output_path + bcolors.ENDC)
if os.path.exists(file):
shutil.copy(file, globalVar.output_path)
else:
print(bcolors.FAIL + file + " does not exist" + bcolors.ENDC)
sys.exit()
# qt windeploy
win_deploy_qt = globalVar.qt_path + "\\bin\\windeployqt.exe --qmldir " + \
globalVar.client_dir + "\\src --release " + globalVar.output_path + "\\Jami.exe"
execute_cmd(win_deploy_qt)
def copy_ringtones():
# ringtones
copy_to_path = globalVar.output_path + os.sep + "ringtones"
if not os.path.exists(copy_to_path):
os.makedirs(copy_to_path)
ringtone_path = globalVar.client_dir + "\\..\\daemon\\ringtones"
print(bcolors.OKCYAN + "Copying ringtones..." + bcolors.ENDC)
for _, _, files in os.walk(ringtone_path):
for file in files:
print(bcolors.OKBLUE + "Copying ringtone: " +
file + " -> " + copy_to_path + bcolors.ENDC)
try:
shutil.copy(ringtone_path + os.sep + file, copy_to_path)
except:
print(bcolors.FAIL + "Unable to copy file." + bcolors.ENDC)
def compile_and_copy_web_resources():
# web resources
rcc = 'rcc'
if globalVar.qt_path:
rcc = globalVar.qt_path + os.sep + 'bin' + os.sep + \
'rcc' + ('.exe' if globalVar.system_name == "Windows" else '')
if execute_cmd(rcc + ' -v', True) == -1:
print(bcolors.WARNING + "No rcc found, trying rcc-qt5..." + bcolors.ENDC)
rcc = rcc.replace('rcc', 'rcc-qt5')
if execute_cmd(rcc + ' -v', True) == -1:
print(bcolors.FAIL + "No rcc found!" + bcolors.ENDC)
sys.exit()
lrc_web_resources_path = globalVar.lrc_path + os.sep + "src" + os.sep + 'webresource.qrc'
execute_cmd(rcc + ' -binary ' + lrc_web_resources_path +
' -o ' + globalVar.output_path + os.sep + 'webresource.rcc')
def release_and_copy_translations():
# translations binary
lrelease = 'lrelease'
if globalVar.qt_path:
lrelease = globalVar.qt_path + os.sep + 'bin' + os.sep + \
'lrelease' + ('.exe' if globalVar.system_name == "Windows" else '')
if execute_cmd(lrelease + ' -version', True) == -1:
print(bcolors.WARNING + "No lrelease found, trying lrelease-qt5..." + bcolors.ENDC)
lrelease = lrelease.replace('lrelease', 'lrelease-qt5')
if execute_cmd(lrelease + ' -version', True) == -1:
print(bcolors.FAIL + "No lrelease found!" + bcolors.ENDC)
sys.exit()
qt_version_check = execute_cmd(lrelease + ' -version', True)
if type(qt_version_check) is bytes:
qt_version_check = qt_version_check.decode("utf-8")
qt_version_check = qt_version_check.split('version')[1].strip()
qt_minor_ver = int(qt_version_check.split('.')[1])
if qt_minor_ver < 14:
print(bcolors.WARNING + "Qt version not supported" + bcolors.ENDC)
sys.exit()
# lrc translations
lrc_ts_path = globalVar.lrc_path + os.sep + 'translations'
copy_to_path = globalVar.output_path + os.sep + 'share' + \
os.sep + 'libringclient' + os.sep + 'translations'
if not os.path.exists(copy_to_path):
os.makedirs(copy_to_path)
print(bcolors.OKCYAN + "Release lrc translations..." + bcolors.ENDC)
for _, _, files in os.walk(lrc_ts_path):
for file in files:
if file.endswith(".ts"):
execute_cmd(lrelease + " " + lrc_ts_path + os.sep + file)
for _, _, files in os.walk(lrc_ts_path):
for file in files:
if file.endswith(".qm"):
print(bcolors.OKBLUE + "Copying translation file: " +
file + " -> " + copy_to_path + bcolors.ENDC)
shutil.copy(lrc_ts_path + os.sep + file, copy_to_path)
# client translations
client_ts_path = globalVar.client_dir + os.sep + 'translations'
copy_to_path = globalVar.output_path + os.sep + \
'share' + os.sep + 'ring' + os.sep + 'translations'
if not os.path.exists(copy_to_path):
os.makedirs(copy_to_path)
print(bcolors.OKCYAN + "Release client translations..." + bcolors.ENDC)
for _, _, files in os.walk(client_ts_path):
for file in files:
if file.endswith(".ts"):
execute_cmd(lrelease + " " +
client_ts_path + os.sep + file)
for _, _, files in os.walk(client_ts_path):
for file in files:
if file.endswith(".qm"):
print(bcolors.OKBLUE + "Copying translation file: " +
file + " -> " + copy_to_path + bcolors.ENDC)
shutil.copy(client_ts_path + os.sep + file, copy_to_path)
def parse_args():
ap = argparse.ArgumentParser(description="Copy runtime files tool")
if globalVar.system_name != "Windows":
ap.add_argument(
'-q', '--qtPath', default='',
help='Qt path')
else:
ap.add_argument(
'-m', '--mode', default='',
help='Release or Beta mode')
ap.add_argument(
'-q', '--qtVersion', default='',
help='Qt version')
ap.add_argument(
'-d', '--daemonPath', default='',
help='Daemon path')
ap.add_argument(
'-l', '--lrcPath', default='',
help='Lrc path')
ap.add_argument(
'-o', '--outputPath', default='',
help='Output path')
parsed_args = ap.parse_args()
return parsed_args
def main():
# check stamp
check_stamp()
# parse args
parsed_args = parse_args()
# set up global var
setup_parameters(parsed_args)
print(bcolors.OKCYAN + "****************************************" + bcolors.ENDC)
print(bcolors.OKBLUE + "copying deployment files..." + bcolors.ENDC)
print(bcolors.OKBLUE + "using daemonDir: " +
globalVar.daemon_path + bcolors.ENDC)
print(bcolors.OKBLUE + "using lrcDir: " +
globalVar.lrc_path + bcolors.ENDC)
if globalVar.qt_path:
print(bcolors.OKBLUE + "using QtDir: " +
globalVar.qt_path + bcolors.ENDC)
else:
print(bcolors.OKBLUE + "using system Qt" + bcolors.ENDC)
if globalVar.system_name == "Windows":
print(bcolors.OKBLUE + globalVar.mode + " mode" + bcolors.ENDC)
print(bcolors.OKCYAN + "****************************************" + bcolors.ENDC)
# deployment
if globalVar.system_name == "Windows":
copy_deployment_files()
copy_ringtones()
# translations
release_and_copy_translations()
# web resources
compile_and_copy_web_resources()
# write stamp
write_stamp()
print(bcolors.OKGREEN + "Copy completed" + bcolors.ENDC)
if __name__ == '__main__':
main()
win32-msvc {
TARGET = Jami
TEMPLATE = app
QT += core winextras qml quickcontrols2 quick xml multimedia network webengine svg sql
CONFIG += suppress_vcproj_warnings c++17 qtquickcompiler
# library compatibility (boost, libnotify, etc.)
CONFIG += no_keywords
QTQUICK_COMPILER_SKIPPED_RESOURCES += resources.qrc
# compiler options
QMAKE_CXXFLAGS += /wd"4068" /wd"4099" /wd"4189" /wd"4267" /wd"4577" /wd"4467" /wd"4715" /wd"4828"
QMAKE_CXXFLAGS += /MP /GS /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /Zc:inline /fp:precise /errorReport:prompt
QMAKE_CXXFLAGS += /Gd /Oi /MD /std:c++17 /FC /EHsc /nologo /sdl
# linker options
QMAKE_LFLAGS+= /ignore:4006,4049,4078,4098 /FORCE:MULTIPLE /INCREMENTAL:NO /Debug /LTCG /NODEFAULTLIB:LIBCMT
# preprocessor defines
DEFINES += UNICODE QT_NO_DEBUG NDEBUG
# dependencies
LRC= ../lrc
DRING= ../daemon
QRENCODE= $$PWD/qrencode-win32/qrencode-win32
# client deps
INCLUDEPATH += $${QRENCODE}
LIBS += $${QRENCODE}/vc8/qrcodelib/x64/Release-Lib/qrcodelib.lib
# lrc
INCLUDEPATH += $${LRC}/src/
LIBS += $${LRC}/build/release/ringclient_static.lib
LIBS += $${LRC}/build/src/qtwrapper/Release/qtwrapper.lib
# daemon
INCLUDEPATH += ../daemon/contrib/msvc/include/
LIBS += $${DRING}/build/x64/ReleaseLib_win32/bin/dring.lib
LIBS += $${DRING}/contrib/msvc/lib/x64/libgnutls.lib
# windows system libs
LIBS += Shell32.lib Ole32.lib Advapi32.lib Shlwapi.lib User32.lib Gdi32.lib Crypt32.lib Strmiids.lib
# output paths
OBJECTS_DIR = obj/.obj
MOC_DIR = obj/.moc
RCC_DIR = obj/.rcc
UI_DIR = obj/.ui
MODE = "Release"
# ReleaseCompile config
contains(CONFIG, ReleaseCompile) {
MODE = "ReleaseCompile"
CONFIG(ReleaseCompile) {
message(ReleaseCompile config enabled)
Release: DEFINES += COMPILE_ONLY
}
}
# beta config
contains(CONFIG, Beta) {
MODE = "Beta"
CONFIG(Beta) {
message(Beta config enabled)
Release: DESTDIR = x64/Beta
Release: DEFINES += BETA
}
} else {
Release: DESTDIR = x64/Release
}
Debug: DESTDIR = x64/Debug
# qt dir
QMAKE_INCDIR_QT=$(QTDIR)\include
QMAKE_LIBDIR=$(QTDIR)\lib
QMAKE_MOC=$(QTDIR)\bin\moc.exe
QMAKE_QMAKE=$(QTDIR)\bin\qmake.exe
# exe icons
Release: RC_FILE = ico.rc
# run the deployment script(run windeployqt)
!equals(MODE, "ReleaseCompile") {
QMAKE_POST_LINK += $$quote(python .\copy-runtime-files.py -m $${MODE} -q $${QT_VERSION} -o $${DESTDIR})
}
}
# Input
HEADERS += \
src/abstractitemmodelbase.h \
src/avatarimageprovider.h \
src/moderatorlistmodel.h \
src/networkmanager.h \
src/quickimageproviderbase.h \
src/screensaver.h \
src/smartlistmodel.h \
src/updatemanager.h \
src/utils.h \
src/bannedlistmodel.h \
src/version.h \
src/accountlistmodel.h \
src/runguard.h \
src/webchathelpers.h \
src/rendermanager.h \
src/connectivitymonitor.h \
src/jamiavatartheme.h \
src/mainapplication.h \
src/qrimageprovider.h \
src/messagesadapter.h \
src/accountadapter.h \
src/tintedbuttonimageprovider.h \
src/calladapter.h \
src/conversationsadapter.h \
src/distantrenderer.h \
src/previewrenderer.h \
src/qmladapterbase.h \
src/avadapter.h \
src/contactadapter.h \
src/pluginadapter.h \
src/settingsadapter.h \
src/deviceitemlistmodel.h \
src/pluginitemlistmodel.h \
src/pluginhandleritemlistmodel.h \
src/preferenceitemlistmodel.h \
src/mediacodeclistmodel.h \
src/accountstomigratelistmodel.h \
src/audiodevicemodel.h \
src/videoinputdevicemodel.h \
src/pluginlistpreferencemodel.h \
src/videoformatfpsmodel.h \
src/videoformatresolutionmodel.h \
src/audiomanagerlistmodel.h \
src/qmlregister.h \
src/qtutils.h \
src/utilsadapter.h \
src/systemtray.h \
src/appsettingsmanager.h \
src/lrcinstance.h
SOURCES += \
src/bannedlistmodel.cpp \
src/accountlistmodel.cpp \
src/moderatorlistmodel.cpp \
src/networkmanager.cpp \
src/runguard.cpp \
src/screensaver.cpp \
src/updatemanager.cpp \
src/webchathelpers.cpp \
src/main.cpp \
src/smartlistmodel.cpp \
src/utils.cpp \
src/rendermanager.cpp \
src/connectivitymonitor.cpp \
src/mainapplication.cpp \
src/messagesadapter.cpp \
src/accountadapter.cpp \
src/calladapter.cpp \
src/conversationsadapter.cpp \
src/distantrenderer.cpp \
src/previewrenderer.cpp \
src/avadapter.cpp \
src/contactadapter.cpp \
src/pluginadapter.cpp \
src/settingsadapter.cpp \
src/deviceitemlistmodel.cpp \
src/pluginitemlistmodel.cpp \
src/pluginhandleritemlistmodel.cpp \
src/preferenceitemlistmodel.cpp \
src/mediacodeclistmodel.cpp \
src/accountstomigratelistmodel.cpp \
src/audiodevicemodel.cpp \
src/videoinputdevicemodel.cpp \
src/pluginlistpreferencemodel.cpp \
src/videoformatfpsmodel.cpp \
src/videoformatresolutionmodel.cpp \
src/audiomanagerlistmodel.cpp \
src/qmlregister.cpp \
src/utilsadapter.cpp \
src/systemtray.cpp \
src/appsettingsmanager.cpp \
src/lrcinstance.cpp
RESOURCES += \
resources.qrc \
qml.qrc
This diff is collapsed.
......@@ -19,6 +19,8 @@ vs_where_path = os.path.join(
)
host_is_64bit = (False, True)[platform.machine().endswith('64')]
this_dir = os.path.dirname(os.path.realpath(__file__))
build_dir = this_dir + '\\build'
class QtVerison(Enum):
Major = 0
......@@ -50,6 +52,11 @@ def getLatestVSVersion():
else:
return
def getCMakeGenerator(vs_version):
if vs_version == '15':
return 'Visual Studio 15 2017 Win64'
else:
return 'Visual Studio ' + vs_version + ' 2019'
def findVSLatestDir():
args = [
......@@ -66,7 +73,6 @@ def findVSLatestDir():
else:
return
def getQtVersionNumber(qt_version, version_type):
version_list = qt_version.split('.')
return version_list[version_type.value]
......@@ -77,6 +83,18 @@ def findMSBuild():
if filename in files:
return os.path.join(root, filename)
def getMSBuildArgs(arch, config_str, configuration_type, toolset):
msbuild_args = [
'/nologo',
'/verbosity:minimal',
'/maxcpucount:' + str(multiprocessing.cpu_count()),
'/p:Platform=' + arch,
'/p:Configuration=' + config_str,
'/p:ConfigurationType=' + configuration_type,
'/p:useenv=true']
if (toolset != ''):
msbuild_args.append('/p:PlatformToolset=' + toolset)
return msbuild_args
def getVSEnv(arch='x64', platform='', version=''):
env_cmd = 'set path=%path:"=% && ' + \
......@@ -137,8 +155,19 @@ def deps(arch, toolset, qtver):
sys.exit(1)
print('Building qrcodelib')
build(arch, '', '', 'Release-Lib',
'\\qrencode-win32\\qrencode-win32\\vc8\\qrcodelib\\qrcodelib.vcxproj', qtver, False)
vs_env_vars = {}
vs_env_vars.update(getVSEnv())
msbuild = findMSBuild()
if not os.path.isfile(msbuild):
raise IOError('msbuild.exe not found. path=' + msbuild)
msbuild_args = getMSBuildArgs(arch, 'Release-Lib', 'StaticLibrary', toolset)
this_dir = os.path.dirname(os.path.realpath(__file__))
proj_path = this_dir + '\\qrencode-win32\\qrencode-win32\\vc8\\qrcodelib\\qrcodelib.vcxproj'
build_project(msbuild, msbuild_args, proj_path, vs_env_vars)
def build(arch, toolset, sdk_version, config_str, project_path_under_current_path, qtver, force_option=True):
......@@ -146,30 +175,56 @@ def build(arch, toolset, sdk_version, config_str, project_path_under_current_pat
configuration_type = 'StaticLibrary'
qt_minor_version = getQtVersionNumber(qtver, QtVerison.Minor)
qtFolderDir = 'msvc2017_64' if int(qt_minor_version) <= 14 else 'msvc2019_64'
vs_env_vars = {}
vs_env_vars.update(getVSEnv())
qmake_cmd = "C:\\Qt\\" + qtver + "\\" + qtFolderDir + "\\bin\\qmake.exe"
qt_dir = 'C:\\Qt\\' + qtver
cmake_gen = getCMakeGenerator(getLatestVSVersion())
qt_minor_version = getQtVersionNumber(qtver, QtVerison.Minor)
msvc_folder = '\\msvc2017_64' if int(qt_minor_version) <= 14 else '\\msvc2019_64'
qt_cmake_dir = qt_dir + msvc_folder + '\\lib\\cmake\\'
cmake_prefix_path = qt_dir + msvc_folder
cmake_options = [
'-DCMAKE_PREFIX_PATH=' + cmake_prefix_path,
'-DQt5_DIR=' + qt_cmake_dir + 'Qt5',
'-DQt5Core_DIR=' + qt_cmake_dir + 'Qt5Core',
'-DQt5Sql_DIR=' + qt_cmake_dir + 'Qt5Sql',
'-DQt5LinguistTools_DIR=' + qt_cmake_dir + 'Qt5LinguistTools',
'-DQt5Concurrent_DIR=' + qt_cmake_dir + 'Qt5Concurrent',
'-DQt5Gui_DIR=' + qt_cmake_dir + 'Qt5Gui',
'-DCMAKE_SYSTEM_VERSION=' + sdk_version
]
if not os.path.exists(build_dir):
os.makedirs(build_dir)
os.chdir(build_dir)
if (config_str == 'Release'):
print('Generating project using qmake ' + config_str + '|' + arch)
if(execute_cmd(qmake_cmd + " -tp vc jami-qt.pro -o jami-qt.vcxproj", False, vs_env_vars)):
print("Qmake vcxproj file generate error")
print('Generating project using cmake ' + config_str + '|' + arch)
cmd = ['cmake', '..', '-G', cmake_gen]
cmd.extend(cmake_options)
if(execute_cmd(cmd, False, vs_env_vars)):
print("Cmake vcxproj file generate error")
sys.exit(1)
configuration_type = 'Application'
elif (config_str == 'Beta'):
print('Generating project using qmake ' + config_str + '|' + arch)
if(execute_cmd(qmake_cmd + " -tp vc jami-qt.pro -o jami-qt.vcxproj CONFIG+=Beta", False, vs_env_vars)):
print("Beta: Qmake vcxproj file generate error")
print('Generating project using cmake ' + config_str + '|' + arch)
cmake_options.append('-DBETA=1')
cmd = ['cmake', '..', '-G', cmake_gen]
cmd.extend(cmake_options)
if(execute_cmd(cmd, False, vs_env_vars)):
print("Beta: Cmake vcxproj file generate error")
sys.exit(1)
config_str = 'Release'
configuration_type = 'Application'
elif (config_str == 'ReleaseCompile'):
print('Generating project using qmake ' + config_str + '|' + arch)
if(execute_cmd(qmake_cmd + " -tp vc jami-qt.pro -o jami-qt.vcxproj CONFIG+=ReleaseCompile", False, vs_env_vars)):
print("ReleaseCompile: Qmake vcxproj file generate error")
cmake_options.append('-DReleaseCompile=1')
cmd = ['cmake', '..', '-G', cmake_gen]
cmd.extend(cmake_options)
if(execute_cmd(cmd, False, vs_env_vars)):
print("ReleaseCompile: Cmake vcxproj file generate error")
sys.exit(1)
config_str = 'Release'
......@@ -177,22 +232,13 @@ def build(arch, toolset, sdk_version, config_str, project_path_under_current_pat
# but will be outputted into x64/Beta folder (for Beta Only)
print('Building projects in ' + config_str + '|' + arch)
this_dir = os.path.dirname(os.path.realpath(__file__))
qt_client_proj_path = this_dir + project_path_under_current_path
qt_client_proj_path = build_dir + project_path_under_current_path
msbuild = findMSBuild()
if not os.path.isfile(msbuild):
raise IOError('msbuild.exe not found. path=' + msbuild)
msbuild_args = [
'/nologo',
'/verbosity:minimal',
'/maxcpucount:' + str(multiprocessing.cpu_count()),
'/p:Platform=' + arch,
'/p:Configuration=' + config_str,
'/p:ConfigurationType=' + configuration_type,
'/p:useenv=true']
if (toolset != ''):
msbuild_args.append('/p:PlatformToolset=' + toolset)
msbuild_args = getMSBuildArgs(arch, config_str, configuration_type, toolset)
if (force_option):
# force toolset
replace_vs_prop(qt_client_proj_path,
......
......@@ -43,7 +43,7 @@ public:
*/
QPair<QrType, QString> getIndexFromID(const QString& id)
{
auto list = id.split('_', QString::SplitBehavior::SkipEmptyParts);
auto list = id.split('_', Qt::SkipEmptyParts);
if (list.size() < 2)
return {QrType::Account, ""};
if (list.contains("account") && list.size() > 1) {
......
......@@ -298,7 +298,7 @@ SmartListModel::getConversationItemData(const conversation::Info& item,
case Role::LastInteractionDate: {
if (!item.interactions.empty()) {
auto& date = item.interactions.at(item.lastMessageUid).timestamp;
return QVariant(QString::fromStdString(Utils::formatTimeString(date)));
return QVariant(Utils::formatTimeString(date));
}
return QVariant("");
}
......
......@@ -40,7 +40,7 @@ public:
QColor tintedColor;
auto list = id.split('+', QString::SkipEmptyParts);
auto list = id.split('+', Qt::SkipEmptyParts);
if (list.size() == 2) {
QPixmap pixmapToSend(":/images/icons/" + list[0]);
......
......@@ -36,7 +36,7 @@
#include <QPainter>
#include <QPropertyAnimation>
#include <QScreen>
#include <QStackedWidget>
#include <QDateTime>
#include <QSvgRenderer>
#include <QTranslator>
#include <QtConcurrent/QtConcurrent>
......@@ -496,21 +496,16 @@ Utils::profileType(const lrc::api::conversation::Info& conv,
}
}
// TODO: use Qt for this
std::string
Utils::formatTimeString(const std::time_t& timestamp)
QString
Utils::formatTimeString(const std::time_t& timeStamp)
{
std::time_t now = std::time(nullptr);
char interactionDay[64];
char nowDay[64];
std::strftime(interactionDay, sizeof(interactionDay), "%D", std::localtime(&timestamp));
std::strftime(nowDay, sizeof(nowDay), "%D", std::localtime(&now));
if (std::string(interactionDay) == std::string(nowDay)) {
char interactionTime[64];
std::strftime(interactionTime, sizeof(interactionTime), "%R", std::localtime(&timestamp));
return interactionTime;
auto currentTimeStamp = QDateTime::fromSecsSinceEpoch(timeStamp);
auto now = QDateTime::currentDateTime();
auto timeStampDMY = currentTimeStamp.toString("dd/MM/yyyy");
if (timeStampDMY == now.toString("dd/MM/yyyy")) {
return currentTimeStamp.toString("hh:mm");
} else {
return interactionDay;
return timeStampDMY;
}
}
......
......@@ -74,7 +74,7 @@ void removeOldVersions();
// LRC helpers
lrc::api::profile::Type profileType(const lrc::api::conversation::Info& conv,
const lrc::api::ConversationModel& model);
std::string formatTimeString(const std::time_t& timestamp);
QString formatTimeString(const std::time_t& timeStamp);
bool isInteractionGenerated(const lrc::api::interaction::Type& interaction);
bool isContactValid(const QString& contactUid, const lrc::api::ConversationModel& model);
bool getReplyMessageBox(QWidget* widget, const QString& title, const QString& text);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment