mitsuba/data/cmake/MitsubaExternal.cmake

293 lines
9.8 KiB
CMake

###############################################################################
# EXTERNAL LIBRARIES DETECTION #
###############################################################################
if (NOT DEFINED MTS_VERSION)
message(FATAL_ERROR "This file has to be included from the main build file.")
endif()
# Set up CMake to use the Mitsuba bundled libraries. Set the variable
# "MTS_NO_DEPENDENCIES" to a value which evaluates to TRUE to avoid
# using the Mitsuba dependencies even if they are present.
if (MSVC)
set(MTS_DEPS_SUFFIX "_windows")
else()
set(MTS_DEPS_SUFFIX "_macos")
endif()
set(MTS_DEPS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/dependencies${MTS_DEPS_SUFFIX}")
if((MSVC OR APPLE) AND NOT MTS_NO_DEPENDENCIES AND
IS_DIRECTORY "${MTS_DEPS_DIR}")
set(MTS_DEPENDENCIES ON)
set(CMAKE_PROGRAM_PATH "${MTS_DEPS_DIR}/bin")
set(CMAKE_INCLUDE_PATH "${MTS_DEPS_DIR}/include")
set(Boost_NO_SYSTEM_PATHS TRUE)
if (MSVC)
math(EXPR MTS_MSVC_VERSION "(${MSVC_VERSION} - 600) / 100")
set(MTS_MSVC_VERSION "vc${MTS_MSVC_VERSION}")
if(CMAKE_CL_64)
set(MTS_PLATFORM "x64_${MTS_MSVC_VERSION}")
else()
set(MTS_PLATFORM "i386_${MTS_MSVC_VERSION}")
endif()
list(APPEND CMAKE_INCLUDE_PATH "${MTS_DEPS_DIR}/qt/include")
set(CMAKE_LIBRARY_PATH "${MTS_DEPS_DIR}/lib/${MTS_PLATFORM}/"
"${MTS_DEPS_DIR}/qt/${MTS_PLATFORM}/lib/")
set(QT_BINARY_DIR "${MTS_DEPS_DIR}/qt/${MTS_PLATFORM}/bin")
elseif(APPLE)
set(CMAKE_LIBRARY_PATH "${MTS_DEPS_DIR}/lib")
set(CMAKE_FRAMEWORK_PATH "${MTS_DEPS_DIR}/frameworks")
set(QT_BINARY_DIR "${MTS_DEPS_DIR}/bin")
# Create a shell script to set the paths for dyld
file(WRITE "${PROJECT_BINARY_DIR}/binaries/mitsuba_dyld.sh"
"#!/bin/sh
# DYLD paths for the mitsuba dependencies. Created automatically by CMake.
export DYLD_FALLBACK_FRAMEWORK_PATH=\"${MTS_DEPS_DIR}/frameworks\":$DYLD_FALLBACK_FRAMEWORK_PATH
export DYLD_FALLBACK_LIBRARY_PATH=\"${MTS_DEPS_DIR}/lib\":$DYLD_FALLBACK_LIBRARY_PATH
")
endif()
else()
set(MTS_DEPENDENCIES OFF)
unset(MTS_DEPS_DIR)
endif()
# Qt4 (optional)
find_package(Qt4 4.7 COMPONENTS
QtCore QtGui QtXml QtXmlPatterns QtNetwork QtOpenGL)
CMAKE_DEPENDENT_OPTION(BUILD_GUI "Built the Qt4-based mitsuba GUI." ON
"QT4_FOUND" OFF)
# System threading library, used for custom options
set(CMAKE_THREAD_PREFER_PTHREAD ON)
find_package(Threads REQUIRED)
###########################################################################
# Boost
find_package(Boost 1.44 REQUIRED COMPONENTS "filesystem" "system" "thread")
# As of CMake 2.8.2, FindBoost doesn't honor the "REQUIRED" flag
if (NOT Boost_FOUND)
set(BOOST_ROOT "" CACHE PATH
"Preferred installation prefix for searching for Boost.")
message(FATAL_ERROR
"Boost is missing. The required modules are math, filesystem and system.")
endif()
mark_as_advanced(Boost_LIB_DIAGNOSTIC_DEFINITIONS)
# Check if spirit works: the version of Clang in Ubuntu 11.04 does not support
# the system version of Boost Spirit
set(CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIRS})
set(CMAKE_REQUIRED_LIBRARIES ${Boost_LIBRARIES})
CHECK_CXX_SOURCE_COMPILES("
#include <boost/spirit/include/qi.hpp>
int main (int argc, char **argv) {
return 0;
}
" BOOST_SPIRIT_WORKS)
# Try to figure out if this boost distro has Boost::python. If we include
# python in the main boost components list above, CMake will abort if it
# is not found. So we resort to checking for the boost_python library's
# existence to get a soft failure
if ((APPLE OR WIN32) AND MTS_DEPENDENCIES)
set(mts_boost_python_names boost_python boost_python27
boost_python32 boost_python33 boost_python)
else()
set(mts_boost_python_names boost_python)
endif()
find_library (mts_boost_python_lib NAMES ${mts_boost_python_names}
HINTS ${Boost_LIBRARY_DIRS} NO_DEFAULT_PATH)
mark_as_advanced (mts_boost_python_lib)
if (NOT mts_boost_python_lib AND Boost_SYSTEM_LIBRARY_RELEASE)
get_filename_component (mts_boost_SYSTEM_rel
${Boost_SYSTEM_LIBRARY_RELEASE} NAME)
set(mts_boost_PYTHON_rel_names "")
foreach (name ${mts_boost_python_names})
string (REGEX REPLACE "^(.*)boost_system(.+)$" "\\1${name}\\2"
mts_boost_PYTHON_rel ${mts_boost_SYSTEM_rel})
list(APPEND mts_boost_PYTHON_rel_names ${mts_boost_PYTHON_rel})
endforeach()
find_library (mts_boost_PYTHON_LIBRARY_RELEASE
NAMES ${mts_boost_PYTHON_rel_names}
HINTS ${Boost_LIBRARY_DIRS}
NO_DEFAULT_PATH)
mark_as_advanced (mts_boost_PYTHON_LIBRARY_RELEASE)
endif ()
if (NOT mts_boost_python_lib AND Boost_SYSTEM_LIBRARY_DEBUG)
get_filename_component (mts_boost_SYSTEM_dbg
${Boost_SYSTEM_LIBRARY_DEBUG} NAME)
set(mts_boost_PYTHON_dbg_names "")
foreach (name ${mts_boost_python_names})
string (REGEX REPLACE "^(.*)boost_system(.+)$" "\\1${name}\\2"
mts_boost_PYTHON_dbg ${mts_boost_SYSTEM_dbg})
list(APPEND mts_boost_PYTHON_dbg_names ${mts_boost_PYTHON_dbg})
endforeach()
find_library (mts_boost_PYTHON_LIBRARY_DEBUG
NAMES ${mts_boost_PYTHON_dbg_names}
HINTS ${Boost_LIBRARY_DIRS}
NO_DEFAULT_PATH)
mark_as_advanced (mts_boost_PYTHON_LIBRARY_DEBUG)
endif ()
if (mts_boost_python_lib OR
mts_boost_PYTHON_LIBRARY_RELEASE OR mts_boost_PYTHON_LIBRARY_DEBUG)
set (mts_boost_PYTHON_FOUND ON)
else ()
set (mts_boost_PYTHON_FOUND OFF)
endif ()
###########################################################################
find_package(Eigen 3.0 REQUIRED)
find_package(JPEG 6 REQUIRED)
find_package(ZLIB 1.2 REQUIRED)
find_package(PNG 1.2 REQUIRED)
add_definitions(${PNG_DEFINITIONS})
find_package(IlmBase)
find_package(OpenEXR)
if (OPENEXR_FOUND AND WIN32)
set(CMAKE_REQUIRED_INCLUDES ${ILMBASE_INCLUDE_DIRS} ${OPENEXR_INCLUDE_DIRS})
set(CMAKE_REQUIRED_LIBRARIES ${ILMBASE_LIBRARIES} ${OPENEXR_LIBRARIES})
CHECK_CXX_SOURCE_COMPILES("
#define OPENEXR_DLL
#include <OpenEXR/half.h>
#include <OpenEXR/ImfRgbaFile.h>
int main(int argc, char **argv) {
half x = 1.5f;
Imf::RgbaInputFile file(static_cast<const char*>(0));
file.readPixels(0,0);
return x > 0 ? 0 : 1;
}
" OPENEXR_IS_DLL)
unset (CMAKE_REQUIRED_INCLUDES)
unset (CMAKE_REQUIRED_LIBRARIES)
if (OPENEXR_IS_DLL)
add_definitions(-DOPENEXR_DLL)
endif()
endif()
# XERCES_ROOT_DIR
find_package(Xerces 3.0 REQUIRED)
# ColladaDOM (optional)
find_package(COLLADA)
if (COLLADA_FOUND)
add_definitions(-DMTS_HAS_COLLADA=1)
endif()
# FFTW3 (optional)
find_package(FFTW3)
CMAKE_DEPENDENT_OPTION(MTS_FFTW "Enable FFTW3 for fast image convolution support." ON
"FFTW3_FOUND" OFF)
if (MTS_FFTW)
add_definitions(-DMTS_HAS_FFTW=1)
endif()
find_package(OpenGL REQUIRED)
set (GLEW_MX ON)
find_package(GLEW REQUIRED)
if (GLEW_FOUND)
set (GLEW_STATE_VARS ${GLEW_INCLUDE_DIRS} ${GLEW_LIBRARIES})
if (NOT GLEW_TEST_STATE)
set (GLEW_TEST_STATE "${GLEW_STATE_VARS}" CACHE INTERNAL "GLEW State")
endif ()
if (NOT GLEW_TEST_STATE STREQUAL "${GLEW_STATE_VARS}")
set (GLEW_TEST_STATE "${GLEW_STATE_VARS}" CACHE INTERNAL "GLEW State" FORCE)
unset (GLEW_VERSION_IS_OK CACHE)
endif ()
set (CMAKE_REQUIRED_INCLUDES ${GLEW_INCLUDE_DIRS})
set (CMAKE_REQUIRED_LIBRARIES ${GLEW_LIBRARIES})
CHECK_CXX_SOURCE_COMPILES("
#if defined(__APPLE__)
#include <OpenGL/glew.h>
#else
#include <GL/glew.h>
#endif
int main (int argc, char **argv) {
int i = GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV;
return 0;
}
" GLEW_VERSION_IS_OK)
if (NOT GLEW_VERSION_IS_OK)
# message (SEND_ERROR "The version of GLEW seems to be outdated!") XXX
endif ()
endif ()
# Try to get OpenMP support
find_package(OpenMP)
CMAKE_DEPENDENT_OPTION(MTS_OPENMP "Enable OpenMP support" ON
"OPENMP_FOUND" OFF)
if (MTS_OPENMP)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
else ()
add_definitions (-DMTS_NO_OPENMP)
endif()
# Linux requires X11
if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
find_package(X11 REQUIRED)
if (NOT X11_xf86vmode_FOUND)
message(FATAL_ERROR "X11 vmode was not found.")
endif()
endif()
# Mac OS X Frameworks
if (APPLE)
find_library(COCOA_LIBRARY Cocoa)
find_library(BWTOOLKIT_LIBRARY BWToolkitFramework)
find_path(BWTOOLKIT_INCLUDE_DIR BWToolkitFramework/BWToolkitFramework.h)
find_library (SECURITY_LIBRARY Security
NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH)
find_path(SECURITY_INCLUDE_DIR "Authorization.h"
NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH)
mark_as_advanced (COCOA_LIBRARY)
mark_as_advanced (BWTOOLKIT_LIBRARY BWTOOLKIT_INCLUDE_DIR)
mark_as_advanced (SECURITY_LIBRARY SECURITY_INCLUDE_DIR)
endif()
# The Python libraries. When using the built-in dependencies we need
# to specify the include directory, otherwise CMake finds the one
# from the local installation using the Windows registry / OSX Frameworks
if (MTS_DEPENDENCIES AND NOT PYTHON_INCLUDE_DIR AND
EXISTS "${MTS_DEPS_DIR}/include/python27")
set(PYTHON_INCLUDE_DIR "${MTS_DEPS_DIR}/include/python27"
CACHE STRING "Path to the Python include directory.")
endif()
find_package (PythonLibs "2.6")
CMAKE_DEPENDENT_OPTION(BUILD_PYTHON "Build the Python bindings." ON
"PYTHONLIBS_FOUND;mts_boost_PYTHON_FOUND" OFF)
if (PYTHONLIBS_FOUND AND mts_boost_PYTHON_FOUND)
set (PYTHON_FOUND TRUE)
endif ()
# Includes for the common libraries
include_directories(${Boost_INCLUDE_DIRS} ${Eigen_INCLUDE_DIR})
# If we are using the system OpenEXR, add its headers which half.h requires
if (OPENEXR_FOUND)
include_directories(${ILMBASE_INCLUDE_DIRS})
endif()
# Image format definitions
if (PNG_FOUND)
add_definitions(-DMTS_HAS_LIBPNG=1)
endif()
if (JPEG_FOUND)
add_definitions(-DMTS_HAS_LIBJPEG=1)
endif()
if (OPENEXR_FOUND)
add_definitions(-DMTS_HAS_OPENEXR=1)
endif()