diff --git a/.gitignore b/.gitignore index 6e9e2e3b7..3f888c19d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ examples/protonect/include/libfreenect2/config.h # generated resource file examples/protonect/src/resources.inc +examples/protonect/build # Dependency folders depends/*/ diff --git a/examples/protonect/CMakeLists.txt b/examples/protonect/CMakeLists.txt index 1fd580059..a30b9f93a 100644 --- a/examples/protonect/CMakeLists.txt +++ b/examples/protonect/CMakeLists.txt @@ -1,5 +1,15 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +macro(auto_detect_lib LIBNAME) + if ( PKG_CONFIG_FOUND ) + string(TOLOWER ${LIBNAME} PKGCONFIGNAME) + pkg_check_modules(${LIBNAME} ${PKGCONFIGNAME} ${ARGN}) + else(PKG_CONFIG_FOUND) + #MESSAGE("Fallback to non-pkg-config") + FIND_PACKAGE(${LIBNAME} ${ARGN}) + endif(PKG_CONFIG_FOUND) +endmacro() + PROJECT(libfreenect2) SET(CMAKE_BUILD_TYPE RelWithDebInfo) @@ -14,9 +24,9 @@ IF(ENABLE_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) IF(COMPILER_SUPPORTS_CXX11) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") ELSEIF(COMPILER_SUPPORTS_CXX0X) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") ELSE() MESSAGE(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") ENDIF() @@ -27,7 +37,6 @@ LIST(APPEND CMAKE_MODULE_PATH ${MY_DIR}/cmake_modules) # setup threading INCLUDE(SetupLibfreenect2Threading) -INCLUDE_DIRECTORIES(${LIBFREENECT2_THREADING_INCLUDE_DIR}) INCLUDE(GenerateResources) @@ -37,30 +46,21 @@ SET(EXECUTABLE_OUTPUT_PATH ${MY_DIR}/bin) #set the default path for built libraries to the "lib" directory SET(LIBRARY_OUTPUT_PATH ${MY_DIR}/lib) -FIND_PACKAGE(OpenCL) - # dependencies -FIND_PACKAGE(OpenCV REQUIRED) - -# OpenCV -INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIR}) - -# LibUSB -INCLUDE_DIRECTORIES("${MY_DIR}/../../depends/libusb/include/libusb-1.0/") -LINK_DIRECTORIES("${MY_DIR}/../../depends/libusb/lib/") +find_package(PkgConfig) # try find PKGConfig as it will be used if found +auto_detect_lib(LibUSB REQUIRED) +auto_detect_lib(OpenCV REQUIRED) +FIND_PACKAGE(TurboJPEG REQUIRED) #does not provide a package-config file + +#hack for buggy libusb pkgconfig file +if(NOT LibUSB_INCLUDE_DIR) + find_path(LibUSB_INCLUDE_DIR NAMES libusb.h PATHS /usr/include/libusb-1.0 ) +endif() -IF(ENABLE_OPENGL) - # GLFW - SET(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries") - SET(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "Build the GLFW example programs") - SET(GLFW_BUILD_TESTS OFF CACHE BOOL "Build the GLFW test programs") - SET(GLFW_BUILD_DOCS OFF CACHE BOOL "Build the GLFW documentation") - - ADD_SUBDIRECTORY(${MY_DIR}/../../depends/glfw_src/ ${MY_DIR}/../../depends/glfw) - INCLUDE_DIRECTORIES(${MY_DIR}/../../depends/glfw_src/include/) -ENDIF(ENABLE_OPENGL) +# Add includes +INCLUDE_DIRECTORIES("${MY_DIR}/include" ${LIBFREENECT2_THREADING_INCLUDE_DIR} ${OpenCV_INCLUDE_DIRS} ${LibUSB_INCLUDE_DIR} ${TurboJPEG_INCLUDE_DIR}) -if(APPLE) +if(APPLE AND NOT ${TurboJPEG_FOUND}) # libjpeg-turbo INCLUDE_DIRECTORIES("${MY_DIR}/../../depends/libjpeg_turbo/include/") LINK_DIRECTORIES("${MY_DIR}/../../depends/libjpeg_turbo/lib/") @@ -115,9 +115,10 @@ SET(SOURCES ) SET(LIBRARIES - usb-1.0 ${OpenCV_LIBS} - turbojpeg + ${OpenCV_LIBRARIES} + ${LibUSB_LIBRARIES} + ${TurboJPEG_LIBRARY} ${LIBFREENECT2_THREADING_LIBRARIES} ) @@ -127,19 +128,41 @@ SET(RESOURCES zTable.bin ) - IF(ENABLE_OPENGL) + auto_detect_lib(GLFW3) + + #Assuming local build witout global deps, ugly to to this automatic but to keep backward compatibiliy + if(${GLFW3_FOUND} STREQUAL "FALSE") + + MESSAGE(STATUS "Building local GLFW") + # GLFW + SET(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries") + SET(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "Build the GLFW example programs") + SET(GLFW_BUILD_TESTS OFF CACHE BOOL "Build the GLFW test programs") + SET(GLFW_BUILD_DOCS OFF CACHE BOOL "Build the GLFW documentation") + + ADD_SUBDIRECTORY(${MY_DIR}/../../depends/glfw_src/ ${MY_DIR}/../../depends/glfw) + INCLUDE_DIRECTORIES(${MY_DIR}/../../depends/glfw_src/include/) + + LIST(APPEND LIBRARIES + glfw + ) + + else() + INCLUDE_DIRECTORIES(${GLFW3_INCLUDE_DIRS}) + + LINK_DIRECTORIES(${GLFW3_LIBRARY_DIRS}) + LIST(APPEND LIBRARIES + ${GLFW3_LIBRARIES} + ) + endif() + SET(LIBFREENECT2_WITH_OPENGL_SUPPORT 1) LIST(APPEND SOURCES src/flextGL.c src/opengl_depth_packet_processor.cpp ) - - LIST(APPEND LIBRARIES - glfw - ${GLFW_LIBRARIES} - ) - + LIST(APPEND RESOURCES src/shader/debug.fs src/shader/default.vs @@ -150,31 +173,33 @@ IF(ENABLE_OPENGL) ) ENDIF(ENABLE_OPENGL) -IF(ENABLE_OPENCL AND OPENCL_FOUND) - SET(LIBFREENECT2_WITH_OPENCL_SUPPORT 1) - INCLUDE_DIRECTORIES(${OPENCL_INCLUDE_DIRS}) - - LIST(APPEND SOURCES - src/opencl_depth_packet_processor.cpp - ) - - LIST(APPEND LIBRARIES - ${OPENCL_LIBRARIES} - ) - - LIST(APPEND RESOURCES - src/opencl_depth_packet_processor.cl - ) -ENDIF(ENABLE_OPENCL AND OPENCL_FOUND) +IF(ENABLE_OPENCL) + FIND_PACKAGE(OpenCL) + + IF(OPENCL_FOUND) + SET(LIBFREENECT2_WITH_OPENCL_SUPPORT 1) + INCLUDE_DIRECTORIES(${OPENCL_INCLUDE_DIRS}) + + LIST(APPEND SOURCES + src/opencl_depth_packet_processor.cpp + ) + + LIST(APPEND LIBRARIES + ${OPENCL_LIBRARIES} + ) + + LIST(APPEND RESOURCES + src/opencl_depth_packet_processor.cl + ) + ENDIF(OPENCL_FOUND) +ENDIF(ENABLE_OPENCL) CONFIGURE_FILE("${MY_DIR}/include/libfreenect2/config.h.in" "${MY_DIR}/include/libfreenect2/config.h" @ONLY) - GENERATE_RESOURCES(${RESOURCES_INC_FILE} ${MY_DIR} ${RESOURCES}) -INCLUDE_DIRECTORIES("${MY_DIR}/include") - ADD_DEFINITIONS(-DRESOURCES_INC) ADD_LIBRARY(freenect2 SHARED ${SOURCES}) +MESSAGE("Linking with these libraries: ${LIBRARIES}") TARGET_LINK_LIBRARIES(freenect2 ${LIBRARIES}) ADD_EXECUTABLE(Protonect diff --git a/examples/protonect/cmake_modules/FindGLFW3.cmake b/examples/protonect/cmake_modules/FindGLFW3.cmake new file mode 100644 index 000000000..ba8a89383 --- /dev/null +++ b/examples/protonect/cmake_modules/FindGLFW3.cmake @@ -0,0 +1,16 @@ +# - Try to find GLFW3 +# +# Will define the following: +# GLFW3_FOUND +# GLFW3_INCLUDE_DIRS +# GLFW3_LIBRARIES + +include(FindPackageHandleStandardArgs) + +IF(${CMAKE_SYSTEM_NAME} MATCHES "Windows") + find_path(GLFW3_INCLUDE_DIRS glfw/glfw3.h DOC "GLFW include directory " HINTS $ENV{GLFW_ROOT}/include) + + find_library(GLFW3_LIBRARIES NAMES glfw3dll.lib HINTS $ENV{GLFW_ROOT}/lib/) +ENDIF() + +find_package_handle_standard_args(GLFW3 "Could not find GLFW3 - try adding GLFW_ROOT in enviroment variables." GLFW3_INCLUDE_DIRS GLFW3_LIBRARIES) \ No newline at end of file diff --git a/examples/protonect/cmake_modules/FindLibUsb.cmake b/examples/protonect/cmake_modules/FindLibUsb.cmake new file mode 100644 index 000000000..ffebdf1e4 --- /dev/null +++ b/examples/protonect/cmake_modules/FindLibUsb.cmake @@ -0,0 +1,88 @@ +# - Find libusb for portable USB support +# This module will find libusb as published by +# http://libusb.sf.net and +# http://libusb-win32.sf.net +# +# It will use PkgConfig if present and supported, else search +# it on its own. If the LibUSB_ROOT environment variable +# is defined, it will be used as base path. +# The following standard variables get defined: +# LibUSB_FOUND: true if LibUSB was found +# LibUSB_INCLUDE_DIR: the directory that contains the include file +# LibUSB_LIBRARIES: the library + +include ( CheckLibraryExists ) +include ( CheckIncludeFile ) + +find_path ( LibUSB_INCLUDE_DIR + NAMES + libusb.h + PATHS + $ENV{ProgramFiles}/LibUSB-Win32 + $ENV{LibUSB_ROOT} + PATH_SUFFIXES + libusb + ) + +mark_as_advanced ( LibUSB_INCLUDE_DIR ) + +if ( ${CMAKE_SYSTEM_NAME} STREQUAL "Windows" ) + # LibUSB-Win32 binary distribution contains several libs. + # Use the lib that got compiled with the same compiler. + if ( MSVC ) + if ( ${CMAKE_SIZEOF_VOID_P} EQUAL 8 ) + set ( LibUSB_LIBRARY_PATH_SUFFIX_RELEASE x64/Release/dll ) + set ( LibUSB_LIBRARY_PATH_SUFFIX_DEBUG x64/Debug/dll ) + else () + set ( LibUSB_LIBRARY_PATH_SUFFIX_RELEASE win32/Release/dll ) + set ( LibUSB_LIBRARY_PATH_SUFFIX_DEBUG win32/Debug/dll ) + endif () + endif ( MSVC ) +endif ( ${CMAKE_SYSTEM_NAME} STREQUAL "Windows" ) + +find_library ( LibUSB_LIBRARY_RELEASE + NAMES + libusb libusb-1.0 usb + PATHS + $ENV{ProgramFiles}/LibUSB-Win32 + $ENV{LibUSB_ROOT} + PATH_SUFFIXES + ${LibUSB_LIBRARY_PATH_SUFFIX_RELEASE} + ) + +find_library ( LibUSB_LIBRARY_DEBUG + NAMES + libusb libusb-1.0 libusb-1.0d usb + PATHS + $ENV{ProgramFiles}/LibUSB-Win32 + $ENV{LibUSB_ROOT} + PATH_SUFFIXES + ${LibUSB_LIBRARY_PATH_SUFFIX_DEBUG} + ) + +set (LibUSB_LIBRARIES + debug ${LibUSB_LIBRARY_DEBUG} + optimized ${LibUSB_LIBRARY_RELEASE} + ) + +if ( LibUSB_INCLUDE_DIR AND LibUSB_LIBRARIES ) + set ( LibUSB_FOUND 1 ) +endif ( LibUSB_INCLUDE_DIR AND LibUSB_LIBRARIES ) + +if ( LibUSB_FOUND ) + set ( CMAKE_REQUIRED_INCLUDES "${LibUSB_INCLUDE_DIR}" ) + check_include_file ( usb.h LibUSB_FOUND ) +endif ( LibUSB_FOUND ) + +if ( LibUSB_FOUND ) + check_library_exists ( "${LibUSB_LIBRARIES}" usb_open "" LibUSB_FOUND ) +endif ( LibUSB_FOUND ) + +if ( NOT LibUSB_FOUND ) + if ( NOT LibUSB_FIND_QUIETLY ) + message ( STATUS "LibUSB not found, try setting LibUSB_ROOT environment variable." ) + endif ( NOT LibUSB_FIND_QUIETLY ) + if ( LibUSB_FIND_REQUIRED ) + message ( FATAL_ERROR "LibUSB could not be found." ) + endif ( LibUSB_FIND_REQUIRED ) +endif ( NOT LibUSB_FOUND ) diff --git a/examples/protonect/cmake_modules/FindOpenCL.cmake b/examples/protonect/cmake_modules/FindOpenCL.cmake index 2c9672b3a..a062c9e21 100644 --- a/examples/protonect/cmake_modules/FindOpenCL.cmake +++ b/examples/protonect/cmake_modules/FindOpenCL.cmake @@ -11,7 +11,6 @@ # OPENCL_INCLUDE_DIRS - the OpenCL include directory # OPENCL_LIBRARIES - link these to use OpenCL # -# WIN32 should work, but is untested FIND_PACKAGE(PackageHandleStandardArgs) @@ -31,15 +30,15 @@ ELSE (APPLE) IF (WIN32) # The AMD SDK currently installs both x86 and x86_64 libraries # This is only a hack to find out architecture - IF( ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64" ) - FIND_LIBRARY(OPENCL_LIBRARIES OpenCL.lib PATHS "$ENV{ATISTREAMSDKROOT}" "$ENV{AMDAPPSDKROOT}" PATH_SUFFIXES "/lib/x86_64") - ELSE (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64") - FIND_LIBRARY(OPENCL_LIBRARIES OpenCL.lib PATHS "$ENV{ATISTREAMSDKROOT}" "$ENV{AMDAPPSDKROOT}" PATH_SUFFIXES "/lib/x86") - ENDIF( ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64" ) + IF( ${CMAKE_SIZEOF_VOID_P} EQUAL 8 ) + FIND_LIBRARY(OPENCL_LIBRARIES OpenCL.lib PATHS "$ENV{ATISTREAMSDKROOT}" "$ENV{AMDAPPSDKROOT}" "$ENV{INTELOCLSDKROOT}" PATH_SUFFIXES "/lib/x86_64" "/lib/x64") + ELSE (${CMAKE_SIZEOF_VOID_P} EQUAL 8) + FIND_LIBRARY(OPENCL_LIBRARIES OpenCL.lib PATHS "$ENV{ATISTREAMSDKROOT}" "$ENV{AMDAPPSDKROOT}" "$ENV{INTELOCLSDKROOT}" PATH_SUFFIXES "/lib/x86") + ENDIF( ${CMAKE_SIZEOF_VOID_P} EQUAL 8 ) # On Win32 search relative to the library - FIND_PATH(OPENCL_INCLUDE_DIRS CL/cl.h PATHS "$ENV{ATISTREAMSDKROOT}" "$ENV{AMDAPPSDKROOT}" PATH_SUFFIXES "/include") - FIND_PATH(_OPENCL_CPP_INCLUDE_DIRS CL/cl.hpp PATHS "$ENV{ATISTREAMSDKROOT}" "$ENV{AMDAPPSDKROOT}" PATH_SUFFIXES "/include") + FIND_PATH(OPENCL_INCLUDE_DIRS CL/cl.h PATHS "$ENV{ATISTREAMSDKROOT}" "$ENV{AMDAPPSDKROOT}" "$ENV{INTELOCLSDKROOT}" PATH_SUFFIXES "/include") + FIND_PATH(_OPENCL_CPP_INCLUDE_DIRS CL/cl.hpp PATHS "$ENV{ATISTREAMSDKROOT}" "$ENV{AMDAPPSDKROOT}" "$ENV{INTELOCLSDKROOT}" PATH_SUFFIXES "/include") ELSE (WIN32) diff --git a/examples/protonect/cmake_modules/FindTurboJPEG.cmake b/examples/protonect/cmake_modules/FindTurboJPEG.cmake new file mode 100644 index 000000000..bbdb999a1 --- /dev/null +++ b/examples/protonect/cmake_modules/FindTurboJPEG.cmake @@ -0,0 +1,45 @@ +include(CheckCSourceCompiles) + +if(NOT TurboJPEG_INCLUDE_DIR) + if(WIN32) + set(DEFAULT_TurboJPEG_INCLUDE_DIR $ENV{TurboJPEG_ROOT}/include) + else() + set(DEFAULT_TurboJPEG_INCLUDE_DIR /opt/libjpeg-turbo/include) + endif() +else() + set(DEFAULT_TurboJPEG_INCLUDE_DIR ${TurboJPEG_INCLUDE_DIR}) + unset(TurboJPEG_INCLUDE_DIR) + unset(TurboJPEG_INCLUDE_DIR CACHE) +endif() + +find_path(TurboJPEG_INCLUDE_DIR turbojpeg.h DOC "TurboJPEG include directory (default: ${DEFAULT_TurboJPEG_INCLUDE_DIR})" HINTS ${DEFAULT_TurboJPEG_INCLUDE_DIR}) + +if(TurboJPEG_INCLUDE_DIR STREQUAL "TurboJPEG_INCLUDE_DIR-NOTFOUND") + message(FATAL_ERROR "Could not find turbojpeg.h - Try define TurboJPEG_ROOT as a system variable.") +else() + message(STATUS "TurboJPEG_INCLUDE_DIR = ${TurboJPEG_INCLUDE_DIR}") +endif() + + +if(WIN32) + set(DEFAULT_TurboJPEG_LIBRARY $ENV{TurboJPEG_ROOT}/lib/turbojpeg.lib) +else() + find_library(DEFAULT_TurboJPEG_LIBRARY NAMES libturbojpeg.so libturbojpeg.a HINTS /opt/libjpeg-turbo/lib64/ /opt/libjpeg-turbo/lib/) +endif() + +set(TurboJPEG_LIBRARY ${DEFAULT_TurboJPEG_LIBRARY} CACHE PATH "TurboJPEG library path (default: ${DEFAULT_TurboJPEG_LIBRARY})") + +if(WIN32) + set(CMAKE_REQUIRED_DEFINITIONS -MT) +endif() +set(CMAKE_REQUIRED_INCLUDES ${TurboJPEG_INCLUDE_DIR}) +set(CMAKE_REQUIRED_LIBRARIES ${TurboJPEG_LIBRARY}) +check_c_source_compiles("#include \nint main(void) { tjhandle h=tjInitCompress(); return 0; }" TURBOJPEG_WORKS) +set(CMAKE_REQUIRED_DEFINITIONS) +set(CMAKE_REQUIRED_INCLUDES) +set(CMAKE_REQUIRED_LIBRARIES) +if(NOT TURBOJPEG_WORKS) + message(FATAL_ERROR "Could not link with TurboJPEG library ${TurboJPEG_LIBRARY}. If it is installed in a different place, then set TurboJPEG_LIBRARY accordingly.") +endif() + +message(STATUS "TurboJPEG_LIBRARY = ${TurboJPEG_LIBRARY}")