Skip to content

Commit 363871e

Browse files
learn-morebk138
authored andcommitted
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 c81c7bd commit 363871e

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)
@@ -532,36 +534,48 @@ if(LIBVNCSERVER_WITH_WEBSOCKETS)
532534
)
533535
endif(LIBVNCSERVER_WITH_WEBSOCKETS)
534536

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

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

564-
SET_TARGET_PROPERTIES(vncclient vncserver
578+
SET_TARGET_PROPERTIES(${LIBVNCSERVER_LIBRARIES}
565579
PROPERTIES SOVERSION "${VERSION_SO}" VERSION "${LibVNCServer_VERSION}" C_STANDARD 90
566580
)
567581

@@ -657,30 +671,34 @@ if(FFMPEG_FOUND)
657671
endif(FFMPEG_FOUND)
658672

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

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

686704
#
@@ -690,7 +708,7 @@ endif(WITH_EXAMPLES)
690708
if(WITH_TESTS)
691709

692710
# First fuzzing
693-
if(DEFINED ENV{LIB_FUZZING_ENGINE})
711+
if(DEFINED ENV{LIB_FUZZING_ENGINE} AND WITH_LIBVNCSERVER)
694712
add_executable(fuzz_server ${TESTS_DIR}/fuzz_server.c)
695713
target_link_libraries(fuzz_server vncserver ${CMAKE_THREAD_LIBS_INIT} $ENV{LIB_FUZZING_ENGINE})
696714
endif()
@@ -700,22 +718,28 @@ if(UNIX)
700718
endif(UNIX)
701719

702720
set(SIMPLETESTS
703-
cargstest
704-
copyrecttest
705721
)
706722

707-
if(WITH_THREADS AND (CMAKE_USE_PTHREADS_INIT OR CMAKE_USE_WIN32_THREADS_INIT))
723+
if(WITH_LIBVNCSERVER)
724+
list(APPEND SIMPLETESTS
725+
cargstest
726+
copyrecttest
727+
)
728+
endif(WITH_LIBVNCSERVER)
729+
730+
731+
if(WITH_THREADS AND (CMAKE_USE_PTHREADS_INIT OR CMAKE_USE_WIN32_THREADS_INIT) AND WITH_LIBVNCSERVER AND WITH_LIBVNCCLIENT)
708732
set(SIMPLETESTS
709733
${SIMPLETESTS}
710734
encodingstest
711735
)
712-
endif(WITH_THREADS AND (CMAKE_USE_PTHREADS_INIT OR CMAKE_USE_WIN32_THREADS_INIT))
736+
endif(WITH_THREADS AND (CMAKE_USE_PTHREADS_INIT OR CMAKE_USE_WIN32_THREADS_INIT) AND WITH_LIBVNCSERVER AND WITH_LIBVNCCLIENT)
713737

714738
foreach(t ${SIMPLETESTS})
715739
add_executable(test_${t} ${TESTS_DIR}/${t}.c)
716740
set_target_properties(test_${t} PROPERTIES OUTPUT_NAME ${t})
717741
set_target_properties(test_${t} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
718-
target_link_libraries(test_${t} vncserver vncclient ${ADDITIONAL_TEST_LIBS})
742+
target_link_libraries(test_${t} ${LIBVNCSERVER_LIBRARIES} ${ADDITIONAL_TEST_LIBS})
719743
endforeach(t ${SIMPLETESTS})
720744

721745
if(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
@@ -728,7 +752,7 @@ if(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
728752
)
729753
set_target_properties(test_tjunittest PROPERTIES OUTPUT_NAME tjunittest)
730754
set_target_properties(test_tjunittest PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
731-
target_link_libraries(test_tjunittest vncserver vncclient ${ADDITIONAL_TEST_LIBS})
755+
target_link_libraries(test_tjunittest ${LIBVNCSERVER_LIBRARIES} ${ADDITIONAL_TEST_LIBS})
732756

733757
add_executable(test_tjbench
734758
${TESTS_DIR}/tjbench.c
@@ -741,30 +765,37 @@ if(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
741765
)
742766
set_target_properties(test_tjbench PROPERTIES OUTPUT_NAME tjbench)
743767
set_target_properties(test_tjbench PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
744-
target_link_libraries(test_tjbench vncserver vncclient ${ADDITIONAL_TEST_LIBS})
768+
target_link_libraries(test_tjbench ${LIBVNCSERVER_LIBRARIES} ${ADDITIONAL_TEST_LIBS})
745769

746770
endif(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
747771

748-
if(LIBVNCSERVER_WITH_WEBSOCKETS)
772+
if(LIBVNCSERVER_WITH_WEBSOCKETS AND WITH_LIBVNCSERVER)
749773
add_executable(test_wstest
750774
${TESTS_DIR}/wstest.c
751775
${TESTS_DIR}/wstestdata.inc
752776
)
753777
set_target_properties(test_wstest PROPERTIES OUTPUT_NAME wstest)
754778
set_target_properties(test_wstest PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
755-
target_link_libraries(test_wstest vncserver vncclient ${ADDITIONAL_TEST_LIBS})
756-
endif(LIBVNCSERVER_WITH_WEBSOCKETS)
779+
target_link_libraries(test_wstest vncserver ${ADDITIONAL_TEST_LIBS})
780+
endif(LIBVNCSERVER_WITH_WEBSOCKETS AND WITH_LIBVNCSERVER)
757781

758-
add_test(NAME cargs COMMAND test_cargstest)
782+
if(WITH_LIBVNCSERVER)
783+
add_test(NAME cargs COMMAND test_cargstest)
784+
endif(WITH_LIBVNCSERVER)
759785
if(UNIX)
760-
add_test(NAME includetest COMMAND ${TESTS_DIR}/includetest.sh ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_MAKE_PROGRAM})
786+
if(WITH_LIBVNCSERVER)
787+
add_test(NAME includetest_server COMMAND ${TESTS_DIR}/includetest.sh ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_MAKE_PROGRAM} "rfb/rfb.h")
788+
endif(WITH_LIBVNCSERVER)
789+
if(WITH_LIBVNCCLIENT)
790+
add_test(NAME includetest_client COMMAND ${TESTS_DIR}/includetest.sh ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_MAKE_PROGRAM} "rfb/rfbclient.h")
791+
endif(WITH_LIBVNCCLIENT)
761792
endif(UNIX)
762793
if(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
763794
add_test(NAME turbojpeg COMMAND test_tjunittest)
764795
endif(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
765-
if(LIBVNCSERVER_WITH_WEBSOCKETS)
796+
if(LIBVNCSERVER_WITH_WEBSOCKETS AND WITH_LIBVNCSERVER)
766797
add_test(NAME wstest COMMAND test_wstest)
767-
endif(LIBVNCSERVER_WITH_WEBSOCKETS)
798+
endif(LIBVNCSERVER_WITH_WEBSOCKETS AND WITH_LIBVNCSERVER)
768799

769800
endif(WITH_TESTS)
770801

@@ -791,26 +822,39 @@ function(get_link_libraries OUT TARGET)
791822
set(${OUT} ${RESULT} PARENT_SCOPE)
792823
endfunction()
793824

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

799837
if(LIBVNCSERVER_INSTALL)
800838
set(INSTALL_HEADER_FILES
801839
include/rfb/keysym.h
802840
include/rfb/threading.h
803-
include/rfb/rfb.h
804-
include/rfb/rfbclient.h
805841
${CMAKE_CURRENT_BINARY_DIR}/include/rfb/rfbconfig.h
806842
include/rfb/rfbproto.h
807843
include/rfb/rfbregion.h
808844
)
809-
810-
set_property(TARGET vncclient PROPERTY PUBLIC_HEADER ${INSTALL_HEADER_FILES})
811-
set_property(TARGET vncserver PROPERTY PUBLIC_HEADER ${INSTALL_HEADER_FILES})
845+
846+
if(WITH_LIBVNCSERVER)
847+
list(APPEND INSTALL_HEADER_FILES include/rfb/rfb.h)
848+
endif(WITH_LIBVNCSERVER)
849+
if(WITH_LIBVNCCLIENT)
850+
list(APPEND INSTALL_HEADER_FILES include/rfb/rfbclient.h)
851+
endif(WITH_LIBVNCCLIENT)
852+
853+
foreach(LIB ${LIBVNCSERVER_LIBRARIES})
854+
set_property(TARGET ${LIB} PROPERTY PUBLIC_HEADER ${INSTALL_HEADER_FILES})
855+
endforeach()
812856
if(WIN32)
813-
INSTALL(TARGETS vncclient vncserver
857+
INSTALL(TARGETS ${LIBVNCSERVER_LIBRARIES}
814858
EXPORT LibVNCServerTargets
815859
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
816860
LIBRARY DESTINATION "${CMAKE_INSTALL_BINDIR}"
@@ -819,7 +863,7 @@ if(LIBVNCSERVER_INSTALL)
819863
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
820864
)
821865
else()
822-
INSTALL(TARGETS vncclient vncserver
866+
INSTALL(TARGETS ${LIBVNCSERVER_LIBRARIES}
823867
EXPORT LibVNCServerTargets
824868
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
825869
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
@@ -854,8 +898,7 @@ if(LIBVNCSERVER_INSTALL)
854898

855899

856900
install(FILES
857-
${CMAKE_CURRENT_BINARY_DIR}/libvncserver.pc
858-
${CMAKE_CURRENT_BINARY_DIR}/libvncclient.pc
901+
${LIBVNCSERVER_PC_FILES}
859902
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
860903
)
861904
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)