diff options
Diffstat (limited to 'Modules/CMakeDetermineSystem.cmake')
-rw-r--r-- | Modules/CMakeDetermineSystem.cmake | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/Modules/CMakeDetermineSystem.cmake b/Modules/CMakeDetermineSystem.cmake new file mode 100644 index 000000000..7ae377517 --- /dev/null +++ b/Modules/CMakeDetermineSystem.cmake @@ -0,0 +1,176 @@ + +#============================================================================= +# Copyright 2002-2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +# This module is used by the Makefile generator to determin the following variables: +# CMAKE_SYSTEM_NAME - on unix this is uname -s, for windows it is Windows +# CMAKE_SYSTEM_VERSION - on unix this is uname -r, for windows it is empty +# CMAKE_SYSTEM - ${CMAKE_SYSTEM}-${CMAKE_SYSTEM_VERSION}, for windows: ${CMAKE_SYSTEM} +# +# Expected uname -s output: +# +# AIX AIX +# BSD/OS BSD/OS +# FreeBSD FreeBSD +# HP-UX HP-UX +# IRIX IRIX +# Linux Linux +# GNU/kFreeBSD GNU/kFreeBSD +# NetBSD NetBSD +# OpenBSD OpenBSD +# OFS/1 (Digital Unix) OSF1 +# SCO OpenServer 5 SCO_SV +# SCO UnixWare 7 UnixWare +# SCO UnixWare (pre release 7) UNIX_SV +# SCO XENIX Xenix +# Solaris SunOS +# SunOS SunOS +# Tru64 Tru64 +# Ultrix ULTRIX +# cygwin CYGWIN_NT-5.1 +# MacOSX Darwin + + +# find out on which system cmake runs +IF(CMAKE_HOST_UNIX) + FIND_PROGRAM(CMAKE_UNAME uname /bin /usr/bin /usr/local/bin ) + IF(CMAKE_UNAME) + EXEC_PROGRAM(uname ARGS -s OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_NAME) + EXEC_PROGRAM(uname ARGS -r OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_VERSION) + IF(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|CYGWIN.*") + EXEC_PROGRAM(uname ARGS -m OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_PROCESSOR + RETURN_VALUE val) + ELSEIF(CMAKE_HOST_SYSTEM_NAME MATCHES "OpenBSD") + EXEC_PROGRAM(arch ARGS -s OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_PROCESSOR + RETURN_VALUE val) + ELSE() + EXEC_PROGRAM(uname ARGS -p OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_PROCESSOR + RETURN_VALUE val) + IF("${val}" GREATER 0) + EXEC_PROGRAM(uname ARGS -m OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_PROCESSOR + RETURN_VALUE val) + ENDIF("${val}" GREATER 0) + ENDIF() + # check the return of the last uname -m or -p + IF("${val}" GREATER 0) + SET(CMAKE_HOST_SYSTEM_PROCESSOR "unknown") + ENDIF("${val}" GREATER 0) + SET(CMAKE_UNAME ${CMAKE_UNAME} CACHE INTERNAL "uname command") + # processor may have double quote in the name, and that needs to be removed + STRING(REGEX REPLACE "\"" "" CMAKE_HOST_SYSTEM_PROCESSOR "${CMAKE_HOST_SYSTEM_PROCESSOR}") + STRING(REGEX REPLACE "/" "_" CMAKE_HOST_SYSTEM_PROCESSOR "${CMAKE_HOST_SYSTEM_PROCESSOR}") + ENDIF(CMAKE_UNAME) +ELSE(CMAKE_HOST_UNIX) + IF(CMAKE_HOST_WIN32) + SET (CMAKE_HOST_SYSTEM_NAME "Windows") + SET (CMAKE_HOST_SYSTEM_PROCESSOR "$ENV{PROCESSOR_ARCHITECTURE}") + ENDIF(CMAKE_HOST_WIN32) +ENDIF(CMAKE_HOST_UNIX) + +# if a toolchain file is used, the user wants to cross compile. +# in this case read the toolchain file and keep the CMAKE_HOST_SYSTEM_* +# variables around so they can be used in CMakeLists.txt. +# In all other cases, the host and target platform are the same. +IF(CMAKE_TOOLCHAIN_FILE) + # at first try to load it as path relative to the directory from which cmake has been run + INCLUDE("${CMAKE_BINARY_DIR}/${CMAKE_TOOLCHAIN_FILE}" OPTIONAL RESULT_VARIABLE _INCLUDED_TOOLCHAIN_FILE) + IF(NOT _INCLUDED_TOOLCHAIN_FILE) + # if the file isn't found there, check the default locations + INCLUDE("${CMAKE_TOOLCHAIN_FILE}" OPTIONAL RESULT_VARIABLE _INCLUDED_TOOLCHAIN_FILE) + ENDIF(NOT _INCLUDED_TOOLCHAIN_FILE) + + IF(_INCLUDED_TOOLCHAIN_FILE) + SET(CMAKE_TOOLCHAIN_FILE "${_INCLUDED_TOOLCHAIN_FILE}" CACHE FILEPATH "The CMake toolchain file" FORCE) + ELSE(_INCLUDED_TOOLCHAIN_FILE) + MESSAGE(FATAL_ERROR "Could not find toolchain file: ${CMAKE_TOOLCHAIN_FILE}") + SET(CMAKE_TOOLCHAIN_FILE "NOTFOUND" CACHE FILEPATH "The CMake toolchain file" FORCE) + ENDIF(_INCLUDED_TOOLCHAIN_FILE) +ENDIF(CMAKE_TOOLCHAIN_FILE) + + +# if CMAKE_SYSTEM_NAME is here already set, either it comes from a toolchain file +# or it was set via -DCMAKE_SYSTEM_NAME=... +# if that's the case, assume we are crosscompiling +IF(CMAKE_SYSTEM_NAME) + IF(NOT DEFINED CMAKE_CROSSCOMPILING) + SET(CMAKE_CROSSCOMPILING TRUE) + ENDIF(NOT DEFINED CMAKE_CROSSCOMPILING) + SET(PRESET_CMAKE_SYSTEM_NAME TRUE) +ELSE(CMAKE_SYSTEM_NAME) + SET(CMAKE_SYSTEM_NAME "${CMAKE_HOST_SYSTEM_NAME}") + SET(CMAKE_SYSTEM_VERSION "${CMAKE_HOST_SYSTEM_VERSION}") + SET(CMAKE_SYSTEM_PROCESSOR "${CMAKE_HOST_SYSTEM_PROCESSOR}") + SET(CMAKE_CROSSCOMPILING FALSE) + SET(PRESET_CMAKE_SYSTEM_NAME FALSE) +ENDIF(CMAKE_SYSTEM_NAME) + + +MACRO(ADJUST_CMAKE_SYSTEM_VARIABLES _PREFIX) + IF(NOT ${_PREFIX}_NAME) + SET(${_PREFIX}_NAME "UnknownOS") + ENDIF(NOT ${_PREFIX}_NAME) + + # fix for BSD/OS , remove the / + IF(${_PREFIX}_NAME MATCHES BSD.OS) + SET(${_PREFIX}_NAME BSDOS) + ENDIF(${_PREFIX}_NAME MATCHES BSD.OS) + + # fix for GNU/kFreeBSD, remove the GNU/ + IF(${_PREFIX}_NAME MATCHES kFreeBSD) + SET(${_PREFIX}_NAME kFreeBSD) + ENDIF(${_PREFIX}_NAME MATCHES kFreeBSD) + + # fix for CYGWIN which has windows version in it + IF(${_PREFIX}_NAME MATCHES CYGWIN) + SET(${_PREFIX}_NAME CYGWIN) + ENDIF(${_PREFIX}_NAME MATCHES CYGWIN) + + # set CMAKE_SYSTEM to the CMAKE_SYSTEM_NAME + SET(${_PREFIX} ${${_PREFIX}_NAME}) + # if there is a CMAKE_SYSTEM_VERSION then add a -${CMAKE_SYSTEM_VERSION} + IF(${_PREFIX}_VERSION) + SET(${_PREFIX} ${${_PREFIX}}-${${_PREFIX}_VERSION}) + ENDIF(${_PREFIX}_VERSION) + +ENDMACRO(ADJUST_CMAKE_SYSTEM_VARIABLES _PREFIX) + +ADJUST_CMAKE_SYSTEM_VARIABLES(CMAKE_SYSTEM) +ADJUST_CMAKE_SYSTEM_VARIABLES(CMAKE_HOST_SYSTEM) + +# this file is also executed from cpack, then we don't need to generate these files +# in this case there is no CMAKE_BINARY_DIR +IF(CMAKE_BINARY_DIR) + # write entry to the log file + IF(PRESET_CMAKE_SYSTEM_NAME) + FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "The target system is: ${CMAKE_SYSTEM_NAME} - ${CMAKE_SYSTEM_VERSION} - ${CMAKE_SYSTEM_PROCESSOR}\n") + FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "The host system is: ${CMAKE_HOST_SYSTEM_NAME} - ${CMAKE_HOST_SYSTEM_VERSION} - ${CMAKE_HOST_SYSTEM_PROCESSOR}\n") + ELSE(PRESET_CMAKE_SYSTEM_NAME) + FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "The system is: ${CMAKE_SYSTEM_NAME} - ${CMAKE_SYSTEM_VERSION} - ${CMAKE_SYSTEM_PROCESSOR}\n") + ENDIF(PRESET_CMAKE_SYSTEM_NAME) + + # if a toolchain file is used, it needs to be included in the configured file, + # so settings done there are also available if they don't go in the cache and in TRY_COMPILE() + SET(INCLUDE_CMAKE_TOOLCHAIN_FILE_IF_REQUIRED) + IF(DEFINED CMAKE_TOOLCHAIN_FILE) + SET(INCLUDE_CMAKE_TOOLCHAIN_FILE_IF_REQUIRED "INCLUDE(\"${CMAKE_TOOLCHAIN_FILE}\")") + ENDIF(DEFINED CMAKE_TOOLCHAIN_FILE) + + # configure variables set in this file for fast reload, the template file is defined at the top of this file + CONFIGURE_FILE(${CMAKE_ROOT}/Modules/CMakeSystem.cmake.in + ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake + IMMEDIATE @ONLY) + +ENDIF(CMAKE_BINARY_DIR) |