針對之前搞得的Cmake的東西,練手很少,還是覺得掌握的不到位,opencv什麼的太大了,本身cmake也不會用的太多,就懶得看了,剛好最近項目有用libuvc,也是依賴cmake編譯的,而且libuvc小而美,看代碼的同事學習一下cmake,做爲練習。
簡單介紹一句libuvc,跨平臺的開源庫,託管在git上,用來對標磚uvc設備進行操作,依賴libusb,可以增加對libjpeg的依賴(用來對某些jpeg格式的camera輸出進行解碼)
libuvc CMakeLists源碼
cmake_minimum_required(VERSION 2.8)
if (NOT CMAKE_BUILD_TYPE)
message(STATUS "No build type selected, default to Release")
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
endif ()
if (NOT CMAKE_BUILD_TARGET)
message(STATUS "No target type selected, default to both shared and static library")
set(CMAKE_BUILD_TARGET "Both" CACHE STRING "" FORCE)
endif()
set(libuvc_VERSION_MAJOR 0)
set(libuvc_VERSION_MINOR 0)
set(libuvc_VERSION_PATCH 6)
set(libuvc_VERSION ${libuvc_VERSION_MAJOR}.${libuvc_VERSION_MINOR}.${libuvc_VERSION_PATCH})
set(libuvc_DESCRIPTION "A cross-platform library for USB video devices")
set(libuvc_URL "https://github.com/ktossell/libuvc")
find_package(PkgConfig)
pkg_check_modules(LIBUSB libusb-1.0)
# Try to find JPEG using a module or pkg-config. If that doesn't work, search for the header.
find_package(jpeg QUIET)
if(JPEG_FOUND)
set(JPEG_LINK_FLAGS ${JPEG_LIBRARIES})
else()
pkg_check_modules(JPEG QUIET libjpeg)
if(JPEG_FOUND)
set(JPEG_INCLUDE_DIR ${JPEG_INCLUDE_DIRS})
set(JPEG_LINK_FLAGS ${JPEG_LDFLAGS})
else()
find_path(JPEG_INCLUDE_DIR jpeglib.h)
if(JPEG_INCLUDE_DIR)
set(JPEG_FOUND ON)
set(JPEG_LINK_FLAGS -ljpeg)
endif()
endif()
endif()
include(GNUInstallDirs)
SET(CMAKE_C_FLAGS_DEBUG "-g -DUVC_DEBUGGING")
SET(INSTALL_CMAKE_DIR "${CMAKE_INSTALL_PREFIX}/lib/cmake/libuvc" CACHE PATH
"Installation directory for CMake files")
SET(SOURCES src/ctrl.c src/ctrl-gen.c src/device.c src/diag.c
src/frame.c src/init.c src/stream.c
src/misc.c)
include_directories(
${libuvc_SOURCE_DIR}/include
${libuvc_BINARY_DIR}/include
${LIBUSB_INCLUDE_DIRS}
)
if(JPEG_FOUND)
message(STATUS "Building libuvc with JPEG support.")
include_directories(${JPEG_INCLUDE_DIR})
SET(LIBUVC_HAS_JPEG TRUE)
SET(SOURCES ${SOURCES} src/frame-mjpeg.c)
else()
message(WARNING "JPEG not found. libuvc will not support JPEG decoding.")
endif()
if(${CMAKE_BUILD_TARGET} MATCHES "Shared")
set(BUILD_UVC_SHARED TRUE)
elseif(${CMAKE_BUILD_TARGET} MATCHES "Static")
set(BUILD_UVC_STATIC TRUE)
elseif(${CMAKE_BUILD_TARGET} MATCHES "Both")
set(BUILD_UVC_SHARED TRUE)
set(BUILD_UVC_STATIC TRUE)
else()
message( FATAL_ERROR "Invalid build type ${CMAKE_BUILD_TARGET}" )
endif()
if(BUILD_UVC_SHARED)
add_library(uvc SHARED ${SOURCES})
list(APPEND UVC_TARGETS uvc)
endif()
if(BUILD_UVC_STATIC)
add_library(uvc_static STATIC ${SOURCES})
set_target_properties(uvc_static PROPERTIES OUTPUT_NAME uvc)
list(APPEND UVC_TARGETS uvc_static)
endif()
configure_file(include/libuvc/libuvc_config.h.in
${PROJECT_BINARY_DIR}/include/libuvc/libuvc_config.h @ONLY)
foreach(target_name ${UVC_TARGETS})
set_target_properties(${target_name} PROPERTIES
PUBLIC_HEADER "include/libuvc/libuvc.h;${libuvc_BINARY_DIR}/include/libuvc/libuvc_config.h" )
endforeach()
if(BUILD_UVC_SHARED)
if(JPEG_FOUND)
target_link_libraries (uvc ${JPEG_LINK_FLAGS})
endif(JPEG_FOUND)
target_link_libraries(uvc ${LIBUSB_LIBRARIES})
#add_executable(test src/test.c)
#target_link_libraries(test uvc ${LIBUSB_LIBRARIES} opencv_highgui
# opencv_core)
endif()
install(TARGETS ${UVC_TARGETS}
EXPORT libuvcTargets
LIBRARY DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}"
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_PREFIX}/include/libuvc"
)
export(TARGETS ${UVC_TARGETS}
FILE "${PROJECT_BINARY_DIR}/libuvcTargets.cmake")
export(PACKAGE libuvc)
set(CONF_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include")
set(CONF_LIBRARY_DIR "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
set(CONF_LIBRARY "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}/${CMAKE_SHARED_LIBRARY_PREFIX}uvc${CMAKE_SHARED_LIBRARY_SUFFIX}")
configure_file(libuvcConfig.cmake.in ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/libuvcConfig.cmake)
configure_file(libuvcConfigVersion.cmake.in ${PROJECT_BINARY_DIR}/libuvcConfigVersion.cmake @ONLY)
configure_file(libuvc.pc.in ${PROJECT_BINARY_DIR}/libuvc.pc @ONLY)
install(FILES
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/libuvcConfig.cmake"
"${PROJECT_BINARY_DIR}/libuvcConfigVersion.cmake"
DESTINATION "${INSTALL_CMAKE_DIR}")
install(EXPORT libuvcTargets
DESTINATION "${INSTALL_CMAKE_DIR}")
install(FILES
"${PROJECT_BINARY_DIR}/libuvc.pc"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
)
Step 1
if (NOT CMAKE_BUILD_TYPE)
message(STATUS "No build type selected, default to Release")
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
endif ()
if (NOT CMAKE_BUILD_TARGET)
message(STATUS "No target type selected, default to both shared and static library")
set(CMAKE_BUILD_TARGET "Both" CACHE STRING "" FORCE)
endif()
#設置 CMAKE_BUILD_TYPE 和CMAKE_BUILD_TARGET這兩個cache變量,後面穿件makefile會用到
#set( … CACHE [FORCE])
set cache force
SET(var1 13)
變量 var1 被設置成 13
如果 var1 在cache中已經存在,該命令不會overwrite cache中的值
SET(var1 13 ... CACHE ...)
如果cache存在該變量,使用cache中變量
如果cache中不存在,將該值寫入cache
SET(var1 13 ... CACHE ... FORCE)
不論cache中是否存在,始終使用該值
Step 2
set(libuvc_VERSION_MAJOR 0)
set(libuvc_VERSION_MINOR 0)
set(libuvc_VERSION_PATCH 6)
set(libuvc_VERSION ${libuvc_VERSION_MAJOR}.${libuvc_VERSION_MINOR}.${libuvc_VERSION_PATCH})
set(libuvc_DESCRIPTION "A cross-platform library for USB video devices")
set(libuvc_URL "https://github.com/ktossell/libuvc")
#設置一些版本變量
Step 3
find_package(PkgConfig)
pkg_check_modules(LIBUSB libusb-1.0)
# Try to find JPEG using a module or pkg-config. If that doesn't work, search for the header.
find_package(jpeg QUIET)
if(JPEG_FOUND)
set(JPEG_LINK_FLAGS ${JPEG_LIBRARIES})
else()
pkg_check_modules(JPEG QUIET libjpeg)
if(JPEG_FOUND)
set(JPEG_INCLUDE_DIR ${JPEG_INCLUDE_DIRS})
set(JPEG_LINK_FLAGS ${JPEG_LDFLAGS})
else()
find_path(JPEG_INCLUDE_DIR jpeglib.h)
if(JPEG_INCLUDE_DIR)
set(JPEG_FOUND ON)
set(JPEG_LINK_FLAGS -ljpeg)
endif()
endif()
endif()
尋找libusb和libjpeg的依賴路徑和頭文件路徑
尋找libusb,在PkgConfig裏找
尋找libusb 是否直接安裝,是否可在PkgConfig裏找到,否則查找頭文件,用直接鏈接
find_package整理
step
SET(CMAKE_C_FLAGS_DEBUG "-g -DUVC_DEBUGGING")
SET(INSTALL_CMAKE_DIR "${CMAKE_INSTALL_PREFIX}/lib/cmake/libuvc" CACHE PATH
"Installation directory for CMake files")
SET(SOURCES src/ctrl.c src/ctrl-gen.c src/device.c src/diag.c
src/frame.c src/init.c src/stream.c
src/misc.c)
- 設置編譯選項(DUVC_DEBUGGING 本來以爲是宏,可是源碼裏沒找到,暫時沒思路,回頭再看)
- 設置安裝路徑
- 設置sources變量,即添加編譯源文件
step 4
include_directories(
${libuvc_SOURCE_DIR}/include
${libuvc_BINARY_DIR}/include
${LIBUSB_INCLUDE_DIRS}
)
if(JPEG_FOUND)
message(STATUS "Building libuvc with JPEG support.")
include_directories(${JPEG_INCLUDE_DIR})
SET(LIBUVC_HAS_JPEG TRUE)
SET(SOURCES ${SOURCES} src/frame-mjpeg.c)
else()
message(WARNING "JPEG not found. libuvc will not support JPEG decoding.")
endif()
if(${CMAKE_BUILD_TARGET} MATCHES "Shared")
set(BUILD_UVC_SHARED TRUE)
elseif(${CMAKE_BUILD_TARGET} MATCHES "Static")
set(BUILD_UVC_STATIC TRUE)
elseif(${CMAKE_BUILD_TARGET} MATCHES "Both")
set(BUILD_UVC_SHARED TRUE)
set(BUILD_UVC_STATIC TRUE)
else()
message( FATAL_ERROR "Invalid build type ${CMAKE_BUILD_TARGET}" )
endif()
設置常規的編譯選項
需要注意的是:libuvc_SOURCE_DIR libuvc_BINARY_DIR是根據PROJECT_BINARY_DIR來的,如果當前的cmakelist 設置了project,那就可以用該名字,這個問題竟然 卡了我兩三個小時。。。蛋疼