[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