[CMake] CMAKE_FIND_ROOT_PATH don't work as expected.
Alexander Neundorf
a.neundorf-work at gmx.net
Tue Apr 13 14:07:05 EDT 2010
On Tuesday 13 April 2010, Diego wrote:
> Hello,
> I'm trying to cross-compiling a library for the PSP platform, this is my
> toolchain:
>
> *# The name of the target operating system.
> set(CMAKE_SYSTEM_NAME Generic)
>
> # Which compilers to use for C and C++.
> set(CMAKE_C_COMPILER /usr/local/pspdev/bin/psp-gcc)
> set(CMAKE_CXX_COMPILER /usr/local/pspdev/bin/psp-g++)
>
> set(CMAKE_FIND_ROOT_PATH /usr/local/pspdev/psp)
>
> # Adjust the default behaviour of the FIND_XXX() commands:
> # search headers and libraries in the target environment, search
> # programs in the host environment.
> set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
> set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
> set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)*
>
>
> And this is the code (from CmakeLists.txt) to find the zlib.h header
> located in /usr/local/pspdev/psp/include:
>
> *cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
> if(COMMAND cmake_policy)
> cmake_policy(SET CMP0003 NEW)
> endif(COMMAND cmake_policy)
>
> if(NOT CMAKE_BUILD_TYPE)
> set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
> "Choose the type of build, options are:
> None Debug Release RelWithDebInfo MinSizeRel Profile."
> FORCE)
> endif()
> # Restrict configuration types to the selected build type.
> # Note: This needs to be done before the project command
> set(CMAKE_CONFIGURATION_TYPES "${CMAKE_BUILD_TYPE}" CACHE INTERNAL
> "internal")
>
> # Set the project name.
> project(MyLibrary C CXX)
>
> FIND_PATH(ZLIB_INCLUDE_DIR zlib.h)
>
> message(STATUS "zlib include dir ${ZLIB_INCLUDE_DIR}")*
>
> It returns not found but it should.
>
> Setting *CMAKE INCLUDE_PATH* to */usr/local/pspdev/psp/include *(and
> commenting the line set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) works as
> expected.
>
> What I'm doing wrong?
Without testing it...
You set CMAKE_SYSTEM_NAME to "Generic", so Modules/Platforms/Generic.cmake is
loaded. This file looks like this:
---------8<----------------8<-----------------------8<---------------
# This is a platform definition file for platforms without
# operating system, typically embedded platforms.
# It is used when CMAKE_SYSTEM_NAME is set to "Generic"
#
# It is intentionally empty, since nothing is known
# about the platform. So everything has to be specified
# in the system/compiler files ${CMAKE_SYSTEM_NAME}-<compiler_basename>.cmake
# and/or
${CMAKE_SYSTEM_NAME}-<compiler_basename>-${CMAKE_SYSTEM_PROCESSOR}.cmake
# (embedded) targets without operating system usually don't support shared
libraries
SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
---------8<----------------8<-----------------------8<---------------
IOW, it doesn't load e.g. UnixPaths.cmake, so CMAKE_SYSTEM_INCLUDE_PATH is
empty.
Maybe it would be a good idea to add at least include/, lib/ and bin/ as
default search paths in Generic.cmake.
Can you append the following code to Generic.cmake and see if it works then ?
SET(CMAKE_SYSTEM_INCLUDE_PATH /include "${CMAKE_INSTALL_PREFIX}/include")
SET(CMAKE_SYSTEM_LIBRARY_PATH /lib "${CMAKE_INSTALL_PREFIX}/lib")
SET(CMAKE_SYSTEM_PROGRAM_PATH /bin "${CMAKE_INSTALL_PREFIX}/bin")
Alex
More information about the CMake
mailing list