| |
| #============================================================================= |
| # Copyright 2010 Kitware, Inc. |
| # Copyright 2010 Todd Gamblin <tgamblin@llnl.gov> |
| # |
| # 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.) |
| |
| # |
| # 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 |
| ) |
| |
| # |
| # Indicate that this is a unix-like system |
| # |
| set(UNIX 1) |
| |
| # |
| # 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}) |
| set(BGQ_SYSTEM_INCLUDES "${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> <CMAKE_${lang}_LINK_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> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") |
| set(CMAKE_${lang}_LINK_EXECUTABLE |
| "<CMAKE_${lang}_COMPILER> -Wl,-relax ${BGQ_${lang}_DEFAULT_EXE_FLAGS}") |
| endmacro() |