cmake_minimum_required(VERSION 3.0) if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.15") # this is for MSVC_RUNTIME_LIBRARY property below cmake_policy(SET CMP0091 NEW) endif() project(vdagent-win) if(NOT MSVC) set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") endif() # configure file(WRITE "${CMAKE_BINARY_DIR}/config.h.in" "/* Automatic generated by CMake */\n\n") macro(config_write str) file(APPEND "${CMAKE_BINARY_DIR}/config.h.in" "${str}") endmacro() string(TIMESTAMP BUILD_YEAR "%Y") config_write("#define BUILD_YEAR \"${BUILD_YEAR}\"\n") if(EXISTS "${CMAKE_SOURCE_DIR}/.tarball-version") file(STRINGS "${CMAKE_SOURCE_DIR}/.tarball-version" VER) list(GET VER 0 VER) set(VER "v${VER}") else() find_package(Git) if(GIT_FOUND) execute_process( COMMAND ${GIT_EXECUTABLE} describe --abbrev=4 --match=v* HEAD WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_VARIABLE VER ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) else() message(FATAL_ERROR "GIT not found") endif() endif() if("${VER}" MATCHES "^v([0-9]+)\\.([0-9]+)\\.([0-9]+)") set(RC_PRODUCTVERSION "${CMAKE_MATCH_1}, ${CMAKE_MATCH_2}, ${CMAKE_MATCH_3}, 0") else() message(FATAL_ERROR "wrong VERSION format ${VER}") endif() config_write("#define RC_PRODUCTVERSION ${RC_PRODUCTVERSION}\n") config_write("#define RC_PRODUCTVERSION_STR \"${RC_PRODUCTVERSION}\"\n") configure_file(${CMAKE_BINARY_DIR}/config.h.in ${CMAKE_BINARY_DIR}/config.h) if(MSVC) if(${CMAKE_VERSION} VERSION_LESS "3.15") # compile MSVCRT into executable (link it statically) foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) if(${flag_var} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") endif(${flag_var} MATCHES "/MD") endforeach(flag_var) endif() # generate PDB files # see https://stackoverflow.com/questions/28178978/how-to-generate-pdb-files-for-release-build-with-cmake-flags/31264946 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF" CACHE STRING "" FORCE) # find using vcpkg packages find_package(libpng CONFIG REQUIRED) find_path(PNG_INCLUDE_DIR NAMES png.h) set(PNG_LIBRARY png_static) set(ZLIB_LIBRARY) set(COMMSUPPW_LIBRARY comsuppw) else(MSVC) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -s") find_package(PNG REQUIRED) set(COMMSUPPW_LIBRARY) endif(MSVC) include_directories(common ${CMAKE_BINARY_DIR} spice-protocol spice-common ${PNG_INCLUDE_DIR}) add_definitions(-DUNICODE -D_UNICODE -DOLDMSVCRT -DWINVER=0x0601) add_executable(vdagent WIN32 common/vdcommon.cpp common/vdcommon.h common/vdlog.cpp common/vdlog.h vdagent/display_configuration.cpp vdagent/display_configuration.h vdagent/desktop_layout.cpp vdagent/desktop_layout.h vdagent/display_setting.cpp vdagent/display_setting.h vdagent/file_xfer.cpp vdagent/file_xfer.h vdagent/vdagent.cpp spice-common/common/agent.c vdagent/as_user.cpp vdagent/as_user.h vdagent/image.cpp vdagent/image.h vdagent/imagepng.cpp vdagent/imagepng.h vdagent/shell.cpp vdagent/shell.h vdagent/vdagent.rc ) target_link_libraries(vdagent ${PNG_LIBRARY} ${ZLIB_LIBRARY} wtsapi32 uuid ole32 oleaut32 mpr shlwapi ${COMMSUPPW_LIBRARY} ) add_executable(vdservice common/stdint.h common/vdcommon.cpp common/vdcommon.h common/vdlog.cpp common/vdlog.h vdservice/vdservice.cpp vdservice/vdservice.rc ) target_link_libraries(vdservice wtsapi32 ) enable_testing() add_custom_target(check COMMAND ctest -C $) if(CMAKE_CROSSCOMPILING) set(CMAKE_CROSSCOMPILING_EMULATOR wine) endif() add_executable(imagetest EXCLUDE_FROM_ALL common/vdcommon.cpp common/vdcommon.h common/vdlog.cpp common/vdlog.h vdagent/imagetest.cpp vdagent/image.cpp vdagent/image.h vdagent/imagepng.cpp vdagent/imagepng.h ) target_link_libraries(imagetest ${PNG_LIBRARY} ${ZLIB_LIBRARY} wtsapi32 ) add_test(NAME test-png COMMAND bash "${CMAKE_SOURCE_DIR}/test-png") add_executable(test-log EXCLUDE_FROM_ALL common/vdcommon.cpp common/vdcommon.h common/vdlog.cpp common/vdlog.h common/test-log.cpp ) add_test(NAME test-log COMMAND test-log) add_executable(test-shell EXCLUDE_FROM_ALL vdagent/test-shell.cpp ) target_link_libraries(test-shell uuid ole32 oleaut32 ${COMMSUPPW_LIBRARY} ) add_test(NAME test-shell COMMAND test-shell) add_dependencies(check test-log test-shell imagetest) if(MSVC) # select static CRT without debugging (/MT option) if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.15") set_property(TARGET vdagent vdservice imagetest PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") endif() endif() set_property(TARGET vdagent vdservice imagetest PROPERTY LINK_SEARCH_START_STATIC ON) set_property(TARGET vdagent vdservice imagetest PROPERTY LINK_SEARCH_END_STATIC ON) install(TARGETS vdagent vdservice)