# 최소 CMake 버전 정의 cmake_minimum_required(VERSION 3.10) project(v4l2onvif) # GSOAP 기본 설정 set(GSOAP_PREFIX "/usr/local") set(GSOAP_BIN "${GSOAP_PREFIX}/bin") set(GSOAP_PLUGINS "${GSOAP_PREFIX}/share/gsoap/plugin") set(GSOAP_BASE "${GSOAP_PREFIX}/share/gsoap") # C++ 표준 및 빌드 플래그 설정 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g2 -I inc -I ws-discovery/gsoap/ -I gen -I ${GSOAP_PREFIX}/include -I ${GSOAP_PLUGINS} -DWITH_DOM -DWITH_OPENSSL -DSOAP_PURE_VIRTUAL -fpermissive -pthread") set(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++ -static-libgcc -L${GSOAP_PREFIX}/lib -ldl -lpthread") # SYSROOT 환경 변수 확인 set(SYSROOT $ENV{CXX_SYSROOT}) if (NOT SYSROOT) execute_process(COMMAND ${CMAKE_CXX_COMPILER} --print-sysroot OUTPUT_VARIABLE SYSROOT OUTPUT_STRIP_TRAILING_WHITESPACE) endif() # 버전 관리 find_package(Git REQUIRED) execute_process( COMMAND git describe --tags --always --dirty OUTPUT_VARIABLE VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) add_compile_definitions(VERSION="${VERSION}") # include 디렉토리 설정 include_directories( ${CMAKE_SOURCE_DIR}/inc ${GEN_DIR} ${CMAKE_SOURCE_DIR}/ws-discovery/gsoap ${GSOAP_PREFIX}/include ${GSOAP_PLUGINS} gen v4l2rtspserver/inc v4l2rtspserver/libv4l2cpp/inc v4l2rtspserver/live/groupsock/include v4l2rtspserver/live/liveMedia/include v4l2rtspserver/live/UsageEnvironment/include v4l2rtspserver/live/BasicUsageEnvironment/include v4l2rtspserver/src v4l2rtspserver/libv4l2cpp/src v4l2rtspserver/libv4l2cpp/inc ) link_directories(${GSOAP_PREFIX}/lib) # 컴파일 옵션 add_compile_options( -std=c++11 -g2 -fpermissive -pthread -DWITH_DOM -DWITH_OPENSSL -DSOAP_PURE_VIRTUAL ) # GSOAP 관련 파일 설정 file(GLOB WSSE_SRC "${GSOAP_PLUGINS}/wsseapi.c" "${GSOAP_PLUGINS}/smdevp.c" "${GSOAP_PLUGINS}/mecevp.c" "${GSOAP_PLUGINS}/wsaapi.c" "${GSOAP_BASE}/custom/struct_timeval.c" ) # C 파일의 속성을 C++로 설정 set_source_files_properties( ${WSSE_SRC} PROPERTIES LANGUAGE CXX ) # SOAP 관련 파일 file(GLOB SOAP_SRC "gen/soapC_*.cpp") file(GLOB SERVER_OBJ "gen/soap*.o" ) file(GLOB CLIENT_OBJ "gen/soap*.o" ) file(GLOB ONVIF_SRC "src/server*.cpp") # RTSP 및 V4L2 라이브러리 소스 파일 file(GLOB V4L2RTSP_SRC ${CMAKE_SOURCE_DIR}/v4l2rtspserver/src/*.cpp ) file(GLOB V4L2CPP_SRC ${CMAKE_SOURCE_DIR}/v4l2rtspserver/libv4l2cpp/src/*.cpp ) # 라이브러리 생성 add_library(libserver STATIC ${SERVER_OBJ} ${SOAP_SRC}) add_library(libclient STATIC ${CLIENT_OBJ} ${SOAP_SRC} gen/soapNotificationConsumerBindingService.cpp) add_library(libonvif STATIC ${ONVIF_SRC}) # ws-discovery 설정 set(WSD_GSOAP_DIR ${CMAKE_SOURCE_DIR}/ws-discovery/gsoap) # libwsdd.a 생성 명령 추가 add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/libwsdd.a COMMAND git submodule init ws-discovery COMMAND git submodule update ws-discovery COMMAND ${CMAKE_MAKE_PROGRAM} -C ${WSD_GSOAP_DIR} libwsdd.a COMMAND ${CMAKE_COMMAND} -E copy ${WSD_GSOAP_DIR}/libwsdd.a ${CMAKE_BINARY_DIR}/libwsdd.a WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Building libwsdd.a from ${WSD_GSOAP_DIR}" VERBATIM ) # libwsdd 타겟 생성 add_custom_target(libwsdd DEPENDS ${CMAKE_BINARY_DIR}/libwsdd.a) # onvif-server 실행 파일 생성 add_executable(onvif-server src/onvif-server.o src/onvif_impl.o ${WSSE_SRC} gen/soapNotificationConsumerBindingProxy.o gen/soapDisplayBindingProxy.o ${V4L2RTSP_SRC} ${V4L2CPP_SRC} ) add_dependencies(onvif-server libwsdd) target_link_libraries(onvif-server PRIVATE libserver libclient libonvif gsoapssl++ gsoap++ ssl crypto dl pthread liveMedia groupsock BasicUsageEnvironment UsageEnvironment z ${CMAKE_BINARY_DIR}/libwsdd.a ) # onvif-client 실행 파일 생성 add_executable(onvif-client src/onvif-client.o ${WSSE_SRC} ) target_link_libraries(onvif-client PRIVATE libclient libonvif gsoapssl++ gsoap++ ssl crypto dl pthread liveMedia groupsock BasicUsageEnvironment UsageEnvironment z ) # 설치 경로 설정 install(TARGETS onvif-server onvif-client DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)