Skip to content

Commit 50023af

Browse files
authored
build,CI: add options to build only server or client
* Add option to disable the server or client library * Add CI matrix option to disable libs Closes #672
1 parent a004c0c commit 50023af

3 files changed

Lines changed: 116 additions & 69 deletions

File tree

.github/workflows/ci.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ jobs:
1515
- "-DWITH_OPENSSL=OFF -DWITH_GNUTLS=ON -DWITH_GCRYPT=ON" # build with GnuTLS and Libgrypt
1616
- "-DWITH_OPENSSL=OFF -DWITH_GNUTLS=OFF -DWITH_GCRYPT=OFF" # build without external encryption libraries
1717
- "-DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-cross-mingw32-linux.cmake" # crosscompile with MinGW toolchain
18+
disable_libs:
19+
- "" # Build both
20+
- "-DWITH_LIBVNCSERVER=OFF" # Without the server
21+
- "-DWITH_LIBVNCCLIENT=OFF" # Without the client
1822
include:
1923
- os: macos-latest
2024
macos_cmake_options: "-DOPENSSL_ROOT_DIR=/usr/local/opt/openssl" # set this extra var for OSX
@@ -52,10 +56,10 @@ jobs:
5256
run: |
5357
mkdir build
5458
cd build
55-
cmake ${{ matrix.cmake_options }} ${{ matrix.macos_cmake_options }} ${{ matrix.windows_cmake_options }} ..
59+
cmake ${{ matrix.cmake_options }} ${{ matrix.disable_libs }} ${{ matrix.macos_cmake_options }} ${{ matrix.windows_cmake_options }} ..
5660
cmake --build .
5761
- name: Prepare Test
58-
if: ${{ matrix.os == 'ubuntu-latest' }} # only ubuntu does crosscompile with MinGW toolchain
62+
if: ${{ matrix.os == 'ubuntu-latest' && matrix.disable_libs != '-DWITH_LIBVNCSERVER=OFF' }} # only ubuntu does crosscompile with MinGW toolchain, and without vncserver we have no tests
5963
run: |
6064
cp /usr/x86_64-w64-mingw32/lib/libwinpthread-1.dll build/test/
6165
- name: Test

CMakeLists.txt

Lines changed: 108 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ include_directories(
5252

5353
# all the build configuration switches
5454
option(LIBVNCSERVER_INSTALL "Generate installation target" ON)
55+
option(WITH_LIBVNCSERVER "Build libvncserver" ON)
56+
option(WITH_LIBVNCCLIENT "Build libvncclient" ON)
5557
option(BUILD_SHARED_LIBS "Build shared libraries" ${UNIX})
5658
option(WITH_ZLIB "Search for the zlib compression library to support additional encodings" ON)
5759
option(WITH_LZO "Search for the LZO compression library to omit internal miniLZO implementation" ON)
@@ -531,36 +533,48 @@ if(LIBVNCSERVER_WITH_WEBSOCKETS)
531533
)
532534
endif(LIBVNCSERVER_WITH_WEBSOCKETS)
533535

534-
add_library(vncclient ${LIBVNCCLIENT_SOURCES})
535-
add_library(vncserver ${LIBVNCSERVER_SOURCES})
536536
if(WIN32)
537537
set(ADDITIONAL_LIBS ${ADDITIONAL_LIBS} ws2_32)
538538
if(WITH_TIGHTVNC_FILETRANSFER)
539539
add_definitions(-D_WIN32_WINNT=0x0600)
540540
endif(WITH_TIGHTVNC_FILETRANSFER)
541541
endif(WIN32)
542542

543-
target_link_libraries(vncclient
544-
${ADDITIONAL_LIBS}
545-
${ZLIB_LIBRARIES}
546-
${LZO_LIBRARIES}
547-
${JPEG_LIBRARIES}
548-
${CRYPTO_LIBRARIES}
549-
${GNUTLS_LIBRARIES}
550-
${OPENSSL_LIBRARIES}
551-
)
552-
target_link_libraries(vncserver
553-
${ADDITIONAL_LIBS}
554-
${ZLIB_LIBRARIES}
555-
${LZO_LIBRARIES}
556-
${JPEG_LIBRARIES}
557-
${PNG_LIBRARIES}
558-
${CRYPTO_LIBRARIES}
559-
${GNUTLS_LIBRARIES}
560-
${OPENSSL_LIBRARIES}
561-
)
543+
set(LIBVNCSERVER_LIBRARIES )
544+
if(WITH_LIBVNCCLIENT)
545+
add_library(vncclient ${LIBVNCCLIENT_SOURCES})
546+
target_link_libraries(vncclient
547+
${ADDITIONAL_LIBS}
548+
${ZLIB_LIBRARIES}
549+
${LZO_LIBRARIES}
550+
${JPEG_LIBRARIES}
551+
${CRYPTO_LIBRARIES}
552+
${GNUTLS_LIBRARIES}
553+
${OPENSSL_LIBRARIES}
554+
)
555+
set(LIBVNCSERVER_LIBRARIES vncclient)
556+
endif(WITH_LIBVNCCLIENT)
557+
if(WITH_LIBVNCSERVER)
558+
add_library(vncserver ${LIBVNCSERVER_SOURCES})
559+
target_link_libraries(vncserver
560+
${ADDITIONAL_LIBS}
561+
${ZLIB_LIBRARIES}
562+
${LZO_LIBRARIES}
563+
${JPEG_LIBRARIES}
564+
${PNG_LIBRARIES}
565+
${CRYPTO_LIBRARIES}
566+
${GNUTLS_LIBRARIES}
567+
${OPENSSL_LIBRARIES}
568+
)
569+
set(LIBVNCSERVER_LIBRARIES ${LIBVNCSERVER_LIBRARIES} vncserver)
570+
endif(WITH_LIBVNCSERVER)
571+
572+
# Validate that at least one of the libraries is being built
573+
if(NOT LIBVNCSERVER_LIBRARIES)
574+
message(FATAL_ERROR "Neither libvncserver nor libvncclient is being built. At least one of WITH_LIBVNCSERVER or WITH_LIBVNCCLIENT must be ON.")
575+
endif(NOT LIBVNCSERVER_LIBRARIES)
562576

563-
SET_TARGET_PROPERTIES(vncclient vncserver
577+
SET_TARGET_PROPERTIES(${LIBVNCSERVER_LIBRARIES}
564578
PROPERTIES SOVERSION "${VERSION_SO}" VERSION "${LibVNCServer_VERSION}" C_STANDARD 90
565579
)
566580

@@ -655,30 +669,34 @@ if(FFMPEG_FOUND)
655669
endif(FFMPEG_FOUND)
656670

657671
if(WITH_EXAMPLES)
658-
foreach(e ${LIBVNCSERVER_EXAMPLES})
659-
add_executable(examples_${e} ${LIBVNCSRVEXAMPLE_DIR}/${e}.c)
660-
set_target_properties(examples_${e} PROPERTIES OUTPUT_NAME ${e})
661-
set_target_properties(examples_${e} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/examples/server)
662-
target_link_libraries(examples_${e} vncserver ${CMAKE_THREAD_LIBS_INIT} ${X11_xcb_LIB} ${X11_xcb_xtest_LIB} ${X11_xcb_keysyms_LIB})
663-
endforeach(e ${LIBVNCSERVER_EXAMPLES})
664-
665-
foreach(e ${LIBVNCCLIENT_EXAMPLES})
666-
add_executable(client_examples_${e} ${LIBVNCCLIEXAMPLE_DIR}/${e}.c ${LIBVNCCLIEXAMPLE_DIR}/${${e}_EXTRA_SOURCES} )
667-
set_target_properties(client_examples_${e} PROPERTIES OUTPUT_NAME ${e})
668-
set_target_properties(client_examples_${e} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/examples/client)
669-
target_link_libraries(client_examples_${e} vncclient ${CMAKE_THREAD_LIBS_INIT} ${SDL2_LIBRARY} ${GTK2_LIBRARIES} ${FFMPEG_LIBRARIES} ${LIBSSHTUNNEL_LIBRARY})
670-
endforeach(e ${LIBVNCCLIENT_EXAMPLES})
672+
if(WITH_LIBVNCSERVER)
673+
foreach(e ${LIBVNCSERVER_EXAMPLES})
674+
add_executable(examples_${e} ${LIBVNCSRVEXAMPLE_DIR}/${e}.c)
675+
set_target_properties(examples_${e} PROPERTIES OUTPUT_NAME ${e})
676+
set_target_properties(examples_${e} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/examples/server)
677+
target_link_libraries(examples_${e} vncserver ${CMAKE_THREAD_LIBS_INIT} ${X11_xcb_LIB} ${X11_xcb_xtest_LIB} ${X11_xcb_keysyms_LIB})
678+
endforeach(e ${LIBVNCSERVER_EXAMPLES})
679+
endif(WITH_LIBVNCSERVER)
680+
681+
if(WITH_LIBVNCCLIENT)
682+
foreach(e ${LIBVNCCLIENT_EXAMPLES})
683+
add_executable(client_examples_${e} ${LIBVNCCLIEXAMPLE_DIR}/${e}.c ${LIBVNCCLIEXAMPLE_DIR}/${${e}_EXTRA_SOURCES} )
684+
set_target_properties(client_examples_${e} PROPERTIES OUTPUT_NAME ${e})
685+
set_target_properties(client_examples_${e} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/examples/client)
686+
target_link_libraries(client_examples_${e} vncclient ${CMAKE_THREAD_LIBS_INIT} ${SDL2_LIBRARY} ${GTK2_LIBRARIES} ${FFMPEG_LIBRARIES} ${LIBSSHTUNNEL_LIBRARY})
687+
endforeach(e ${LIBVNCCLIENT_EXAMPLES})
688+
endif(WITH_LIBVNCCLIENT)
671689

672690
#This example must have its own building instructions,
673691
#apart from the other examples because it is written in
674692
#C++, so it has a distinct file extension and depends on
675693
#a C++ compiler
676-
if(Qt5Widgets_FOUND AND WITH_QT AND DEFINED CMAKE_CXX_COMPILER)
694+
if(Qt5Widgets_FOUND AND WITH_QT AND DEFINED CMAKE_CXX_COMPILER AND WITH_LIBVNCCLIENT)
677695
add_executable(client_examples_qt5client ${LIBVNCCLIEXAMPLE_DIR}/qt5client.cpp ${LIBVNCCLIEXAMPLE_DIR}/${qt5client_EXTRA_SOURCES})
678696
set_target_properties(client_examples_qt5client PROPERTIES OUTPUT_NAME qt5client)
679697
set_target_properties(client_examples_qt5client PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/examples/client)
680698
target_link_libraries(client_examples_qt5client vncclient ${CMAKE_THREAD_LIBS_INIT} ${Qt5Widgets_LIBRARIES})
681-
endif(Qt5Widgets_FOUND AND WITH_QT AND DEFINED CMAKE_CXX_COMPILER)
699+
endif(Qt5Widgets_FOUND AND WITH_QT AND DEFINED CMAKE_CXX_COMPILER AND WITH_LIBVNCCLIENT)
682700
endif(WITH_EXAMPLES)
683701

684702
#
@@ -688,7 +706,7 @@ endif(WITH_EXAMPLES)
688706
if(WITH_TESTS)
689707

690708
# First fuzzing
691-
if(DEFINED ENV{LIB_FUZZING_ENGINE})
709+
if(DEFINED ENV{LIB_FUZZING_ENGINE} AND WITH_LIBVNCSERVER)
692710
add_executable(fuzz_server ${TESTS_DIR}/fuzz_server.c)
693711
target_link_libraries(fuzz_server vncserver ${CMAKE_THREAD_LIBS_INIT} $ENV{LIB_FUZZING_ENGINE})
694712
endif()
@@ -698,22 +716,28 @@ if(UNIX)
698716
endif(UNIX)
699717

700718
set(SIMPLETESTS
701-
cargstest
702-
copyrecttest
703719
)
704720

705-
if(WITH_THREADS AND (CMAKE_USE_PTHREADS_INIT OR CMAKE_USE_WIN32_THREADS_INIT))
721+
if(WITH_LIBVNCSERVER)
722+
list(APPEND SIMPLETESTS
723+
cargstest
724+
copyrecttest
725+
)
726+
endif(WITH_LIBVNCSERVER)
727+
728+
729+
if(WITH_THREADS AND (CMAKE_USE_PTHREADS_INIT OR CMAKE_USE_WIN32_THREADS_INIT) AND WITH_LIBVNCSERVER AND WITH_LIBVNCCLIENT)
706730
set(SIMPLETESTS
707731
${SIMPLETESTS}
708732
encodingstest
709733
)
710-
endif(WITH_THREADS AND (CMAKE_USE_PTHREADS_INIT OR CMAKE_USE_WIN32_THREADS_INIT))
734+
endif(WITH_THREADS AND (CMAKE_USE_PTHREADS_INIT OR CMAKE_USE_WIN32_THREADS_INIT) AND WITH_LIBVNCSERVER AND WITH_LIBVNCCLIENT)
711735

712736
foreach(t ${SIMPLETESTS})
713737
add_executable(test_${t} ${TESTS_DIR}/${t}.c)
714738
set_target_properties(test_${t} PROPERTIES OUTPUT_NAME ${t})
715739
set_target_properties(test_${t} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
716-
target_link_libraries(test_${t} vncserver vncclient ${ADDITIONAL_TEST_LIBS})
740+
target_link_libraries(test_${t} ${LIBVNCSERVER_LIBRARIES} ${ADDITIONAL_TEST_LIBS})
717741
endforeach(t ${SIMPLETESTS})
718742

719743
if(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
@@ -726,7 +750,7 @@ if(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
726750
)
727751
set_target_properties(test_tjunittest PROPERTIES OUTPUT_NAME tjunittest)
728752
set_target_properties(test_tjunittest PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
729-
target_link_libraries(test_tjunittest vncserver vncclient ${ADDITIONAL_TEST_LIBS})
753+
target_link_libraries(test_tjunittest ${LIBVNCSERVER_LIBRARIES} ${ADDITIONAL_TEST_LIBS})
730754

731755
add_executable(test_tjbench
732756
${TESTS_DIR}/tjbench.c
@@ -739,30 +763,37 @@ if(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
739763
)
740764
set_target_properties(test_tjbench PROPERTIES OUTPUT_NAME tjbench)
741765
set_target_properties(test_tjbench PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
742-
target_link_libraries(test_tjbench vncserver vncclient ${ADDITIONAL_TEST_LIBS})
766+
target_link_libraries(test_tjbench ${LIBVNCSERVER_LIBRARIES} ${ADDITIONAL_TEST_LIBS})
743767

744768
endif(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
745769

746-
if(LIBVNCSERVER_WITH_WEBSOCKETS)
770+
if(LIBVNCSERVER_WITH_WEBSOCKETS AND WITH_LIBVNCSERVER)
747771
add_executable(test_wstest
748772
${TESTS_DIR}/wstest.c
749773
${TESTS_DIR}/wstestdata.inc
750774
)
751775
set_target_properties(test_wstest PROPERTIES OUTPUT_NAME wstest)
752776
set_target_properties(test_wstest PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
753-
target_link_libraries(test_wstest vncserver vncclient ${ADDITIONAL_TEST_LIBS})
754-
endif(LIBVNCSERVER_WITH_WEBSOCKETS)
777+
target_link_libraries(test_wstest vncserver ${ADDITIONAL_TEST_LIBS})
778+
endif(LIBVNCSERVER_WITH_WEBSOCKETS AND WITH_LIBVNCSERVER)
755779

756-
add_test(NAME cargs COMMAND test_cargstest)
780+
if(WITH_LIBVNCSERVER)
781+
add_test(NAME cargs COMMAND test_cargstest)
782+
endif(WITH_LIBVNCSERVER)
757783
if(UNIX)
758-
add_test(NAME includetest COMMAND ${TESTS_DIR}/includetest.sh ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_MAKE_PROGRAM})
784+
if(WITH_LIBVNCSERVER)
785+
add_test(NAME includetest_server COMMAND ${TESTS_DIR}/includetest.sh ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_MAKE_PROGRAM} "rfb/rfb.h")
786+
endif(WITH_LIBVNCSERVER)
787+
if(WITH_LIBVNCCLIENT)
788+
add_test(NAME includetest_client COMMAND ${TESTS_DIR}/includetest.sh ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_MAKE_PROGRAM} "rfb/rfbclient.h")
789+
endif(WITH_LIBVNCCLIENT)
759790
endif(UNIX)
760791
if(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
761792
add_test(NAME turbojpeg COMMAND test_tjunittest)
762793
endif(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
763-
if(LIBVNCSERVER_WITH_WEBSOCKETS)
794+
if(LIBVNCSERVER_WITH_WEBSOCKETS AND WITH_LIBVNCSERVER)
764795
add_test(NAME wstest COMMAND test_wstest)
765-
endif(LIBVNCSERVER_WITH_WEBSOCKETS)
796+
endif(LIBVNCSERVER_WITH_WEBSOCKETS AND WITH_LIBVNCSERVER)
766797

767798
endif(WITH_TESTS)
768799

@@ -789,26 +820,39 @@ function(get_link_libraries OUT TARGET)
789820
set(${OUT} ${RESULT} PARENT_SCOPE)
790821
endfunction()
791822

792-
get_link_libraries(PRIVATE_LIBS vncserver)
793-
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/libvncserver/libvncserver.pc.cmakein ${CMAKE_CURRENT_BINARY_DIR}/libvncserver.pc @ONLY)
794-
get_link_libraries(PRIVATE_LIBS vncclient)
795-
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/libvncclient/libvncclient.pc.cmakein ${CMAKE_CURRENT_BINARY_DIR}/libvncclient.pc @ONLY)
823+
set(LIBVNCSERVER_PC_FILES )
824+
if(WITH_LIBVNCSERVER)
825+
get_link_libraries(PRIVATE_LIBS vncserver)
826+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/libvncserver/libvncserver.pc.cmakein ${CMAKE_CURRENT_BINARY_DIR}/libvncserver.pc @ONLY)
827+
list(APPEND LIBVNCSERVER_PC_FILES ${CMAKE_CURRENT_BINARY_DIR}/libvncserver.pc)
828+
endif(WITH_LIBVNCSERVER)
829+
if(WITH_LIBVNCCLIENT)
830+
get_link_libraries(PRIVATE_LIBS vncclient)
831+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/libvncclient/libvncclient.pc.cmakein ${CMAKE_CURRENT_BINARY_DIR}/libvncclient.pc @ONLY)
832+
list(APPEND LIBVNCSERVER_PC_FILES ${CMAKE_CURRENT_BINARY_DIR}/libvncclient.pc)
833+
endif(WITH_LIBVNCCLIENT)
796834

797835
if(LIBVNCSERVER_INSTALL)
798836
set(INSTALL_HEADER_FILES
799837
include/rfb/keysym.h
800838
include/rfb/threading.h
801-
include/rfb/rfb.h
802-
include/rfb/rfbclient.h
803839
${CMAKE_CURRENT_BINARY_DIR}/include/rfb/rfbconfig.h
804840
include/rfb/rfbproto.h
805841
include/rfb/rfbregion.h
806842
)
807-
808-
set_property(TARGET vncclient PROPERTY PUBLIC_HEADER ${INSTALL_HEADER_FILES})
809-
set_property(TARGET vncserver PROPERTY PUBLIC_HEADER ${INSTALL_HEADER_FILES})
843+
844+
if(WITH_LIBVNCSERVER)
845+
list(APPEND INSTALL_HEADER_FILES include/rfb/rfb.h)
846+
endif(WITH_LIBVNCSERVER)
847+
if(WITH_LIBVNCCLIENT)
848+
list(APPEND INSTALL_HEADER_FILES include/rfb/rfbclient.h)
849+
endif(WITH_LIBVNCCLIENT)
850+
851+
foreach(LIB ${LIBVNCSERVER_LIBRARIES})
852+
set_property(TARGET ${LIB} PROPERTY PUBLIC_HEADER ${INSTALL_HEADER_FILES})
853+
endforeach()
810854
if(WIN32)
811-
INSTALL(TARGETS vncclient vncserver
855+
INSTALL(TARGETS ${LIBVNCSERVER_LIBRARIES}
812856
EXPORT LibVNCServerTargets
813857
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
814858
LIBRARY DESTINATION "${CMAKE_INSTALL_BINDIR}"
@@ -817,7 +861,7 @@ if(LIBVNCSERVER_INSTALL)
817861
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
818862
)
819863
else()
820-
INSTALL(TARGETS vncclient vncserver
864+
INSTALL(TARGETS ${LIBVNCSERVER_LIBRARIES}
821865
EXPORT LibVNCServerTargets
822866
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
823867
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
@@ -852,8 +896,7 @@ if(LIBVNCSERVER_INSTALL)
852896

853897

854898
install(FILES
855-
${CMAKE_CURRENT_BINARY_DIR}/libvncserver.pc
856-
${CMAKE_CURRENT_BINARY_DIR}/libvncclient.pc
899+
${LIBVNCSERVER_PC_FILES}
857900
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
858901
)
859902
endif()

test/includetest.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
# expects install prefix like /usr as an argument
77
PREFIX=$1
88
CMAKE_MAKE_PROGRAM=$2
9+
HEADER=$3
910

1011
TMPDIR=$(mktemp -d)
1112

1213
DESTDIR="$TMPDIR" $CMAKE_MAKE_PROGRAM install
1314

1415
echo \
1516
"
16-
#include <rfb/rfb.h>
17-
#include <rfb/rfbclient.h>
17+
#include <$HEADER>
1818
1919
int main()
2020
{

0 commit comments

Comments
 (0)