Updates installation docs, cmake updates, internal OpenMPI header (#10)
* Updates installation docs + minor cmake tweaks - OMNITRACE_BUILD_LIBUNWIND option - Locally set OMNITRACE_USE_HIP=OFF if roctracer and rocm-smi are off - Force TIMEMORY_BUILD_GOTCHA to avoid bug in gotcha not patched upstream * MPI-Headers - include copy of mpi.h from OpenMPI - reworked FindMPI-Headers to support the internal OpenMPI headers
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
6af5b2a7e2
Коммит
d5995846df
+12
-1
@@ -83,6 +83,7 @@ set(CMAKE_INSTALL_LIBDIR
|
||||
set(CMAKE_CXX_STANDARD
|
||||
17
|
||||
CACHE STRING "CXX language standard")
|
||||
|
||||
omnitrace_add_feature(CMAKE_BUILD_TYPE "Build optimization level")
|
||||
omnitrace_add_feature(CMAKE_INSTALL_PREFIX "Installation prefix")
|
||||
omnitrace_add_feature(CMAKE_CXX_COMPILER "C++ compiler")
|
||||
@@ -106,10 +107,11 @@ omnitrace_add_option(
|
||||
OMNITRACE_USE_ROCM_SMI "Enable rocm-smi support for power/temp/etc. sampling"
|
||||
${OMNITRACE_USE_HIP})
|
||||
omnitrace_add_option(OMNITRACE_USE_MPI_HEADERS
|
||||
"Enable wrapping MPI functions w/o enabling MPI dependency" OFF)
|
||||
"Enable wrapping MPI functions w/o enabling MPI dependency" ON)
|
||||
omnitrace_add_option(OMNITRACE_USE_OMPT "Enable OpenMP tools support" ON)
|
||||
omnitrace_add_option(OMNITRACE_USE_PYTHON "Enable Python support" OFF)
|
||||
omnitrace_add_option(OMNITRACE_BUILD_DYNINST "Build dyninst from submodule" OFF)
|
||||
omnitrace_add_option(OMNITRACE_BUILD_LIBUNWIND "Build libunwind from submodule" ON)
|
||||
omnitrace_add_option(OMNITRACE_BUILD_EXAMPLES "Enable building the examples" OFF)
|
||||
omnitrace_add_option(OMNITRACE_BUILD_TESTING "Enable building the testing suite" OFF)
|
||||
omnitrace_add_option(OMNITRACE_CUSTOM_DATA_SOURCE "Enable custom data source" OFF
|
||||
@@ -150,6 +152,15 @@ if(NOT OMNITRACE_USE_HIP)
|
||||
set(OMNITRACE_USE_ROCM_SMI
|
||||
OFF
|
||||
CACHE BOOL "Disabled via OMNITRACE_USE_HIP=OFF" FORCE)
|
||||
elseif(
|
||||
OMNITRACE_USE_HIP
|
||||
AND NOT OMNITRACE_USE_ROCTRACER
|
||||
AND NOT OMNITRACE_USE_ROCM_SMI)
|
||||
omnitrace_message(
|
||||
AUTHOR_WARNING
|
||||
"Setting OMNITRACE_USE_HIP=OFF because roctracer and rocm-smi options are disabled"
|
||||
)
|
||||
set(OMNITRACE_USE_HIP OFF)
|
||||
endif()
|
||||
|
||||
if(OMNITRACE_BUILD_TESTING)
|
||||
|
||||
@@ -6,13 +6,48 @@
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
|
||||
set(MPI_HEADERS_VENDOR_INTERNAL
|
||||
"OpenMPI"
|
||||
CACHE STRING "Distribution type of internal mpi.h")
|
||||
set(MPI_HEADERS_INCLUDE_DIR_INTERNAL
|
||||
"${PROJECT_SOURCE_DIR}/source/lib/omnitrace/library/tpls"
|
||||
CACHE PATH "Path to internal ${MPI_HEADERS_VENDOR_INTERNAL} mpi.h")
|
||||
mark_as_advanced(MPI_HEADERS_VENDOR_INTERNAL)
|
||||
mark_as_advanced(MPI_HEADERS_INCLUDE_DIR_INTERNAL)
|
||||
|
||||
if(DEFINED _MPI_HEADERS_LAST_MPI_HEADERS_INCLUDE_DIR
|
||||
AND NOT _MPI_HEADERS_LAST_MPI_HEADERS_INCLUDE_DIR STREQUAL MPI_HEADERS_INCLUDE_DIR)
|
||||
unset(MPI_HEADERS_VENDOR CACHE)
|
||||
# if skip mpicxx is on because of internal unset this value
|
||||
if(MPI_HEADERS_SKIP_MPICXX AND "${_MPI_HEADERS_LAST_MPI_HEADERS_INCLUDE_DIR}"
|
||||
STREQUAL "${MPI_HEADERS_INCLUDE_DIR_INTERNAL}")
|
||||
unset(MPI_HEADERS_SKIP_MPICXX CACHE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# define the (OMPI|MPICH)_SKIP_MPICXX pp definition
|
||||
option(MPI_HEADERS_SKIP_MPICXX "Skip MPI C++" ON)
|
||||
mark_as_advanced(MPI_HEADERS_SKIP_MPICXX)
|
||||
|
||||
# ------------------------------------------------------------------------------#
|
||||
#
|
||||
# Try to find an openmpi header
|
||||
#
|
||||
# ------------------------------------------------------------------------------#
|
||||
|
||||
find_path(
|
||||
MPI_HEADERS_INCLUDE_DIR
|
||||
NAMES mpi.h
|
||||
PATH_SUFFIXES include/openmpi openmpi include include/mpich mpich
|
||||
PATH_SUFFIXES include/openmpi openmpi include
|
||||
HINTS ${MPI_ROOT_DIR}
|
||||
PATHS ${MPI_ROOT_DIR})
|
||||
|
||||
# ------------------------------------------------------------------------------#
|
||||
#
|
||||
# If direct find failed, try to find MPI and use MPI_C_INCLUDE_DIRS
|
||||
#
|
||||
# ------------------------------------------------------------------------------#
|
||||
|
||||
if(NOT MPI_HEADERS_INCLUDE_DIR)
|
||||
find_package(MPI QUIET)
|
||||
if(MPI_C_INCLUDE_DIRS)
|
||||
@@ -26,15 +61,104 @@ if(NOT MPI_HEADERS_INCLUDE_DIR)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------------#
|
||||
#
|
||||
# If found, try to determine the MPI vendor (i.e. distribution)
|
||||
#
|
||||
# ------------------------------------------------------------------------------#
|
||||
|
||||
if(MPI_HEADERS_INCLUDE_DIR)
|
||||
file(STRINGS ${MPI_HEADERS_INCLUDE_DIR}/mpi.h _MPI_H_LINES REGEX "#([ \t]+)define ")
|
||||
foreach(_LINE ${_MPI_H_LINES})
|
||||
if("${_LINE}" MATCHES "define([ \t]+)OMPI_")
|
||||
set(MPI_HEADERS_VENDOR
|
||||
"OpenMPI"
|
||||
CACHE STRING "MPI headers are from OpenMPI distribution")
|
||||
break()
|
||||
elseif("${_LINE}" MATCHES "define([ \t]+)MPICH_")
|
||||
set(MPI_HEADERS_VENDOR
|
||||
"MPICH"
|
||||
CACHE STRING "MPI headers are from MPICH distribution")
|
||||
break()
|
||||
elseif("${_LINE}" MATCHES "define([ \t]+)MVAPICH_")
|
||||
set(MPI_HEADERS_VENDOR
|
||||
"MVAPICH"
|
||||
CACHE STRING "MPI headers are from MVAPICH distribution")
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
# ------------------------------------------------------------------------------#
|
||||
#
|
||||
# If not found, use internal version or if vendor is MPICH set to internal
|
||||
#
|
||||
# ------------------------------------------------------------------------------#
|
||||
|
||||
if(NOT MPI_HEADERS_INCLUDE_DIR)
|
||||
set(MPI_HEADERS_INCLUDE_DIR
|
||||
"${MPI_HEADERS_INCLUDE_DIR_INTERNAL}"
|
||||
CACHE PATH "" FORCE)
|
||||
set(MPI_HEADERS_VENDOR
|
||||
"${MPI_HEADERS_VENDOR_INTERNAL}"
|
||||
CACHE STRING "MPI headers are from OpenMPI distribution" FORCE)
|
||||
set(MPI_HEADERS_SKIP_MPICXX
|
||||
ON
|
||||
CACHE BOOL "" FORCE)
|
||||
elseif("${MPI_HEADERS_VENDOR}" STREQUAL "MPICH")
|
||||
option(
|
||||
MPI_HEADERS_ALLOW_MPICH
|
||||
"Permit the use of MPI headers from MPICH instead of using internal OpenMPI header"
|
||||
)
|
||||
mark_as_advanced(MPI_HEADERS_ALLOW_MPICH)
|
||||
if(NOT MPI_HEADERS_ALLOW_MPICH)
|
||||
set(_MESSAGE "\nFound MPI headers belonging to a MPICH distribution. ")
|
||||
set(_MESSAGE
|
||||
"${_MESSAGE}The data types for MPICH will cause segfaults when an application uses OpenMPI, "
|
||||
)
|
||||
set(_MESSAGE
|
||||
"${_MESSAGE}whereas the OpenMPI data types are compatible with both. ")
|
||||
set(_MESSAGE
|
||||
"${_MESSAGE}Forcing internal OpenMPI header... This can be disabled via MPI_HEADERS_ALLOW_MPICH=ON ...\n"
|
||||
)
|
||||
message(AUTHOR_WARNING "${_MESSAGE}")
|
||||
unset(_MESSAGE)
|
||||
set(MPI_HEADERS_INCLUDE_DIR
|
||||
"${MPI_HEADERS_INCLUDE_DIR_INTERNAL}"
|
||||
CACHE PATH "" FORCE)
|
||||
set(MPI_HEADERS_VENDOR
|
||||
"${MPI_HEADERS_VENDOR_INTERNAL}"
|
||||
CACHE STRING "MPI headers are from OpenMPI distribution" FORCE)
|
||||
set(MPI_HEADERS_SKIP_MPICXX
|
||||
ON
|
||||
CACHE BOOL "" FORCE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# set local variable
|
||||
if(MPI_HEADERS_INCLUDE_DIR)
|
||||
set(MPI_HEADERS_INCLUDE_DIRS ${MPI_HEADERS_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(MPI_HEADERS_INCLUDE_DIR)
|
||||
|
||||
# store value to detect changes
|
||||
set(_MPI_HEADERS_LAST_MPI_HEADERS_INCLUDE_DIR
|
||||
"${MPI_HEADERS_INCLUDE_DIR}"
|
||||
CACHE INTERNAL "Last value of MPI_HEADERS_INCLUDE_DIR")
|
||||
|
||||
# handle find_package
|
||||
find_package_handle_standard_args(MPI-Headers REQUIRED_VARS MPI_HEADERS_INCLUDE_DIR)
|
||||
|
||||
if(MPI-Headers_FOUND)
|
||||
add_library(MPI::MPI_HEADERS IMPORTED INTERFACE)
|
||||
if(MPI_HEADERS_SKIP_MPICXX)
|
||||
if(MPI_HEADERS_VENDOR STREQUAL "MPICH")
|
||||
target_compile_definitions(MPI::MPI_HEADERS INTERFACE MPICH_SKIP_MPICXX=1)
|
||||
else()
|
||||
target_compile_definitions(MPI::MPI_HEADERS INTERFACE OMPI_SKIP_MPICXX=1)
|
||||
endif()
|
||||
endif()
|
||||
target_include_directories(
|
||||
MPI::MPI_HEADERS INTERFACE $<$<COMPILE_LANGUAGE:C>:${MPI_HEADERS_INCLUDE_DIR}>
|
||||
$<$<COMPILE_LANGUAGE:CXX>:${MPI_HEADERS_INCLUDE_DIR}>)
|
||||
|
||||
@@ -108,7 +108,7 @@ endif()
|
||||
|
||||
# ----------------------------------------------------------------------------------------#
|
||||
#
|
||||
# rocm-smmi
|
||||
# rocm-smi
|
||||
#
|
||||
# ----------------------------------------------------------------------------------------#
|
||||
|
||||
@@ -469,13 +469,20 @@ set(TIMEMORY_USE_LIBUNWIND
|
||||
ON
|
||||
CACHE BOOL "Enable libunwind support in timemory")
|
||||
|
||||
if(DEFINED TIMEMORY_BUILD_GOTCHA AND NOT TIMEMORY_BUILD_GOTCHA)
|
||||
omnitrace_message(
|
||||
FATAL_ERROR
|
||||
"Using an external gotcha is not allowed due to known bug that has not been accepted upstream"
|
||||
)
|
||||
endif()
|
||||
|
||||
# timemory feature build settings
|
||||
set(TIMEMORY_BUILD_GOTCHA
|
||||
ON
|
||||
CACHE BOOL "Enable building GOTCHA library from submodule")
|
||||
CACHE BOOL "Enable building GOTCHA library from submodule" FORCE)
|
||||
set(TIMEMORY_BUILD_LIBUNWIND
|
||||
ON
|
||||
CACHE BOOL "Enable building libunwind library from submodule")
|
||||
${OMNITRACE_BUILD_LIBUNWIND}
|
||||
CACHE BOOL "Enable building libunwind library from submodule" FORCE)
|
||||
set(TIMEMORY_BUILD_EXTRA_OPTIMIZATIONS
|
||||
${OMNITRACE_BUILD_EXTRA_OPTIMIZATIONS}
|
||||
CACHE BOOL "Enable building GOTCHA library from submodule" FORCE)
|
||||
@@ -582,6 +589,7 @@ if(NOT TARGET PTL::ptl-shared)
|
||||
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
|
||||
|
||||
add_subdirectory(external/PTL)
|
||||
|
||||
omnitrace_restore_variables(
|
||||
BUILD_CONFIG
|
||||
VARIABLES BUILD_SHARED_LIBS BUILD_STATIC_LIBS BUILD_OBJECT_LIBS
|
||||
|
||||
@@ -6,25 +6,37 @@
|
||||
:maxdepth: 4
|
||||
```
|
||||
|
||||
- Ubuntu 18.04 or Ubuntu 20.04
|
||||
- Other OS distributions may be supported but are not tested
|
||||
- GCC compiler v7+
|
||||
- Older GCC compilers may be supported but are not tested
|
||||
- Clang compilers are generally supported for [Omnitrace](https://github.com/AMDResearch/omnitrace) but not Dyninst
|
||||
- [CMake](https://cmake.org/) v3.15+
|
||||
- [DynInst](https://github.com/dyninst/dyninst) for dynamic or static instrumentation
|
||||
- [TBB](https://github.com/oneapi-src/oneTBB) required by Dyninst
|
||||
- [ElfUtils](https://sourceware.org/elfutils/) required by Dyninst
|
||||
- [LibIberty](https://github.com/gcc-mirror/gcc/tree/master/libiberty) required by Dyninst
|
||||
- [Boost](https://www.boost.org/) required by Dyninst
|
||||
- [OpenMP](https://www.openmp.org/) optional by Dyninst
|
||||
- [ROCm](https://rocmdocs.amd.com/en/latest/Installation_Guide/Installation-Guide.html#ubuntu) (optional)
|
||||
- HIP
|
||||
- Roctracer for HIP API and kernel tracing
|
||||
- ROCM-SMI for GPU monitoring
|
||||
- [PAPI](https://icl.utk.edu/papi/)
|
||||
- [libunwind](https://www.nongnu.org/libunwind/) for call-stack sampling
|
||||
- Several optional third-party profiling tools supported by timemory (e.g. TAU, Caliper, CrayPAT, etc.)
|
||||
## Operating System
|
||||
|
||||
Omnitrace is only supported on Linux.
|
||||
|
||||
- Ubuntu 18.04
|
||||
- Ubuntu 20.04
|
||||
- OpenSUSE 15.2
|
||||
- OpenSUSE 15.3
|
||||
- Other OS distributions may be supported but are not tested
|
||||
|
||||
### Identifying the Operating System
|
||||
|
||||
If you are unsure of the operating system and version, the `/etc/os-release` and `/usr/lib/os-release` files contain
|
||||
operating system identification data for Linux systems.
|
||||
|
||||
```shell
|
||||
$ cat /etc/os-release
|
||||
NAME="Ubuntu"
|
||||
VERSION="20.04.4 LTS (Focal Fossa)"
|
||||
ID=ubuntu
|
||||
...
|
||||
VERSION_ID="20.04"
|
||||
...
|
||||
```
|
||||
|
||||
The relevent fields are `ID` and the `VERSION_ID`.
|
||||
|
||||
## Architecture
|
||||
|
||||
At present, only amd64 (x86_64) architectures are tested but Dyninst supports several more architectures.
|
||||
Thus, omnitrace should support other CPU architectures such as aarch64, ppc64, etc.
|
||||
|
||||
## Installing omnitrace from binary distributions
|
||||
|
||||
@@ -37,17 +49,14 @@ omnitrace-{VERSION}-{OS_DISTRIB}-{OS_VERSION}[-ROCm-{ROCM_VERSION}[-{EXTRA}]].sh
|
||||
E.g.:
|
||||
|
||||
```shell
|
||||
omnitrace-0.0.5-Ubuntu-18.04.sh
|
||||
omnitrace-0.0.5-Ubuntu-18.04-ROCm-4.3.0.sh
|
||||
omnitrace-0.0.5-Ubuntu-18.04-ROCm-4.5.0.sh
|
||||
omnitrace-1.0.0-ubuntu-18.04-OMPT-PAPI-Python3.sh
|
||||
omnitrace-1.0.0-ubuntu-18.04-ROCm-405000-OMPT-PAPI-Python3.sh
|
||||
...
|
||||
omnitrace-0.0.5-Ubuntu-20.04-ROCm-4.5.0-PAPI.sh
|
||||
omnitrace-0.0.5-Ubuntu-20.04-ROCm-4.5.0-PAPI-MPICH.sh
|
||||
omnitrace-0.0.5-Ubuntu-20.04-ROCm-4.5.0-PAPI-OpenMPI.sh
|
||||
omnitrace-1.0.0-ubuntu-20.04-ROCm-50000-OMPT-PAPI-Python3.sh
|
||||
```
|
||||
|
||||
The EXTRA fields such as PAPI, MPICH, and OpenMPI are built against the libraries provided by the
|
||||
OS package manager, e.g. `apt-get install libpapi-dev` for Ubuntu.
|
||||
Any of the EXTRA fields with a cmake build option (e.g. PAPI, see below) or no link requirements (e.g. OMPT) have
|
||||
self-contained support for these packages.
|
||||
|
||||
### Download the appropriate binary distribution
|
||||
|
||||
@@ -64,37 +73,73 @@ mkdir /opt/omnitrace
|
||||
### Run the installer script
|
||||
|
||||
```shell
|
||||
./omnitrace-0.0.5-Ubuntu-18.04-ROCm-4.3.0-PAPI-MPICH.sh --prefix=/opt/omnitrace
|
||||
```
|
||||
|
||||
### Configure the environment
|
||||
|
||||
```shell
|
||||
source /opt/omnitrace/share/omnitrace/setup-env.sh
|
||||
```
|
||||
|
||||
### Test the executables
|
||||
|
||||
```shell
|
||||
omnitrace --help
|
||||
omnitrace-avail --help
|
||||
./omnitrace-1.0.0-ubuntu-18.04-ROCm-405000-OMPT-PAPI.sh --prefix=/opt/omnitrace --exclude-subdir
|
||||
```
|
||||
|
||||
## Installing Omnitrace from source
|
||||
|
||||
### Installing CMake
|
||||
### Build Requirements
|
||||
|
||||
If using Ubuntu 20.04, `apt-get install cmake` will install cmake v3.16.3. If using Ubuntu 18.04, the cmake version via apt is too old (v3.10.2). In this case,
|
||||
follow the instructions [here](https://apt.kitware.com/) to add the CMake apt package repository; or alternatively (if root access is not available),
|
||||
specific versions of CMake can be easily installed via the Python pip package manager:
|
||||
Omnitrace needs a GCC compiler with full support for C++17 and CMake v3.16 or higher.
|
||||
The Clang compiler may be used in lieu of the GCC compiler if Dyninst is already installed.
|
||||
|
||||
```shell
|
||||
python3 -m pip install 'cmake==3.18.4'
|
||||
export PATH=${HOME}/.local/bin
|
||||
```
|
||||
- GCC compiler v7+
|
||||
- Older GCC compilers may be supported but are not tested
|
||||
- Clang compilers are generally supported for [Omnitrace](https://github.com/AMDResearch/omnitrace) but not Dyninst
|
||||
- [CMake](https://cmake.org/) v3.16+
|
||||
|
||||
> NOTE: be wary of using `python3 -m pip install cmake`. If pip installs a cmake version with a `.post<N>` suffix, it will be necessary to
|
||||
> specify the root path when cmake is invoked.
|
||||
> ***If the system installed cmake is too old, installing a new version of cmake can be done through several methods.***
|
||||
> ***One of the easiest options is to use PyPi (i.e. python's pip):***
|
||||
>
|
||||
> ```python
|
||||
> pip install --user 'cmake==3.18.4'
|
||||
> export PATH=${HOME}/.local/bin:${PATH}`
|
||||
> ```
|
||||
|
||||
### Required Third-Party Packages
|
||||
|
||||
- [DynInst](https://github.com/dyninst/dyninst) for dynamic or static instrumentation
|
||||
- [TBB](https://github.com/oneapi-src/oneTBB) required by Dyninst
|
||||
- [ElfUtils](https://sourceware.org/elfutils/) required by Dyninst
|
||||
- [LibIberty](https://github.com/gcc-mirror/gcc/tree/master/libiberty) required by Dyninst
|
||||
- [Boost](https://www.boost.org/) required by Dyninst
|
||||
- [OpenMP](https://www.openmp.org/) optional by Dyninst
|
||||
- [libunwind](https://www.nongnu.org/libunwind/) for call-stack sampling
|
||||
|
||||
All of the third-party packages required by [DynInst](https://github.com/dyninst/dyninst) and
|
||||
[DynInst](https://github.com/dyninst/dyninst) itself can be built and installed
|
||||
during the build of omnitrace itself. In the list below, we list the package, the version,
|
||||
which package requires the package (i.e. omnitrace requires Dyninst
|
||||
and Dyninst requires TBB), and the CMake option to build the package alongside omnitrace:
|
||||
|
||||
| Third-Party Library | Minimum Version | Required By | CMake Option |
|
||||
|---------------------|-----------------|-------------|-------------------------------------------|
|
||||
| Dyninst | 10.0 | Omnitrace | `OMNITRACE_BUILD_DYNINST` (default: OFF) |
|
||||
| Libunwind | | Omnitrace | `OMNITRACE_BUILD_LIBUNWIND` (default: ON) |
|
||||
| TBB | 2018.6 | Dyninst | `DYNINST_BUILD_TBB` (default: OFF) |
|
||||
| ElfUtils | 0.178 | Dyninst | `DYNINST_BUILD_ELFUTILS` (default: OFF) |
|
||||
| LibIberty | | Dyninst | `DYNINST_BUILD_LIBIBERTY` (default: OFF) |
|
||||
| Boost | 1.67.0 | Dyninst | `DYNINST_BUILD_BOOST` (default: OFF) |
|
||||
| OpenMP | 4.x | Dyninst | |
|
||||
|
||||
### Optional Third-Party Packages
|
||||
|
||||
- [ROCm](https://rocmdocs.amd.com/en/latest/Installation_Guide/Installation_new.html)
|
||||
- HIP
|
||||
- Roctracer for HIP API and kernel tracing
|
||||
- ROCM-SMI for GPU monitoring
|
||||
- [PAPI](https://icl.utk.edu/papi/)
|
||||
- MPI
|
||||
- `OMNITRACE_USE_MPI` will enable full MPI support
|
||||
- `OMNITRACE_USE_MPI_HEADERS` will enable wrapping of the dynamically-linked MPI C function calls
|
||||
- By default, if an OpenMPI MPI distribution cannot be found, omnitrace will use a local copy of the OpenMPI mpi.h
|
||||
- Several optional third-party profiling tools supported by timemory (e.g. [Caliper](https://github.com/LLNL/Caliper), [TAU](https://www.cs.uoregon.edu/research/tau/home.php), CrayPAT, etc.)
|
||||
|
||||
| Third-Party Library | CMake Enable Option | CMake Build Option |
|
||||
|---------------------|--------------------------------------------|--------------------------------------|
|
||||
| PAPI | `OMNITRACE_USE_PAPI` (default: ON) | `OMNITRACE_BUILD_PAPI` (default: ON) |
|
||||
| MPI | `OMNITRACE_USE_MPI` (default: OFF) | |
|
||||
| MPI (header-only) | `OMNITRACE_USE_MPI_HEADERS` (default: ON) | |
|
||||
|
||||
### Installing DynInst
|
||||
|
||||
@@ -119,8 +164,9 @@ where `-DDyninst_BUILD_{TBB,BOOST,ELFUTILS,LIBIBERTY}=ON` is expanded by the she
|
||||
git clone https://github.com/spack/spack.git
|
||||
source ./spack/share/spack/setup-env.sh
|
||||
spack compiler find
|
||||
spack external find
|
||||
spack install dyninst
|
||||
spack external find --all --not-buildable
|
||||
spack spec -I --reuse dyninst
|
||||
spack install --reuse dyninst
|
||||
spack load -r dyninst
|
||||
```
|
||||
|
||||
@@ -134,16 +180,28 @@ into omnitrace's perfetto support, e.g. `OMNITRACE_USE_PAPI=<VAL>` forces `TIMEM
|
||||
is passed along to perfetto and will be displayed when the `.proto` file is visualized in [ui.perfetto.dev](https://ui.perfetto.dev).
|
||||
|
||||
```shell
|
||||
OMNITRACE_ROOT=${HOME}/sw/omnitrace
|
||||
OMNITRACE_ROOT=/opt/omnitrace
|
||||
git clone https://github.com/AMDResearch/omnitrace.git omnitrace-source
|
||||
cmake \
|
||||
-B omnitrace-build \
|
||||
-DOMNITRACE_USE_MPI_HEADERS=ON \
|
||||
-DCMAKE_INSTALL_PREFIX=${OMNITRACE_ROOT} \
|
||||
cmake \
|
||||
-B omnitrace-build \
|
||||
-D CMAKE_INSTALL_PREFIX=/opt/omnitrace \
|
||||
-D OMNITRACE_USE_HIP=ON \
|
||||
-D OMNITRACE_USE_ROCM_SMI=ON \
|
||||
-D OMNITRACE_USE_ROCTRACER=ON \
|
||||
-D OMNITRACE_USE_PYTHON=ON \
|
||||
-D OMNITRACE_USE_OMPT=ON \
|
||||
-D OMNITRACE_USE_MPI_HEADERS=ON \
|
||||
-D OMNITRACE_BUILD_PAPI=ON \
|
||||
-D OMNITRACE_BUILD_LIBUNWIND=ON \
|
||||
-D OMNITRACE_BUILD_DYNINST=ON \
|
||||
-D DYNINST_BUILD_TBB=ON \
|
||||
-D DYNINST_BUILD_BOOST=ON \
|
||||
-D DYNINST_BUILD_ELFUTILS=ON \
|
||||
-D DYNINST_BUILD_LIBIBERTY=ON \
|
||||
omnitrace-source
|
||||
cmake --build omnitrace-build --target all --parallel 8
|
||||
cmake --build omnitrace-build --target install
|
||||
source ${OMNITRACE_ROOT}/share/omnitrace/setup-env.sh
|
||||
source /opt/omnitrace/share/omnitrace/setup-env.sh
|
||||
```
|
||||
|
||||
#### MPI Support within Omnitrace
|
||||
@@ -160,3 +218,31 @@ because the `MPI_COMM_WORLD` in OpenMPI is a pointer to `ompi_communicator_t` (8
|
||||
it is an `int` (4 bytes). Building omnitrace with partial MPI support and the MPICH headers and then using
|
||||
omnitrace on an application built against OpenMPI will cause a segmentation fault due to the value of the `MPI_COMM_WORLD` being narrowed
|
||||
during the function wrapping before being passed along to the underlying MPI function.
|
||||
|
||||
## Post-Installation Steps
|
||||
|
||||
### Configure the environment
|
||||
|
||||
If environment modules are available and preferred:
|
||||
|
||||
```shell
|
||||
module use /opt/omnitrace/share/modulefiles
|
||||
module load omnitrace/1.0.0
|
||||
```
|
||||
|
||||
Alternatively, once can directly source the `setup-env.sh` script:
|
||||
|
||||
```shell
|
||||
source /opt/omnitrace/share/omnitrace/setup-env.sh
|
||||
```
|
||||
|
||||
### Test the executables
|
||||
|
||||
Successful execution of these commands indicates that the installation does not have any issues locating the installed libraries:
|
||||
|
||||
```shell
|
||||
omnitrace --help
|
||||
omnitrace-avail --help
|
||||
```
|
||||
|
||||
> ***NOTE: If ROCm support was enabled, you may have to add the path to the ROCm libraries to `LD_LIBRARY_PATH`, e.g. `export LD_LIBRARY_PATH=/opt/rocm/lib:${LD_LIBRARY_PATH}`***
|
||||
|
||||
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
@@ -0,0 +1,409 @@
|
||||
/*
|
||||
* Header file with preprocessor magic to figure out, which compiler the user has been
|
||||
* calling!
|
||||
*
|
||||
* This code is adapted from the file other/portable_platform.h of GASnet-1.14.0:
|
||||
* - Ripping out the required parts.
|
||||
* - Get rid of brackets as it messes up autoconf
|
||||
* - Delete version tests for older PGI versions (#include "omp.h" not acceptabe)
|
||||
* - Indent ('#' should be in column 0)
|
||||
*
|
||||
* External packages (i.e., romio) depend on top_build_dir/ompi/include, therefore
|
||||
* although this is not changed in the configure process, this has to be set as
|
||||
* a .in file...
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef OPAL_PORTABLE_PLATFORM_H
|
||||
#define OPAL_PORTABLE_PLATFORM_H
|
||||
|
||||
/* All files in this directory and all sub-directories (except where otherwise noted)
|
||||
* are subject to the following licensing terms:
|
||||
*
|
||||
* ---------------------------------------------------------------------------
|
||||
* "Copyright (c) 2000-2003 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software and its
|
||||
* documentation for any purpose, without fee, and without written agreement is
|
||||
* hereby granted, provided that the above copyright notice and the following
|
||||
* two paragraphs appear in all copies of this software.
|
||||
*
|
||||
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
|
||||
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
|
||||
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
|
||||
* CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
||||
* ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
|
||||
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
|
||||
* ---------------------------------------------------------------------------
|
||||
*
|
||||
* Please see the license.txt files within the gm-conduit, lapi-conduit and
|
||||
* vapi-conduit directories for the licensing terms governing those
|
||||
* contributed components.
|
||||
*
|
||||
* The authors/contributors of GASNet include:
|
||||
*
|
||||
* Dan Bonachea <bonachea@cs.berkeley.edu>:
|
||||
* General infrastructure & documentation
|
||||
* mpi-conduit
|
||||
* elan-conduit
|
||||
* smp-conduit
|
||||
* udp-conduit
|
||||
* extended-ref
|
||||
* template-conduit
|
||||
* Christian Bell <csbell@cs.berkeley.edu>: gm-conduit, shmem-conduit
|
||||
* Mike Welcome <mlwelcome@lbl.gov>: lapi-conduit, portals-conduit
|
||||
* Paul H. Hargrove <phhargrove@lbl.gov>: vapi-conduit, ibv-conduit
|
||||
* Rajesh Nishtala <rajeshn@cs.berkeley.edu>: collectives, dcmf-conduit
|
||||
* Parry Husbands (PJRHusbands@lbl.gov): lapi-conduit
|
||||
*
|
||||
* For more information about GASNet, visit our home page at:
|
||||
* http://gasnet.cs.berkeley.edu/
|
||||
* Or send email to:
|
||||
* <upc@lbl.gov>
|
||||
*
|
||||
* Source code contributions (fixes, patches, extensions etc.) should be
|
||||
* sent to <upc@lbl.gov> to be reviewed for acceptance into the primary
|
||||
* distribution. Contributions are most likely to be accepted if they
|
||||
* are provided as public domain, or under a BSD-style license such as
|
||||
* the one above.
|
||||
*
|
||||
*/
|
||||
#ifndef _STRINGIFY
|
||||
# define _STRINGIFY_HELPER(x) # x
|
||||
# define _STRINGIFY(x) _STRINGIFY_HELPER(x)
|
||||
#endif
|
||||
|
||||
#if defined(__INTEL_COMPILER)
|
||||
# define PLATFORM_COMPILER_FAMILYNAME INTEL
|
||||
# define PLATFORM_COMPILER_FAMILYID 2
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_INTEL_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_INTEL_C 1
|
||||
# endif
|
||||
# define _PLATFORM_COMPILER_INTEL_MIN_BUILDDATE \
|
||||
19700000 /* year 1970: predates most intel products :) */
|
||||
# ifdef __INTEL_COMPILER_BUILD_DATE
|
||||
# define _PLATFORM_INTEL_COMPILER_BUILD_DATE __INTEL_COMPILER_BUILD_DATE
|
||||
# else
|
||||
# define _PLATFORM_INTEL_COMPILER_BUILD_DATE _PLATFORM_COMPILER_INTEL_MIN_BUILDDATE
|
||||
# endif
|
||||
/* patch number is a decimal build date: YYYYMMDD */
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj, min, pat) \
|
||||
(((((maj) *10) | (min)) << 20) | \
|
||||
((pat) < _PLATFORM_COMPILER_INTEL_MIN_BUILDDATE \
|
||||
? _PLATFORM_COMPILER_INTEL_MIN_BUILDDATE \
|
||||
: ((pat) -_PLATFORM_COMPILER_INTEL_MIN_BUILDDATE)))
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(__INTEL_COMPILER / 10, __INTEL_COMPILER / 100, \
|
||||
_PLATFORM_INTEL_COMPILER_BUILD_DATE)
|
||||
# define PLATFORM_COMPILER_VERSION_STR \
|
||||
_STRINGIFY(__INTEL_COMPILER) "." _STRINGIFY(_PLATFORM_INTEL_COMPILER_BUILD_DATE)
|
||||
|
||||
#elif defined(__PATHSCALE__)
|
||||
# define PLATFORM_COMPILER_PATHSCALE 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME PATHSCALE
|
||||
# define PLATFORM_COMPILER_FAMILYID 3
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_PATHSCALE_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_PATHSCALE_C 1
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(__PATHCC__, __PATHCC_MINOR__, __PATHCC_PATCHLEVEL__)
|
||||
# define PLATFORM_COMPILER_VERSION_STR __PATHSCALE__
|
||||
|
||||
#elif defined(__PGI)
|
||||
# define PLATFORM_COMPILER_PGI 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME PGI
|
||||
# define PLATFORM_COMPILER_FAMILYID 4
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_PGI_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_PGI_C 1
|
||||
# endif
|
||||
# if __PGIC__ == 99
|
||||
/* bug 2230: PGI versioning was broken for some platforms in 7.0
|
||||
no way to know exact version, but provide something slightly more accurate */
|
||||
# define PLATFORM_COMPILER_VERSION 0x070000
|
||||
# define PLATFORM_COMPILER_VERSION_STR "7.?-?"
|
||||
# elif defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__)
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__)
|
||||
# define PLATFORM_COMPILER_VERSION_STR \
|
||||
_STRINGIFY(__PGIC__) \
|
||||
"." _STRINGIFY(__PGIC_MINOR__) "-" _STRINGIFY(__PGIC_PATCHLEVEL__)
|
||||
# else
|
||||
/* PGI before 6.1-4 lacks any version ID preprocessor macros - so use this filthy hack */
|
||||
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||
* We cannot do these within mpi.h.in, as we should not include ompi.h
|
||||
* Hopefully, compilers with integrated preprocessors will not analyse code within the #if
|
||||
* 0-block
|
||||
* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||
*/
|
||||
# if 0
|
||||
# ifdef PLATFORM_PGI_IS_ANCIENT
|
||||
/* Include below might fail for ancient versions lacking this header, but testing shows it
|
||||
works back to at least 5.1-3 (Nov 2003), and based on docs probably back to 3.2 (Sep 2000) */
|
||||
# define PLATFORM_COMPILER_VERSION 0
|
||||
# elif defined(__x86_64__) /* bug 1753 - 64-bit omp.h upgrade happenned in \
|
||||
<6.0-8,6.1-1) */
|
||||
# include "omp.h"
|
||||
# if defined(_PGOMP_H)
|
||||
/* 6.1.1 or newer */
|
||||
# define PLATFORM_COMPILER_VERSION 0x060101
|
||||
# define PLATFORM_COMPILER_VERSION_STR ">=6.1-1"
|
||||
# else
|
||||
/* 6.0.8 or older */
|
||||
# define PLATFORM_COMPILER_VERSION 0
|
||||
# define PLATFORM_COMPILER_VERSION_STR "<=6.0-8"
|
||||
# endif
|
||||
# else /* 32-bit omp.h upgrade happenned in <5.2-4,6.0-8 */
|
||||
# include "omp.h"
|
||||
# if defined(_PGOMP_H)
|
||||
/* 6.0-8 or newer */
|
||||
# define PLATFORM_COMPILER_VERSION 0x060008
|
||||
# define PLATFORM_COMPILER_VERSION_STR ">=6.0-8"
|
||||
# else
|
||||
/* 5.2-4 or older */
|
||||
# define PLATFORM_COMPILER_VERSION 0
|
||||
# define PLATFORM_COMPILER_VERSION_STR "<=5.2-4"
|
||||
# endif
|
||||
# endif
|
||||
# endif /* 0 */
|
||||
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
|
||||
# endif
|
||||
|
||||
#elif defined(__xlC__)
|
||||
# define PLATFORM_COMPILER_XLC 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME XLC
|
||||
# define PLATFORM_COMPILER_FAMILYID 5
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_XLC_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_XLC_C 1
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION __xlC__
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj, min, pat) \
|
||||
(((maj) << 8) | ((min) << 4) | (pat))
|
||||
|
||||
#elif defined(__DECC) || defined(__DECCXX)
|
||||
# define PLATFORM_COMPILER_COMPAQ 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME COMPAQ
|
||||
# define PLATFORM_COMPILER_FAMILYID 6
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_COMPAQ_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_COMPAQ_C 1
|
||||
# endif
|
||||
# if defined(__DECC_VER)
|
||||
# define PLATFORM_COMPILER_VERSION __DECC_VER
|
||||
# elif defined(__DECCXX_VER)
|
||||
# define PLATFORM_COMPILER_VERSION __DECCXX_VER
|
||||
# endif
|
||||
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj, min, pat) \
|
||||
(((maj) *10000000) + ((min) *100000) + (90000) + (pat))
|
||||
/* 90000 = official ver, 80000 = customer special ver, 60000 = field test ver */
|
||||
|
||||
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
||||
# define PLATFORM_COMPILER_SUN 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME SUN
|
||||
# define PLATFORM_COMPILER_FAMILYID 7
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_SUN_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_SUN_C 1
|
||||
# endif
|
||||
# if defined(__SUNPRO_C) && __SUNPRO_C > 0
|
||||
# define PLATFORM_COMPILER_VERSION __SUNPRO_C
|
||||
# elif defined(__SUNPRO_CC) && __SUNPRO_CC > 0
|
||||
# define PLATFORM_COMPILER_VERSION __SUNPRO_CC
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj, min, pat) \
|
||||
(((maj) << 8) | ((min) << 4) | (pat))
|
||||
|
||||
#elif defined(__HP_cc) || defined(__HP_aCC)
|
||||
# define PLATFORM_COMPILER_HP 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME HP
|
||||
# define PLATFORM_COMPILER_FAMILYID 8
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_HP_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_HP_C 1
|
||||
# endif
|
||||
# if defined(__HP_cc) && __HP_cc > 0
|
||||
# define PLATFORM_COMPILER_VERSION __HP_cc
|
||||
# elif defined(__HP_aCC) && __HP_aCC > 0
|
||||
# define PLATFORM_COMPILER_VERSION __HP_aCC
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj, min, pat) \
|
||||
(((maj) << 16) | ((min) << 8) | (pat))
|
||||
|
||||
#elif defined(_SGI_COMPILER_VERSION) || \
|
||||
(defined(_COMPILER_VERSION) && defined(__sgi) && \
|
||||
!defined(__GNUC__)) /* 7.3.0 and earlier lack _SGI_COMPILER_VERSION */
|
||||
# define PLATFORM_COMPILER_SGI 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME SGI
|
||||
# define PLATFORM_COMPILER_FAMILYID 9
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_SGI_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_SGI_C 1
|
||||
# endif
|
||||
# if defined(_SGI_COMPILER_VERSION) && _SGI_COMPILER_VERSION > 0
|
||||
# define PLATFORM_COMPILER_VERSION _SGI_COMPILER_VERSION
|
||||
# elif defined(_COMPILER_VERSION) && _COMPILER_VERSION > 0
|
||||
# define PLATFORM_COMPILER_VERSION _COMPILER_VERSION
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj, min, pat) \
|
||||
(((maj) << 8) | ((min) << 4) | (pat))
|
||||
|
||||
#elif defined(_CRAYC)
|
||||
# define PLATFORM_COMPILER_CRAY 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME CRAY
|
||||
# define PLATFORM_COMPILER_FAMILYID 10
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_CRAY_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_CRAY_C 1
|
||||
# endif
|
||||
# if defined(_RELEASE) && defined(_RELEASE_MINOR) /* X1 and XT */
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(_RELEASE, _RELEASE_MINOR, 0)
|
||||
# elif defined(_RELEASE) /* T3E */
|
||||
# define PLATFORM_COMPILER_VERSION PLATFORM_COMPILER_VERSION_INT(_RELEASE, 0, 0)
|
||||
# endif
|
||||
# ifdef _RELEASE_STRING /* X1 and XT */
|
||||
# define PLATFORM_COMPILER_VERSION_STR _RELEASE_STRING
|
||||
# endif
|
||||
|
||||
#elif defined(__KCC)
|
||||
# define PLATFORM_COMPILER_KAI 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME KAI
|
||||
# define PLATFORM_COMPILER_FAMILYID 11
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_KAI_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_KAI_C 1
|
||||
# endif
|
||||
|
||||
#elif defined(__MTA__)
|
||||
# define PLATFORM_COMPILER_MTA 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME MTA
|
||||
# define PLATFORM_COMPILER_FAMILYID 12
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_MTA_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_MTA_C 1
|
||||
# endif
|
||||
|
||||
#elif defined(_SX)
|
||||
# define PLATFORM_COMPILER_NECSX 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME NECSX
|
||||
# define PLATFORM_COMPILER_FAMILYID 13
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_NECSX_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_NECSX_C 1
|
||||
# endif
|
||||
|
||||
#elif defined(_MSC_VER)
|
||||
# define PLATFORM_COMPILER_MICROSOFT 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME MICROSOFT
|
||||
# define PLATFORM_COMPILER_FAMILYID 14
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_MICROSOFT_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_MICROSOFT_C 1
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION _MSC_VER
|
||||
|
||||
#elif defined(__TINYC__)
|
||||
# define PLATFORM_COMPILER_TINY 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME TINY
|
||||
# define PLATFORM_COMPILER_FAMILYID 15
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_TINY_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_TINY_C 1
|
||||
# endif
|
||||
|
||||
#elif defined(__LCC__)
|
||||
# define PLATFORM_COMPILER_LCC 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME LCC
|
||||
# define PLATFORM_COMPILER_FAMILYID 16
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_LCC_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_LCC_C 1
|
||||
# endif
|
||||
|
||||
#else /* unknown compiler */
|
||||
# define PLATFORM_COMPILER_UNKNOWN 1
|
||||
#endif
|
||||
|
||||
/* this stanza comes last, because many vendor compilers lie and claim
|
||||
to be GNU C for compatibility reasons and/or because they share a frontend */
|
||||
#if defined(__GNUC__)
|
||||
# undef PLATFORM_COMPILER_UNKNOWN
|
||||
# ifndef PLATFORM_COMPILER_FAMILYID
|
||||
# define PLATFORM_COMPILER_GNU 1
|
||||
# define PLATFORM_COMPILER_FAMILYNAME GNU
|
||||
# define PLATFORM_COMPILER_FAMILYID 1
|
||||
# ifdef __cplusplus
|
||||
# define PLATFORM_COMPILER_GNU_CXX 1
|
||||
# else
|
||||
# define PLATFORM_COMPILER_GNU_C 1
|
||||
# endif
|
||||
# if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(__GNUC__, __GNUC_MINOR__, \
|
||||
__GNUC_PATCHLEVEL__)
|
||||
# elif defined( \
|
||||
__GNUC_MINOR__) /* older versions of egcs lack __GNUC_PATCHLEVEL__ */
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(__GNUC__, __GNUC_MINOR__, 0)
|
||||
# else
|
||||
# define PLATFORM_COMPILER_VERSION \
|
||||
PLATFORM_COMPILER_VERSION_INT(__GNUC__, 0, 0)
|
||||
# endif
|
||||
# define PLATFORM_COMPILER_VERSION_STR __PLATFORM_COMPILER_GNU_VERSION_STR
|
||||
# else
|
||||
# define _PLATFORM_COMPILER_GNU_VERSION_STR __PLATFORM_COMPILER_GNU_VERSION_STR
|
||||
# endif
|
||||
/* gather any advertised GNU version number info, even for non-gcc compilers */
|
||||
# if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
|
||||
# define __PLATFORM_COMPILER_GNU_VERSION_STR \
|
||||
_STRINGIFY(__GNUC__) \
|
||||
"." _STRINGIFY(__GNUC_MINOR__) "." _STRINGIFY(__GNUC_PATCHLEVEL__)
|
||||
# elif defined(__GNUC_MINOR__)
|
||||
# define __PLATFORM_COMPILER_GNU_VERSION_STR \
|
||||
_STRINGIFY(__GNUC__) "." _STRINGIFY(__GNUC_MINOR__) ".?"
|
||||
# else
|
||||
# define __PLATFORM_COMPILER_GNU_VERSION_STR _STRINGIFY(__GNUC__) ".?.?"
|
||||
# endif
|
||||
#elif defined(PLATFORM_COMPILER_UNKNOWN) /* unknown compiler */
|
||||
# define PLATFORM_COMPILER_FAMILYNAME UNKNOWN
|
||||
# define PLATFORM_COMPILER_FAMILYID 0
|
||||
#endif
|
||||
|
||||
/* Default Values */
|
||||
#ifndef PLATFORM_COMPILER_VERSION
|
||||
# define PLATFORM_COMPILER_VERSION 0 /* don't know */
|
||||
#endif
|
||||
|
||||
#ifndef PLATFORM_COMPILER_VERSION_STR
|
||||
# define PLATFORM_COMPILER_VERSION_STR _STRINGIFY(PLATFORM_COMPILER_VERSION)
|
||||
#endif
|
||||
|
||||
#ifndef PLATFORM_COMPILER_VERSION_INT
|
||||
# define PLATFORM_COMPILER_VERSION_INT(maj, min, pat) \
|
||||
(((maj) << 16) | ((min) << 8) | (pat))
|
||||
#endif
|
||||
|
||||
#endif /* OPAL_PORTABLE_PLATFORM_H */
|
||||
Ссылка в новой задаче
Block a user