From 8d86294812fc0c820a268da940c33af1cc2723c6 Mon Sep 17 00:00:00 2001 From: Rich Mattes Date: Fri, 12 Nov 2010 18:38:36 -0500 Subject: [PATCH 1/3] Added libm to Linux link flags for the examples, as it isn't linked resolved automatically on some distributions --- c/examples/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/c/examples/CMakeLists.txt b/c/examples/CMakeLists.txt index 2d4a7575..8d0bebc0 100644 --- a/c/examples/CMakeLists.txt +++ b/c/examples/CMakeLists.txt @@ -15,5 +15,5 @@ IF(APPLE) set(CMAKE_EXE_LINKER_FLAGS "-framework OpenGL -framework GLUT") target_link_libraries(glview freenect) ELSE() - target_link_libraries(glview freenect GL GLU glut) + target_link_libraries(glview freenect GL GLU glut m) ENDIF() From edac5541921e858b2d6f38522f7916b8bad7e8af Mon Sep 17 00:00:00 2001 From: Rich Mattes Date: Fri, 12 Nov 2010 20:29:38 -0500 Subject: [PATCH 2/3] Lots of new enhancements to buildsystem: - Set project version in root directory CMakeLists.txt - Added host OS and Architecture detection - Added install and uninstall targets for system-wide installation - Added support for building static and shared library, with soname versioning - Made CMake option to enable/disable building example application --- c/CMakeLists.txt | 22 +++++++++++ c/Modules/FindOS.cmake | 59 ++++++++++++++++++++++++++++++ c/Modules/SetupDirectories.cmake | 24 ++++++++++++ c/Modules/UninstallTarget.cmake.in | 21 +++++++++++ c/examples/CMakeLists.txt | 40 ++++++++++++-------- c/lib/CMakeLists.txt | 22 ++++++++++- 6 files changed, 171 insertions(+), 17 deletions(-) create mode 100644 c/Modules/FindOS.cmake create mode 100644 c/Modules/SetupDirectories.cmake create mode 100644 c/Modules/UninstallTarget.cmake.in diff --git a/c/CMakeLists.txt b/c/CMakeLists.txt index 58851cf3..b981f3f8 100644 --- a/c/CMakeLists.txt +++ b/c/CMakeLists.txt @@ -1,4 +1,11 @@ PROJECT(libfreenect) +set (PROJECT_VER_MAJOR 0) +set (PROJECT_VER_MINOR 0) +set (PROJECT_VER_PATCH 0) +set (PROJECT_VER + "${PROJECT_VER_MAJOR}.${PROJECT_VER_MINOR}.${PROJECT_VER_PATCH}") +set (PROJECT_APIVER + "${PROJECT_VER_MAJOR}.${PROJECT_VER_MINOR}") cmake_minimum_required(VERSION 2.6) @@ -6,5 +13,20 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/Modules/") set(CMAKE_C_FLAGS "-Wall -O3 -g") +# Find the host operating system and architecture +include (FindOS) +# Set up installation directories +include (SetupDirectories) + +# Add source directories add_subdirectory (lib) add_subdirectory (examples) + +# Create an uninstall target +configure_file( + "${CMAKE_SOURCE_DIR}/Modules/UninstallTarget.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/UninstallTarget.cmake" + IMMEDIATE @ONLY) + +add_custom_target(uninstall + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/UninstallTarget.cmake) diff --git a/c/Modules/FindOS.cmake b/c/Modules/FindOS.cmake new file mode 100644 index 00000000..713f4dfd --- /dev/null +++ b/c/Modules/FindOS.cmake @@ -0,0 +1,59 @@ +# Check the OS type. + +# CMake does not distinguish Linux from other Unices. +STRING (REGEX MATCH "Linux" PROJECT_OS_LINUX ${CMAKE_SYSTEM_NAME}) +# Nor *BSD +STRING (REGEX MATCH "BSD" PROJECT_OS_BSD ${CMAKE_SYSTEM_NAME}) +# Or Solaris. I'm seeing a trend, here +STRING (REGEX MATCH "SunOS" PROJECT_OS_SOLARIS ${CMAKE_SYSTEM_NAME}) + +# Windows is easy (for once) +IF (WIN32) + SET (PROJECT_OS_WIN TRUE BOOL INTERNAL) +ENDIF (WIN32) + +# Check if it's an Apple OS +IF (APPLE) + # Check if it's OS X or another MacOS (that's got to be pretty unlikely) + STRING (REGEX MATCH "Darwin" PROJECT_OS_OSX ${CMAKE_SYSTEM_NAME}) + IF (NOT PROJECT_OS_OSX) + SET (PROJECT_OS_MACOS TRUE BOOL INTERNAL) + ENDIF (NOT PROJECT_OS_OSX) +ENDIF (APPLE) + +# QNX +IF (QNXNTO) + SET (PROJECT_OS_QNX TRUE BOOL INTERNAL) +ENDIF (QNXNTO) + +IF (PROJECT_OS_LINUX) + MESSAGE (STATUS "Operating system is Linux") +ELSEIF (PROJECT_OS_BSD) + MESSAGE (STATUS "Operating system is BSD") +ELSEIF (PROJECT_OS_WIN) + MESSAGE (STATUS "Operating system is Windows") +ELSEIF (PROJECT_OS_OSX) + MESSAGE (STATUS "Operating system is Apple MacOS X") +ELSEIF (PROJECT_OS_MACOS) + MESSAGE (STATUS "Operating system is Apple MacOS (not OS X)") +ELSEIF (PROJECT_OS_QNX) + MESSAGE (STATUS "Operating system is QNX") +ELSEIF (PROJECT_OS_SOLARIS) + MESSAGE (STATUS "Operating system is Solaris") +ELSE (PROJECT_OS_LINUX) + MESSAGE (STATUS "Operating system is generic Unix") +ENDIF (PROJECT_OS_LINUX) + +MESSAGE (STATUS "Got System Processor ${CMAKE_SYSTEM_PROCESSOR}") + +# 32 or 64 bit Linux +IF (PROJECT_OS_LINUX) + # Set the library directory suffix accordingly + IF (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") + SET (PROJECT_PROC_64BIT TRUE BOOL INTERNAL) + MESSAGE (STATUS "Linux x86_64 Detected") + ELSEIF (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "ppc64") + MESSAGE (STATUS "Linux ppc64 Detected") + SET (PROJECT_PROC_64BIT TRUE BOOL INTERNAL) + ENDIF (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") +ENDIF (PROJECT_OS_LINUX) diff --git a/c/Modules/SetupDirectories.cmake b/c/Modules/SetupDirectories.cmake new file mode 100644 index 00000000..99b3e5d5 --- /dev/null +++ b/c/Modules/SetupDirectories.cmake @@ -0,0 +1,24 @@ +# Default installation directory, based on operating system +IF (PROJECT_OS_WIN) + SET (CMAKE_INSTALL_PREFIX "C:\\Program Files\\libfreenect" CACHE PATH "Installation directory") +ELSE (PROJECT_OS_WIN) + SET (CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation directory") +ENDIF (PROJECT_OS_WIN) + +MESSAGE (STATUS "${PROJECT_NAME} will be installed to ${CMAKE_INSTALL_PREFIX}") + +# Installation prefix for include files +STRING (TOLOWER ${PROJECT_NAME} projectNameLower) +SET (PROJECT_INCLUDE_INSTALL_DIR "include/${projectNameLower}") + +IF (PROJECT_PROC_64BIT) + SET (LIB_SUFFIX "64" CACHE STRING "Suffix for library installation directory") +ELSE (PROJECT_PROC_64BIT) + SET (LIB_SUFFIX "" CACHE STRING "Suffix for library installation directory") +ENDIF (PROJECT_PROC_64BIT) + +SET (PROJECT_LIBRARY_INSTALL_DIR "lib${LIB_SUFFIX}") + +MESSAGE (STATUS "Headers will be installed to ${CMAKE_INSTALL_PREFIX}/${PROJECT_INCLUDE_INSTALL_DIR}") +MESSAGE (STATUS "Libraries will be installed to ${CMAKE_INSTALL_PREFIX}/${PROJECT_LIBRARY_INSTALL_DIR}") + diff --git a/c/Modules/UninstallTarget.cmake.in b/c/Modules/UninstallTarget.cmake.in new file mode 100644 index 00000000..7e36ed41 --- /dev/null +++ b/c/Modules/UninstallTarget.cmake.in @@ -0,0 +1,21 @@ +if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") +endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + +file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") +foreach (file ${files}) + message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") + if (EXISTS "$ENV{DESTDIR}${file}") + execute_process( + COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}" + OUTPUT_VARIABLE rm_out + RESULT_VARIABLE rm_retval + ) + if(NOT ${rm_retval} EQUAL 0) + message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") + endif (NOT ${rm_retval} EQUAL 0) + else (EXISTS "$ENV{DESTDIR}${file}") + message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") + endif (EXISTS "$ENV{DESTDIR}${file}") +endforeach(file) diff --git a/c/examples/CMakeLists.txt b/c/examples/CMakeLists.txt index 8d0bebc0..4601d577 100644 --- a/c/examples/CMakeLists.txt +++ b/c/examples/CMakeLists.txt @@ -1,19 +1,27 @@ -include_directories (${CMAKE_SOURCE_DIR}/include) -link_directories (${CMAKE_BINARY_DIR}/lib) +option (BUILD_EXAMPLES "Build example programs" ON) -find_package(Threads REQUIRED) -find_package(OpenGL REQUIRED) -find_package(GLU REQUIRED) -find_package(GLUT REQUIRED) +if (BUILD_EXAMPLES) + include_directories (${CMAKE_SOURCE_DIR}/include) + link_directories (${CMAKE_BINARY_DIR}/lib) -find_package(USB REQUIRED) -include_directories(${USB_INCLUDE_DIRS}) + find_package(Threads REQUIRED) + find_package(OpenGL REQUIRED) + find_package(GLU REQUIRED) + find_package(GLUT REQUIRED) -add_executable(glview glview.c) -find_library (PTHREAD pthread) -IF(APPLE) - set(CMAKE_EXE_LINKER_FLAGS "-framework OpenGL -framework GLUT") - target_link_libraries(glview freenect) -ELSE() - target_link_libraries(glview freenect GL GLU glut m) -ENDIF() + find_package(USB REQUIRED) + include_directories(${USB_INCLUDE_DIRS}) + + add_executable(glview glview.c) + find_library (PTHREAD pthread) + IF(PROJECT_OS_OSX) + set(CMAKE_EXE_LINKER_FLAGS "-framework OpenGL -framework GLUT") + target_link_libraries(glview freenect) + ELSE() + target_link_libraries(glview freenect GL GLU glut m) + ENDIF() + + install (TARGETS glview + DESTINATION bin) + +endif (BUILD_EXAMPLES) diff --git a/c/lib/CMakeLists.txt b/c/lib/CMakeLists.txt index 302eb903..16a3cf32 100644 --- a/c/lib/CMakeLists.txt +++ b/c/lib/CMakeLists.txt @@ -5,11 +5,31 @@ find_package(Threads REQUIRED) find_package(USB REQUIRED) include_directories(${USB_INCLUDE_DIRS}) -add_library (freenect cameras.c ${CMAKE_CURRENT_BINARY_DIR}/inits.c) +if (NOT PROJECT_OS_WIN) + add_library (freenect SHARED cameras.c ${CMAKE_CURRENT_BINARY_DIR}/inits.c) + set_target_properties ( freenect PROPERTIES + VERSION ${PROJECT_VER} + SOVERSION ${PROJECT_APIVER}) + install (TARGETS freenect + DESTINATION "${PROJECT_LIBRARY_INSTALL_DIR}") +endif (NOT PROJECT_OS_WIN) + +add_library (freenectstatic STATIC cameras.c ${CMAKE_CURRENT_BINARY_DIR}/inits.c) +set_target_properties (freenectstatic PROPERTIES + OUTPUT_NAME freenect) +install (TARGETS freenectstatic + DESTINATION "${PROJECT_LIBRARY_INSTALL_DIR}") + find_library (PTHREAD pthread) target_link_libraries (freenect ${CMAKE_THREAD_LIBS_INIT} ${USB_LIBRARIES}) +target_link_libraries (freenectstatic ${CMAKE_THREAD_LIBS_INIT} ${USB_LIBRARIES}) + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/inits.c DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/geninits.py MAIN_DEPENDENCY inits.txt COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/geninits.py ${CMAKE_CURRENT_SOURCE_DIR}/inits.txt ${CMAKE_CURRENT_BINARY_DIR}/inits.c) + +# Install the header file +install (FILES "../include/libfreenect.h" + DESTINATION ${PROJECT_INCLUDE_INSTALL_DIR}) From 9c4d26e0441a3f04265aa32f40a71b17cfe1133a Mon Sep 17 00:00:00 2001 From: Rich Date: Tue, 16 Nov 2010 23:43:49 -0500 Subject: [PATCH 3/3] Updating to latest version with my CMake changes --- c/lib/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/c/lib/CMakeLists.txt b/c/lib/CMakeLists.txt index 620dc326..f4943cf8 100644 --- a/c/lib/CMakeLists.txt +++ b/c/lib/CMakeLists.txt @@ -6,7 +6,7 @@ find_package(USB REQUIRED) include_directories(${USB_INCLUDE_DIRS}) if (NOT PROJECT_OS_WIN) - add_library (freenect SHARED core.c cameras.c ${CMAKE_CURRENT_BINARY_DIR}/inits.c) + add_library (freenect SHARED core.c cameras.c usb_libusb10.c ${CMAKE_CURRENT_BINARY_DIR}/inits.c) set_target_properties ( freenect PROPERTIES VERSION ${PROJECT_VER} SOVERSION ${PROJECT_APIVER}) @@ -14,7 +14,7 @@ if (NOT PROJECT_OS_WIN) DESTINATION "${PROJECT_LIBRARY_INSTALL_DIR}") endif (NOT PROJECT_OS_WIN) -add_library (freenectstatic STATIC core.c cameras.c ${CMAKE_CURRENT_BINARY_DIR}/inits.c) +add_library (freenectstatic STATIC core.c cameras.c usb_libusb10.c ${CMAKE_CURRENT_BINARY_DIR}/inits.c) set_target_properties (freenectstatic PROPERTIES OUTPUT_NAME freenect) install (TARGETS freenectstatic