Skip to content

Commit ffe24e0

Browse files
richmattesqdot
authored andcommitted
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 Signed-off-by: Kyle Machulis <[email protected]>
1 parent ece9eef commit ffe24e0

File tree

6 files changed

+172
-17
lines changed

6 files changed

+172
-17
lines changed

c/CMakeLists.txt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,34 @@
2323
# either License.
2424

2525
PROJECT(libfreenect)
26+
set (PROJECT_VER_MAJOR 0)
27+
set (PROJECT_VER_MINOR 0)
28+
set (PROJECT_VER_PATCH 0)
29+
set (PROJECT_VER
30+
"${PROJECT_VER_MAJOR}.${PROJECT_VER_MINOR}.${PROJECT_VER_PATCH}")
31+
set (PROJECT_APIVER
32+
"${PROJECT_VER_MAJOR}.${PROJECT_VER_MINOR}")
2633

2734
cmake_minimum_required(VERSION 2.6)
2835

2936
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/Modules/")
3037

3138
set(CMAKE_C_FLAGS "-Wall -O3 -g")
3239

40+
# Find the host operating system and architecture
41+
include (FindOS)
42+
# Set up installation directories
43+
include (SetupDirectories)
44+
45+
# Add source directories
3346
add_subdirectory (lib)
3447
add_subdirectory (examples)
48+
49+
# Create an uninstall target
50+
configure_file(
51+
"${CMAKE_SOURCE_DIR}/Modules/UninstallTarget.cmake.in"
52+
"${CMAKE_CURRENT_BINARY_DIR}/UninstallTarget.cmake"
53+
IMMEDIATE @ONLY)
54+
55+
add_custom_target(uninstall
56+
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/UninstallTarget.cmake)

c/Modules/FindOS.cmake

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# Check the OS type.
2+
3+
# CMake does not distinguish Linux from other Unices.
4+
STRING (REGEX MATCH "Linux" PROJECT_OS_LINUX ${CMAKE_SYSTEM_NAME})
5+
# Nor *BSD
6+
STRING (REGEX MATCH "BSD" PROJECT_OS_BSD ${CMAKE_SYSTEM_NAME})
7+
# Or Solaris. I'm seeing a trend, here
8+
STRING (REGEX MATCH "SunOS" PROJECT_OS_SOLARIS ${CMAKE_SYSTEM_NAME})
9+
10+
# Windows is easy (for once)
11+
IF (WIN32)
12+
SET (PROJECT_OS_WIN TRUE BOOL INTERNAL)
13+
ENDIF (WIN32)
14+
15+
# Check if it's an Apple OS
16+
IF (APPLE)
17+
# Check if it's OS X or another MacOS (that's got to be pretty unlikely)
18+
STRING (REGEX MATCH "Darwin" PROJECT_OS_OSX ${CMAKE_SYSTEM_NAME})
19+
IF (NOT PROJECT_OS_OSX)
20+
SET (PROJECT_OS_MACOS TRUE BOOL INTERNAL)
21+
ENDIF (NOT PROJECT_OS_OSX)
22+
ENDIF (APPLE)
23+
24+
# QNX
25+
IF (QNXNTO)
26+
SET (PROJECT_OS_QNX TRUE BOOL INTERNAL)
27+
ENDIF (QNXNTO)
28+
29+
IF (PROJECT_OS_LINUX)
30+
MESSAGE (STATUS "Operating system is Linux")
31+
ELSEIF (PROJECT_OS_BSD)
32+
MESSAGE (STATUS "Operating system is BSD")
33+
ELSEIF (PROJECT_OS_WIN)
34+
MESSAGE (STATUS "Operating system is Windows")
35+
ELSEIF (PROJECT_OS_OSX)
36+
MESSAGE (STATUS "Operating system is Apple MacOS X")
37+
ELSEIF (PROJECT_OS_MACOS)
38+
MESSAGE (STATUS "Operating system is Apple MacOS (not OS X)")
39+
ELSEIF (PROJECT_OS_QNX)
40+
MESSAGE (STATUS "Operating system is QNX")
41+
ELSEIF (PROJECT_OS_SOLARIS)
42+
MESSAGE (STATUS "Operating system is Solaris")
43+
ELSE (PROJECT_OS_LINUX)
44+
MESSAGE (STATUS "Operating system is generic Unix")
45+
ENDIF (PROJECT_OS_LINUX)
46+
47+
MESSAGE (STATUS "Got System Processor ${CMAKE_SYSTEM_PROCESSOR}")
48+
49+
# 32 or 64 bit Linux
50+
IF (PROJECT_OS_LINUX)
51+
# Set the library directory suffix accordingly
52+
IF (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
53+
SET (PROJECT_PROC_64BIT TRUE BOOL INTERNAL)
54+
MESSAGE (STATUS "Linux x86_64 Detected")
55+
ELSEIF (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "ppc64")
56+
MESSAGE (STATUS "Linux ppc64 Detected")
57+
SET (PROJECT_PROC_64BIT TRUE BOOL INTERNAL)
58+
ENDIF (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
59+
ENDIF (PROJECT_OS_LINUX)

c/Modules/SetupDirectories.cmake

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Default installation directory, based on operating system
2+
IF (PROJECT_OS_WIN)
3+
SET (CMAKE_INSTALL_PREFIX "C:\\Program Files\\libfreenect" CACHE PATH "Installation directory")
4+
ELSE (PROJECT_OS_WIN)
5+
SET (CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Installation directory")
6+
ENDIF (PROJECT_OS_WIN)
7+
8+
MESSAGE (STATUS "${PROJECT_NAME} will be installed to ${CMAKE_INSTALL_PREFIX}")
9+
10+
# Installation prefix for include files
11+
STRING (TOLOWER ${PROJECT_NAME} projectNameLower)
12+
SET (PROJECT_INCLUDE_INSTALL_DIR "include/${projectNameLower}")
13+
14+
IF (PROJECT_PROC_64BIT)
15+
SET (LIB_SUFFIX "64" CACHE STRING "Suffix for library installation directory")
16+
ELSE (PROJECT_PROC_64BIT)
17+
SET (LIB_SUFFIX "" CACHE STRING "Suffix for library installation directory")
18+
ENDIF (PROJECT_PROC_64BIT)
19+
20+
SET (PROJECT_LIBRARY_INSTALL_DIR "lib${LIB_SUFFIX}")
21+
22+
MESSAGE (STATUS "Headers will be installed to ${CMAKE_INSTALL_PREFIX}/${PROJECT_INCLUDE_INSTALL_DIR}")
23+
MESSAGE (STATUS "Libraries will be installed to ${CMAKE_INSTALL_PREFIX}/${PROJECT_LIBRARY_INSTALL_DIR}")
24+

c/Modules/UninstallTarget.cmake.in

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
2+
message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
3+
endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
4+
5+
file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
6+
string(REGEX REPLACE "\n" ";" files "${files}")
7+
foreach (file ${files})
8+
message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
9+
if (EXISTS "$ENV{DESTDIR}${file}")
10+
execute_process(
11+
COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}"
12+
OUTPUT_VARIABLE rm_out
13+
RESULT_VARIABLE rm_retval
14+
)
15+
if(NOT ${rm_retval} EQUAL 0)
16+
message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
17+
endif (NOT ${rm_retval} EQUAL 0)
18+
else (EXISTS "$ENV{DESTDIR}${file}")
19+
message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
20+
endif (EXISTS "$ENV{DESTDIR}${file}")
21+
endforeach(file)

c/examples/CMakeLists.txt

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,27 @@
1-
include_directories (${CMAKE_SOURCE_DIR}/include)
2-
link_directories (${CMAKE_BINARY_DIR}/lib)
1+
option (BUILD_EXAMPLES "Build example programs" ON)
32

4-
find_package(Threads REQUIRED)
5-
find_package(OpenGL REQUIRED)
6-
find_package(GLU REQUIRED)
7-
find_package(GLUT REQUIRED)
3+
if (BUILD_EXAMPLES)
4+
include_directories (${CMAKE_SOURCE_DIR}/include)
5+
link_directories (${CMAKE_BINARY_DIR}/lib)
86

9-
find_package(USB REQUIRED)
10-
include_directories(${USB_INCLUDE_DIRS})
7+
find_package(Threads REQUIRED)
8+
find_package(OpenGL REQUIRED)
9+
find_package(GLU REQUIRED)
10+
find_package(GLUT REQUIRED)
1111

12-
add_executable(glview glview.c)
13-
find_library (PTHREAD pthread)
14-
IF(APPLE)
15-
set(CMAKE_EXE_LINKER_FLAGS "-framework OpenGL -framework GLUT")
16-
target_link_libraries(glview freenect)
17-
ELSE()
18-
target_link_libraries(glview freenect GL GLU glut m)
19-
ENDIF()
12+
find_package(USB REQUIRED)
13+
include_directories(${USB_INCLUDE_DIRS})
14+
15+
add_executable(glview glview.c)
16+
find_library (PTHREAD pthread)
17+
IF(PROJECT_OS_OSX)
18+
set(CMAKE_EXE_LINKER_FLAGS "-framework OpenGL -framework GLUT")
19+
target_link_libraries(glview freenect)
20+
ELSE()
21+
target_link_libraries(glview freenect GL GLU glut m)
22+
ENDIF()
23+
24+
install (TARGETS glview
25+
DESTINATION bin)
26+
27+
endif (BUILD_EXAMPLES)

c/lib/CMakeLists.txt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,33 @@ find_package(Threads REQUIRED)
55
find_package(USB REQUIRED)
66
include_directories(${USB_INCLUDE_DIRS})
77

8-
add_library (freenect SHARED motors.c accelerometers.c core.c cameras.c usb_libusb10.c ${CMAKE_CURRENT_BINARY_DIR}/inits.c)
8+
SET(SRC motors.c accelerometers.c core.c cameras.c usb_libusb10.c)
9+
10+
if (NOT PROJECT_OS_WIN)
11+
add_library (freenect SHARED ${SRC} ${CMAKE_CURRENT_BINARY_DIR}/inits.c)
12+
set_target_properties ( freenect PROPERTIES
13+
VERSION ${PROJECT_VER}
14+
SOVERSION ${PROJECT_APIVER})
15+
install (TARGETS freenect
16+
DESTINATION "${PROJECT_LIBRARY_INSTALL_DIR}")
17+
endif (NOT PROJECT_OS_WIN)
18+
19+
add_library (freenectstatic STATIC ${SRC} ${CMAKE_CURRENT_BINARY_DIR}/inits.c)
20+
set_target_properties (freenectstatic PROPERTIES
21+
OUTPUT_NAME freenect)
22+
install (TARGETS freenectstatic
23+
DESTINATION "${PROJECT_LIBRARY_INSTALL_DIR}")
924

1025
find_library (PTHREAD pthread)
1126
target_link_libraries (freenect ${CMAKE_THREAD_LIBS_INIT} ${USB_LIBRARIES})
27+
target_link_libraries (freenectstatic ${CMAKE_THREAD_LIBS_INIT} ${USB_LIBRARIES})
28+
1229

1330
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/inits.c
1431
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/geninits.py
1532
MAIN_DEPENDENCY inits.txt
1633
COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/geninits.py ${CMAKE_CURRENT_SOURCE_DIR}/inits.txt ${CMAKE_CURRENT_BINARY_DIR}/inits.c)
34+
35+
# Install the header file
36+
install (FILES "../include/libfreenect.h"
37+
DESTINATION ${PROJECT_INCLUDE_INSTALL_DIR})

0 commit comments

Comments
 (0)