You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
4.6 KiB
CMake

# 최소 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)