1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
#
# Blue Gene/Q base platform file.
#
# NOTE: Do not set your platform to "BlueGeneQ-base". This file is
# included by the real platform files. Use one of these two platforms
# instead:
#
# BlueGeneQ-dynamic For dynamically linked executables
# BlueGeneQ-static For statically linked executables
#
# The platform you choose doesn't affect whether or not you can build
# shared or static libraries -- it ONLY changs whether exeuatbles are linked
# statically or dynamically.
#
# This platform file tries its best to adhere to the behavior of the MPI
# compiler wrappers included with the latest BG/P drivers.
#
#
# This adds directories that find commands should specifically ignore
# for cross compiles. Most of these directories are the includeand
# lib directories for the frontend on BG/P systems. Not ignoring
# these can cause things like FindX11 to find a frontend PPC version
# mistakenly. We use this on BG instead of re-rooting because backend
# libraries are typically strewn about the filesystem, and we can't
# re-root ALL backend libraries to a single place.
#
set(CMAKE_SYSTEM_IGNORE_PATH
/lib /lib64 /include
/usr/lib /usr/lib64 /usr/include
/usr/local/lib /usr/local/lib64 /usr/local/include
/usr/X11/lib /usr/X11/lib64 /usr/X11/include
/usr/lib/X11 /usr/lib64/X11 /usr/include/X11
/usr/X11R6/lib /usr/X11R6/lib64 /usr/X11R6/include
/usr/X11R7/lib /usr/X11R7/lib64 /usr/X11R7/include
)
#
# Library prefixes, suffixes, extra libs.
#
set(CMAKE_LINK_LIBRARY_SUFFIX "")
set(CMAKE_STATIC_LIBRARY_PREFIX "lib") # lib
set(CMAKE_STATIC_LIBRARY_SUFFIX ".a") # .a
set(CMAKE_SHARED_LIBRARY_PREFIX "lib") # lib
set(CMAKE_SHARED_LIBRARY_SUFFIX ".so") # .so
set(CMAKE_EXECUTABLE_SUFFIX "") # .exe
set(CMAKE_DL_LIBS "dl")
#
# BG/Q supports dynamic libraries regardless of whether we're building
# static or dynamic *executables*.
#
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
set(CMAKE_FIND_LIBRARY_PREFIXES "lib")
#
# For BGQ builds, we're cross compiling, but we don't want to re-root things
# (e.g. with CMAKE_FIND_ROOT_PATH) because users may have libraries anywhere on
# the shared filesystems, and this may lie outside the root. Instead, we set the
# system directories so that the various system BG CNK library locations are
# searched first. This is not the clearest thing in the world, given IBM's driver
# layout, but this should cover all the standard ones.
#
macro(__BlueGeneQ_common_setup compiler_id lang)
# Need to use the version of the comm lib compiled with the right compiler.
set(__BlueGeneQ_commlib_dir gcc)
if (${compiler_id} STREQUAL XL)
set(__BlueGeneQ_commlib_dir xl)
endif()
set(CMAKE_SYSTEM_LIBRARY_PATH
/bgsys/drivers/ppcfloor/comm/default/lib # default comm layer (used by mpi compiler wrappers)
/bgsys/drivers/ppcfloor/comm/${__BlueGeneQ_commlib_dir}/lib # PAMI, other lower-level comm libraries
/bgsys/drivers/ppcfloor/gnu-linux/lib # CNK python installation directory
/bgsys/drivers/ppcfloor/gnu-linux/powerpc64-bgq-linux/lib # CNK Linux image -- standard runtime libs, pthread, etc.
)
# Add all the system include paths.
set(CMAKE_SYSTEM_INCLUDE_PATH
/bgsys/drivers/ppcfloor/comm/sys/include
/bgsys/drivers/ppcfloor/
/bgsys/drivers/ppcfloor/spi/include
/bgsys/drivers/ppcfloor/spi/include/kernel/cnk
/bgsys/drivers/ppcfloor/comm/${__BlueGeneQ_commlib_dir}/include
)
# Ensure that the system directories are included with the regular compilers, as users will expect this
# to do the same thing as the MPI compilers, which add these flags.
set(BGQ_SYSTEM_INCLUDES "")
foreach(dir ${CMAKE_SYSTEM_INCLUDE_PATH})
string(APPEND BGQ_SYSTEM_INCLUDES " -I${dir}")
endforeach()
set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> ${BGQ_SYSTEM_INCLUDES} <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
set(CMAKE_CXX_COMPILE_OBJECT "<CMAKE_CXX_COMPILER> <DEFINES> ${BGQ_SYSTEM_INCLUDES} <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
#
# Code below does setup for shared libraries. That this is done
# regardless of whether the platform is static or dynamic -- you can make
# shared libraries even if you intend to make static executables, you just
# can't make a dynamic executable if you use the static platform file.
#
if (${compiler_id} STREQUAL XL)
# Flags for XL compilers if we explicitly detected XL
set(CMAKE_SHARED_LIBRARY_${lang}_FLAGS "-qpic")
set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-qmkshrobj -qnostaticlink")
else()
# Assume flags for GNU compilers (if the ID is GNU *or* anything else).
set(CMAKE_SHARED_LIBRARY_${lang}_FLAGS "-fPIC")
set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-shared")
endif()
# Both toolchains use the GNU linker on BG/P, so these options are shared.
set(CMAKE_SHARED_LIBRARY_RUNTIME_${lang}_FLAG "-Wl,-rpath,")
set(CMAKE_SHARED_LIBRARY_RPATH_LINK_${lang}_FLAG "-Wl,-rpath-link,")
set(CMAKE_SHARED_LIBRARY_SONAME_${lang}_FLAG "-Wl,-soname,")
set(CMAKE_EXE_EXPORTS_${lang}_FLAG "-Wl,--export-dynamic")
set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "") # +s, flag for exe link to use shared lib
set(CMAKE_SHARED_LIBRARY_RUNTIME_${lang}_FLAG_SEP ":") # : or empty
endmacro()
#
# This macro needs to be called for dynamic library support. Unfortunately on BG,
# We can't support both static and dynamic links in the same platform file. The
# dynamic link platform file needs to call this explicitly to set up dynamic linking.
#
macro(__BlueGeneQ_setup_dynamic compiler_id lang)
__BlueGeneQ_common_setup(${compiler_id} ${lang})
if (${compiler_id} STREQUAL XL)
set(BGQ_${lang}_DYNAMIC_EXE_FLAGS "-qnostaticlink -qnostaticlink=libgcc")
else()
set(BGQ_${lang}_DYNAMIC_EXE_FLAGS "-dynamic")
endif()
# For dynamic executables, need to provide special BG/Q arguments.
set(BGQ_${lang}_DEFAULT_EXE_FLAGS
"<FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_${lang}_LINK_EXECUTABLE
"<CMAKE_${lang}_COMPILER> -Wl,-relax ${BGQ_${lang}_DYNAMIC_EXE_FLAGS} ${BGQ_${lang}_DEFAULT_EXE_FLAGS}")
endmacro()
#
# This macro needs to be called for static builds. Right now it just adds -Wl,-relax
# to the link line.
#
macro(__BlueGeneQ_setup_static compiler_id lang)
__BlueGeneQ_common_setup(${compiler_id} ${lang})
# For static executables, use default link settings.
set(BGQ_${lang}_DEFAULT_EXE_FLAGS
"<FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_${lang}_LINK_EXECUTABLE
"<CMAKE_${lang}_COMPILER> -Wl,-relax ${BGQ_${lang}_DEFAULT_EXE_FLAGS}")
endmacro()
|