[cmake-commits] alex committed CMakeDetermineCCompiler.cmake 1.39 1.39.2.1 CMakeDetermineCXXCompiler.cmake 1.34 1.34.2.1

cmake-commits at cmake.org cmake-commits at cmake.org
Tue May 1 14:23:30 EDT 2007


Update of /cvsroot/CMake/CMake/Modules
In directory public:/mounts/ram/cvs-serv17215

Modified Files:
      Tag: CMake-CrossCompileBasic
	CMakeDetermineCCompiler.cmake CMakeDetermineCXXCompiler.cmake 
Log Message:

ENH: add two new variables:
CMAKE_TOOLCHAIN_PREFIX: will be prepended to gcc, ar, g++, cc, c++ and ranlib if defined (gives e.g. arm-elf-gcc etc.)
CMAKE_TOOLCHAIN_LOCATION: if defined, the compilers will be searched only there, the other tools at first there, after that in other locations

If not already defined, both of them will be set by CMakeDetermineXXXCompiler.cmake and used by the other
one. If mixing the environment variable CC/CXX and these variables this can
give weird mixtures.

change order of compiler names for CXX: from c++, g++ to g++, c++ (same order as for C)

Alex


Index: CMakeDetermineCXXCompiler.cmake
===================================================================
RCS file: /cvsroot/CMake/CMake/Modules/CMakeDetermineCXXCompiler.cmake,v
retrieving revision 1.34
retrieving revision 1.34.2.1
diff -u -d -r1.34 -r1.34.2.1
--- CMakeDetermineCXXCompiler.cmake	28 Apr 2007 13:35:01 -0000	1.34
+++ CMakeDetermineCXXCompiler.cmake	1 May 2007 18:23:28 -0000	1.34.2.1
@@ -5,13 +5,21 @@
 # use environment variable CXX first if defined by user, next use 
 # the cmake variable CMAKE_GENERATOR_CXX which can be defined by a generator
 # as a default compiler
+# If the cmake variable CMAKE_TOOLCHAIN_PREFIX is set, this is used as
+# prefix for the tools (e.g. arm-elf-g++ etc.)
+# If the cmake variable CMAKE_TOOLCHAIN_LOCATION is set, the compiler is
+# searched only there. The other tools are at first searched there, then 
+# also in the default locations.
 #
 # Sets the following variables:
 #   CMAKE_CXX_COMPILER
 #   CMAKE_COMPILER_IS_GNUCXX
 #   CMAKE_AR
 #   CMAKE_RANLIB
-
+#
+# If not already set before, it also sets
+#   CMAKE_TOOLCHAIN_PREFIX
+#   CMAKE_TOOLCHAIN_LOCATION
 
 IF(NOT CMAKE_CXX_COMPILER)
   SET(CMAKE_CXX_COMPILER_INIT NOTFOUND)
@@ -22,10 +30,9 @@
     IF(CMAKE_CXX_FLAGS_ENV_INIT)
       SET(CMAKE_CXX_COMPILER_ARG1 "${CMAKE_CXX_FLAGS_ENV_INIT}" CACHE STRING "First argument to CXX compiler")
     ENDIF(CMAKE_CXX_FLAGS_ENV_INIT)
-    IF(EXISTS ${CMAKE_CXX_COMPILER_INIT})
-    ELSE(EXISTS ${CMAKE_CXX_COMPILER_INIT})
+    IF(NOT EXISTS ${CMAKE_CXX_COMPILER_INIT})
       MESSAGE(FATAL_ERROR "Could not find compiler set in environment variable CXX:\n$ENV{CXX}.\n${CMAKE_CXX_COMPILER_INIT}")
-    ENDIF(EXISTS ${CMAKE_CXX_COMPILER_INIT})
+    ENDIF(NOT EXISTS ${CMAKE_CXX_COMPILER_INIT})
   ENDIF($ENV{CXX} MATCHES ".+")
 
   # next prefer the generator specified compiler
@@ -39,23 +46,42 @@
   IF(CMAKE_CXX_COMPILER_INIT)
     SET(CMAKE_CXX_COMPILER_LIST ${CMAKE_CXX_COMPILER_INIT})
   ELSE(CMAKE_CXX_COMPILER_INIT)
-    SET(CMAKE_CXX_COMPILER_LIST c++ g++ CC aCC cl bcc xlC)
+    SET(CMAKE_CXX_COMPILER_LIST ${CMAKE_TOOLCHAIN_PREFIX}g++ ${CMAKE_TOOLCHAIN_PREFIX}c++ CC aCC cl bcc xlC)
   ENDIF(CMAKE_CXX_COMPILER_INIT)
 
   # Find the compiler.
-  FIND_PROGRAM(CMAKE_CXX_COMPILER NAMES ${CMAKE_CXX_COMPILER_LIST} DOC "C++ compiler")
+  IF (CMAKE_TOOLCHAIN_LOCATION)
+    FIND_PROGRAM(CMAKE_CXX_COMPILER NAMES ${CMAKE_CXX_COMPILER_LIST} PATHS ${CMAKE_TOOLCHAIN_LOCATION} DOC "C++ compiler" NO_DEFAULT_PATH)
+  ELSE (CMAKE_TOOLCHAIN_LOCATION)
+    FIND_PROGRAM(CMAKE_CXX_COMPILER NAMES ${CMAKE_CXX_COMPILER_LIST} DOC "C++ compiler")
+  ENDIF (CMAKE_TOOLCHAIN_LOCATION)
+  
   IF(CMAKE_CXX_COMPILER_INIT AND NOT CMAKE_CXX_COMPILER)
     SET(CMAKE_CXX_COMPILER "${CMAKE_CXX_COMPILER_INIT}" CACHE FILEPATH "C++ compiler" FORCE)
   ENDIF(CMAKE_CXX_COMPILER_INIT AND NOT CMAKE_CXX_COMPILER)
 ENDIF(NOT CMAKE_CXX_COMPILER)
 MARK_AS_ADVANCED(CMAKE_CXX_COMPILER)
 
-GET_FILENAME_COMPONENT(COMPILER_LOCATION "${CMAKE_CXX_COMPILER}" PATH)
+IF (NOT CMAKE_TOOLCHAIN_LOCATION)
+  GET_FILENAME_COMPONENT(CMAKE_TOOLCHAIN_LOCATION "${CMAKE_CXX_COMPILER}" PATH)
+ENDIF (NOT CMAKE_TOOLCHAIN_LOCATION)
 
-FIND_PROGRAM(CMAKE_AR NAMES ar PATHS ${COMPILER_LOCATION})
+# if we have a g++ cross compiler, they have usually some prefix, like 
+# e.g. powerpc-linux-g++, arm-elf-g++ or i586-mingw32msvc-g++
+# the other tools of the toolchain usually have the same prefix
+IF (NOT CMAKE_TOOLCHAIN_PREFIX)
+  GET_FILENAME_COMPONENT(COMPILER_BASENAME "${CMAKE_CXX_COMPILER}" NAME_WE)
+  IF (COMPILER_BASENAME MATCHES "^(.+-)[gc]\\+\\+")
+    STRING(REGEX REPLACE "^(.+-)[gc]\\+\\+"  "\\1" CMAKE_TOOLCHAIN_PREFIX "${COMPILER_BASENAME}")
+  ENDIF (COMPILER_BASENAME MATCHES "^(.+-)[gc]\\+\\+")
+ENDIF (NOT CMAKE_TOOLCHAIN_PREFIX)
+
+FIND_PROGRAM(CMAKE_AR NAMES ${CMAKE_TOOLCHAIN_PREFIX}ar PATHS ${CMAKE_TOOLCHAIN_LOCATION} NO_DEFAULT_PATH)
+FIND_PROGRAM(CMAKE_AR NAMES ${CMAKE_TOOLCHAIN_PREFIX}ar)
 MARK_AS_ADVANCED(CMAKE_AR)
 
-FIND_PROGRAM(CMAKE_RANLIB NAMES ranlib)
+FIND_PROGRAM(CMAKE_RANLIB NAMES ${CMAKE_TOOLCHAIN_PREFIX}ranlib ${CMAKE_TOOLCHAIN_LOCATION} NO_DEFAULT_PATH)
+FIND_PROGRAM(CMAKE_RANLIB NAMES ${CMAKE_TOOLCHAIN_PREFIX}ranlib)
 IF(NOT CMAKE_RANLIB)
    SET(CMAKE_RANLIB : CACHE INTERNAL "noop for ranlib")
 ENDIF(NOT CMAKE_RANLIB)

Index: CMakeDetermineCCompiler.cmake
===================================================================
RCS file: /cvsroot/CMake/CMake/Modules/CMakeDetermineCCompiler.cmake,v
retrieving revision 1.39
retrieving revision 1.39.2.1
diff -u -d -r1.39 -r1.39.2.1
--- CMakeDetermineCCompiler.cmake	28 Apr 2007 13:35:01 -0000	1.39
+++ CMakeDetermineCCompiler.cmake	1 May 2007 18:23:28 -0000	1.39.2.1
@@ -2,9 +2,24 @@
 # determine the compiler to use for C programs
 # NOTE, a generator may set CMAKE_C_COMPILER before
 # loading this file to force a compiler.
-# use environment variable CCC first if defined by user, next use 
+# use environment variable CC first if defined by user, next use 
 # the cmake variable CMAKE_GENERATOR_CC which can be defined by a generator
 # as a default compiler
+# If the cmake variable CMAKE_TOOLCHAIN_PREFIX is set, this is used as
+# prefix for the tools (e.g. arm-elf-gcc etc.)
+# If the cmake variable CMAKE_TOOLCHAIN_LOCATION is set, the compiler is
+# searched only there. The other tools are at first searched there, then 
+# also in the default locations.
+#
+# Sets the following variables: 
+#   CMAKE_C_COMPILER
+#   CMAKE_AR
+#   CMAKE_RANLIB
+#   CMAKE_COMPILER_IS_GNUCC
+#
+# If not already set before, it also sets
+#   CMAKE_TOOLCHAIN_PREFIX
+#   CMAKE_TOOLCHAIN_LOCATION
 
 IF(NOT CMAKE_C_COMPILER)
   SET(CMAKE_CXX_COMPILER_INIT NOTFOUND)
@@ -15,10 +30,9 @@
     IF(CMAKE_C_FLAGS_ENV_INIT)
       SET(CMAKE_C_COMPILER_ARG1 "${CMAKE_C_FLAGS_ENV_INIT}" CACHE STRING "First argument to C compiler")
     ENDIF(CMAKE_C_FLAGS_ENV_INIT)
-    IF(EXISTS ${CMAKE_C_COMPILER_INIT})
-    ELSE(EXISTS ${CMAKE_C_COMPILER_INIT})
+    IF(NOT EXISTS ${CMAKE_C_COMPILER_INIT})
       MESSAGE(FATAL_ERROR "Could not find compiler set in environment variable CC:\n$ENV{CC}.") 
-    ENDIF(EXISTS ${CMAKE_C_COMPILER_INIT})
+    ENDIF(NOT EXISTS ${CMAKE_C_COMPILER_INIT})
   ENDIF($ENV{CC} MATCHES ".+")
 
   # next try prefer the compiler specified by the generator
@@ -32,22 +46,42 @@
   IF(CMAKE_C_COMPILER_INIT)
     SET(CMAKE_C_COMPILER_LIST ${CMAKE_C_COMPILER_INIT})
   ELSE(CMAKE_C_COMPILER_INIT)
-    SET(CMAKE_C_COMPILER_LIST gcc cc cl bcc xlc)
+    SET(CMAKE_C_COMPILER_LIST ${CMAKE_TOOLCHAIN_PREFIX}gcc ${CMAKE_TOOLCHAIN_PREFIX}cc cl bcc xlc)
   ENDIF(CMAKE_C_COMPILER_INIT)
 
   # Find the compiler.
-  FIND_PROGRAM(CMAKE_C_COMPILER NAMES ${CMAKE_C_COMPILER_LIST} DOC "C compiler")
+  IF (CMAKE_TOOLCHAIN_LOCATION)
+    FIND_PROGRAM(CMAKE_C_COMPILER NAMES ${CMAKE_C_COMPILER_LIST} PATHS ${CMAKE_TOOLCHAIN_LOCATION} DOC "C compiler" NO_DEFAULT_PATH)
+  ELSE (CMAKE_TOOLCHAIN_LOCATION)
+    FIND_PROGRAM(CMAKE_C_COMPILER NAMES ${CMAKE_C_COMPILER_LIST} DOC "C compiler")
+  ENDIF (CMAKE_TOOLCHAIN_LOCATION)
+  
   IF(CMAKE_C_COMPILER_INIT AND NOT CMAKE_C_COMPILER)
     SET(CMAKE_C_COMPILER "${CMAKE_C_COMPILER_INIT}" CACHE FILEPATH "C compiler" FORCE)
   ENDIF(CMAKE_C_COMPILER_INIT AND NOT CMAKE_C_COMPILER)
 ENDIF(NOT CMAKE_C_COMPILER)
 MARK_AS_ADVANCED(CMAKE_C_COMPILER)  
-GET_FILENAME_COMPONENT(COMPILER_LOCATION "${CMAKE_C_COMPILER}"
-  PATH)
+  
+IF (NOT CMAKE_TOOLCHAIN_LOCATION)
+  GET_FILENAME_COMPONENT(CMAKE_TOOLCHAIN_LOCATION "${CMAKE_C_COMPILER}" PATH)
+ENDIF (NOT CMAKE_TOOLCHAIN_LOCATION)
 
-FIND_PROGRAM(CMAKE_AR NAMES ar PATHS ${COMPILER_LOCATION} )
+# if we have a gcc cross compiler, they have usually some prefix, like 
+# e.g. powerpc-linux-gcc, arm-elf-gcc or i586-mingw32msvc-gcc
+# the other tools of the toolchain usually have the same prefix
+IF (NOT CMAKE_TOOLCHAIN_PREFIX)
+  GET_FILENAME_COMPONENT(COMPILER_BASENAME "${CMAKE_C_COMPILER}" NAME_WE)
+  IF (COMPILER_BASENAME MATCHES "^(.+-)g?cc")
+    STRING(REGEX REPLACE "^(.+-)g?cc"  "\\1" CMAKE_TOOLCHAIN_PREFIX "${COMPILER_BASENAME}")
+  ENDIF (COMPILER_BASENAME MATCHES "^(.+-)g?cc")
+ENDIF (NOT CMAKE_TOOLCHAIN_PREFIX)
 
-FIND_PROGRAM(CMAKE_RANLIB NAMES ranlib)
+FIND_PROGRAM(CMAKE_AR NAMES ${CMAKE_TOOLCHAIN_PREFIX}ar PATHS ${CMAKE_TOOLCHAIN_LOCATION} NO_DEFAULT_PATH)
+FIND_PROGRAM(CMAKE_AR NAMES ${CMAKE_TOOLCHAIN_LOCATION}ar)
+MARK_AS_ADVANCED(CMAKE_AR)
+
+FIND_PROGRAM(CMAKE_RANLIB NAMES ${CMAKE_TOOLCHAIN_PREFIX}ranlib ${CMAKE_TOOLCHAIN_LOCATION} NO_DEFAULT_PATH)
+FIND_PROGRAM(CMAKE_RANLIB NAMES ${CMAKE_TOOLCHAIN_PREFIX}ranlib)
 IF(NOT CMAKE_RANLIB)
    SET(CMAKE_RANLIB : CACHE INTERNAL "noop for ranlib")
 ENDIF(NOT CMAKE_RANLIB)
@@ -62,6 +96,7 @@
   # the user may be using an integrated Intel compiler.
   # SET(CMAKE_C_COMPILER_ID "MSVC")
 ENDIF(${CMAKE_GENERATOR} MATCHES "Visual Studio")
+
 IF(NOT CMAKE_C_COMPILER_ID_RUN)
   SET(CMAKE_C_COMPILER_ID_RUN 1)
 
@@ -84,6 +119,5 @@
 # configure variables set in this file for fast reload later on
 CONFIGURE_FILE(${CMAKE_ROOT}/Modules/CMakeCCompiler.cmake.in 
                "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCCompiler.cmake" IMMEDIATE)
-MARK_AS_ADVANCED(CMAKE_AR)
 
 SET(CMAKE_C_COMPILER_ENV_VAR "CC")



More information about the Cmake-commits mailing list