I realized the toolchain stuff won't work because the platform file will
override it.  Here's v3 of the patch with *fixed* shared/static lib
searching.  I'll leave it be for now in regards to further updates to the
patch pending further feedback.

- Chuck


On Thu, Aug 14, 2014 at 7:41 PM, Chuck Atkins <chuck.atk...@kitware.com>
wrote:

> Updated to allow for static and shared libs (yes, you can use shared libs
> on a cray).  The expectation is that your toolchain file will have the
> appropriate logic to deal with this.  Something like:
>
> set(CMAKE_SYSTEM_NAME ComputeNodeLinux)
> ...
> if(DEFINED ENV{CRAYPE_LINK_TYPE} AND
>    "$ENV{CRAYPE_LINK_TYPE}" EQUALS "dynamic")
>   set(_CRAY_LINK_OPTS "-dynamic")
> else()
>   # The default behavior if not specified is explicit static-only linkage
>   set(_CRAY_LINK_OPTS "-static")
>
>   # If we're using static linking then make sure that CMake explicitly
>   # only looks for static libraries
>   set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
> endif()
> ...
> set(CMAKE_C_FLAGS       "... ${_CRAY_LINK}" CACHE STRING "" FORCE)
> set(CMAKE_CXX_FLAGS     "... ${_CRAY_LINK}" CACHE STRING "" FORCE)
> set(CMAKE_Fortran_FLAGS "... ${_CRAY_LINK}" CACHE STRING "" FORCE)
>
>
>
>
> - Chuck
>
>
> On Thu, Aug 14, 2014 at 6:46 PM, Chuck Atkins <chuck.atk...@kitware.com>
> wrote:
>
>> I've been using CMake on Cray's quite a bit lately and some of the cross
>> compilation leaves a bit to be desired.  No particular capability is really
>> missing but the "foo" of getting things to build and work seems to be
>> rather dispersed across various individuals and corners of the internet.
>> I'd like to start pooling some of this together to be shipped with CMake.
>>
>> For starters, I'd like to add a Platform file for the cross compilation
>> target of ComputeNodeLinux.  While it's not entirely different from running
>> Linux natively, some assumptions from native host Linux build environments
>> aren't valid and building for it explicitly needs search paths defined by
>> the Cray environment modules.  It's also distinctly different from the
>> commonly used Catamount (which is very far removed from the currently used
>> OS). Attached is a patch for a new Platform file that uses information from
>> the loaded environment modules on the login nodes to define it's
>> appropriate path and version info.  I've been using this successfully on
>> Garnet (an XE6) and Titan (an XK7).
>>
>> - Chuck
>>
>
>
From dfc0493671d4df34f22e380af4642fe5ad4c6596 Mon Sep 17 00:00:00 2001
From: Chuck Atkins <chuck.atk...@kitware.com>
Date: Thu, 14 Aug 2014 18:30:01 -0400
Subject: [PATCH] Add a platform file for cross-compiling to Cray Compute Node
 Linux

This platform module is designed t be used with the Cray Programming
Environment.  Esentially this means that it will get it's various
options and settings through variables loaded in "environment modules"
used on modern Crays.
---
 Modules/Platform/ComputeNodeLinux.cmake | 45 +++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)
 create mode 100644 Modules/Platform/ComputeNodeLinux.cmake

diff --git a/Modules/Platform/ComputeNodeLinux.cmake b/Modules/Platform/ComputeNodeLinux.cmake
new file mode 100644
index 0000000..a7f5a3b
--- /dev/null
+++ b/Modules/Platform/ComputeNodeLinux.cmake
@@ -0,0 +1,45 @@
+# Compute Node Linux doesn't quite work the same as native Linux so all of this
+# needs to be custom.  We use the variables defined through Cray's environment
+# modules to set up the right paths for things.
+
+if(NOT CMAKE_SYSTEM_VERSION)
+  if(NOT DEFINED ENV{XTOS_VERSION})
+    message(FATAL_ERROR "The CMAKE_SYSTEM_VERSION variable is not set and the XTOS_VERSION environment variable is not defined.  The ComputeNodeLinux CMake platform module either requires it to be manually set or the XTOS_VERSION environment variable to be available. This usually means that the necessary PrgEnv-* module is not loaded")
+  else()
+    set(CMAKE_SYSTEM_VERSION "$ENV{XTOS_VERSION}")
+  endif()
+endif()
+
+set(CMAKE_SHARED_LIBRARY_PREFIX "lib")
+set(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
+set(CMAKE_STATIC_LIBRARY_PREFIX "lib")
+set(CMAKE_STATIC_LIBRARY_SUFFIX ".a")
+
+set(CMAKE_FIND_LIBRARY_PREFIXES "lib")
+
+# Normally this sort of logic would belong in the toolchain file but the
+# order things get loaded in cause anything set here to override the toolchain
+# so we'll explicitly check for static compiler options in order to specify
+# whether or not the platform will support it
+if("$ENV{CRAYPE_LINK_TYPE}" STREQUAL "dynamic")
+  set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
+  set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")
+else()
+  set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
+  set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
+endif()
+
+# Make sure we have the appropriate environment loaded
+if(NOT DEFINED ENV{SYSROOT_DIR})
+  message(FATAL_ERROR "The SYSROOT_DIR environment variable is not defined but the ComputeNodeLinux CMake platform module requires it. This usually means that the necessary PrgEnv-* module is not loaded")
+endif()
+
+# Set up system search paths that CMake will use to look for libraries and
+# include files.  These will be the standard UNIX search paths but rooted
+# in the SYSROOT of the computes nodes.
+include(Platform/UnixPaths)
+set(CMAKE_FIND_ROOT_PATH "$ENV{SYSROOT_DIR}")
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
-- 
1.9.3

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers

Reply via email to