/******************************************************************************* * This file is part of SWIFT. * Copyright (C) 2012 Matthieu Schaller (schaller@strw.leidenuniv.nl). * Copyright (C) 2015 Peter W. Draper (p.w.draper@durham.ac.uk). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * ******************************************************************************/ /* Config parameters. */ #include /* MPI headers. */ #ifdef WITH_MPI #include #ifdef HAVE_METIS #include #endif #ifdef HAVE_PARMETIS #include #endif #endif #ifdef HAVE_HDF5 #include #endif #ifdef HAVE_FFTW #include #endif #ifdef HAVE_LIBGSL #include #endif #ifdef HAVE_SUNDIALS #include #endif /* Some standard headers. */ #include #include #include #include /* This object's header. */ #include "error.h" #include "version.h" /* Local headers. */ #include "version_string.h" /** * @brief Return the hostname * * Will return the name of the host. * * @result the hostname. */ const char *hostname(void) { static char buf[256]; static int initialised = 0; if (!initialised) { buf[255] = '\0'; if (gethostname(buf, 255)) sprintf(buf, "%s", "Unknown host"); initialised = 1; } return buf; } /** * @brief Return the source code git revision * * The SHA of the code checked out when the library was last built. * Will include -dirty if they are local modifications. * * @result the git version. */ const char *git_revision(void) { static char buf[256]; static int initialised = 0; static const char *revision = GIT_REVISION; if (!initialised) { if (strlen(revision) == 0) sprintf(buf, "%s", "unknown"); else sprintf(buf, "%s", revision); initialised = 1; } return buf; } /** * @brief Return the source code git branch * * The name of the current branch when the code was last built. * * @result git branch */ const char *git_branch(void) { static char buf[256]; static int initialised = 0; static const char *branch = GIT_BRANCH; if (!initialised) { if (strlen(branch) == 0) sprintf(buf, "%s", "unknown"); else sprintf(buf, "%s", branch); initialised = 1; } return buf; } /** * @brief Return the date of the commit in the git repository * * The date of the commit of the code we are running. * * @result git branch */ const char *git_date(void) { static char buf[256]; static int initialised = 0; static const char *date = GIT_DATE; if (!initialised) { if (strlen(date) == 0) sprintf(buf, "%s", "unknown"); else sprintf(buf, "%s", date); initialised = 1; } return buf; } /** * @brief Return the options passed to the 'configure' script * * @result List of configuration options within simple quotes ('). */ const char *configuration_options(void) { static char buf[1024]; static int initialised = 0; static const char *config = SWIFT_CONFIG_FLAGS; if (!initialised) { snprintf(buf, 1024, "'%.1021s'", config); initialised = 1; } return buf; } /** * @brief Return the CFLAGS the code was compiled with * * @result List of CFLAGS within simple quotes ('). */ const char *compilation_cflags(void) { static char buf[1024]; static int initialised = 0; static const char *cflags = SWIFT_CFLAGS; if (!initialised) { snprintf(buf, 1024, "'%.1021s'", cflags); initialised = 1; } return buf; } /** * @brief The version of SWIFT * * @result the package version */ const char *package_version(void) { static const char *version = PACKAGE_VERSION; return version; } /** * @brief A description of the package version and code status. * * @result description of the package version */ const char *package_description(void) { static char buf[256]; static int initialised = 0; if (!initialised) { sprintf(buf, "SWIFT version: %s, at revision: %s, branch: %s", PACKAGE_VERSION, GIT_REVISION, GIT_BRANCH); initialised = 1; } return buf; } /** * @brief return the name of the compiler used to build SWIFT. * * @result description of the compiler. */ const char *compiler_name(void) { static char compiler[256] = {0}; #if defined(__INTEL_COMPILER) sprintf(compiler, "ICC"); #elif defined(__clang__) sprintf(compiler, "LLVM/Clang"); #elif defined(__xlc__) sprintf(compiler, "IBM XL"); #elif defined(__GNUC__) sprintf(compiler, "GCC"); #endif if (strlen(compiler) == 0) sprintf(compiler, "Unknown compiler"); return compiler; } /** * @brief return compiler version used to build SWIFT. * * @result description of the compiler. */ const char *compiler_version(void) { static char version[256] = {0}; #if defined(__INTEL_COMPILER) const int major = __INTEL_COMPILER / 100; const int minor = __INTEL_COMPILER - major * 100; sprintf(version, "%i.%i.%i", major, minor, __INTEL_COMPILER_BUILD_DATE); #elif defined(__clang__) sprintf(version, "%i.%i.%i", __clang_major__, __clang_minor__, __clang_patchlevel__); #elif defined(__xlc__) const int major = __IBMC__ / 100; const int minor = (__IBMC__ - major * 100) / 10; const int patch = (__IBMC__ - major * 100 - minor * 10); sprintf(version, "%i.%i.%i", major, minor, patch); #elif defined(__GNUC__) sprintf(version, "%i.%i.%i", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__); #endif if (strlen(version) == 0) sprintf(version, "Unknown version"); return version; } /** * @brief return the MPI version, runtime if possible otherwise that used when * built. * * @result description of the MPI version. */ const char *mpi_version(void) { static char version[80] = {0}; #ifdef WITH_MPI int std_version, std_subversion; /* Check that the library implements the version string routine */ #ifdef MPI_MAX_LIBRARY_VERSION_STRING static char lib_version[MPI_MAX_LIBRARY_VERSION_STRING] = {0}; int len; MPI_Get_library_version(lib_version, &len); /* Find first \n and truncate string to this length, can get many lines from * some MPIs (MPICH). */ char *ptr = strchr(lib_version, '\n'); if (ptr != NULL) *ptr = '\0'; /* Also arbitrarily truncate to keep down to one line, Open MPI, * check for last comma and keep to ~60 chars max. */ strcpy(lib_version + 60, "..."); ptr = strrchr(lib_version, ','); if (ptr != NULL) *ptr = '\0'; #else /* Use autoconf guessed value. */ static char lib_version[60] = {0}; snprintf(lib_version, 60, "%.60s", SWIFT_MPI_LIBRARY); #endif /* Numeric version. */ MPI_Get_version(&std_version, &std_subversion); snprintf(version, 80, "%.60s (MPI std v%i.%i)", lib_version, std_version, std_subversion); #else sprintf(version, "Code was not compiled with MPI support"); #endif return version; } /** * @brief return the HDF5 version in use at runtime. * * @result description of the current HDF5 version. */ const char *hdf5_version(void) { static char version[256] = {0}; #ifdef HAVE_HDF5 unsigned int majnum, minnum, relnum; H5get_libversion(&majnum, &minnum, &relnum); sprintf(version, "%u.%u.%u", majnum, minnum, relnum); #else sprintf(version, "Unknown version"); #endif return version; } /** * @brief return the METIS version used when SWIFT was built. * * @result description of the METIS version. */ const char *metis_version(void) { static char version[256] = {0}; #if defined(WITH_MPI) && defined(HAVE_METIS) sprintf(version, "%i.%i.%i", METIS_VER_MAJOR, METIS_VER_MINOR, METIS_VER_SUBMINOR); #else sprintf(version, "Unknown version"); #endif return version; } /** * @brief return the ParMETIS version used when SWIFT was built. * * @result description of the ParMETIS version. */ const char *parmetis_version(void) { static char version[256] = {0}; #if defined(WITH_MPI) && defined(HAVE_PARMETIS) sprintf(version, "%i.%i.%i", PARMETIS_MAJOR_VERSION, PARMETIS_MINOR_VERSION, PARMETIS_SUBMINOR_VERSION); #else sprintf(version, "Unknown version"); #endif return version; } /** * @brief return the FFTW version used when SWIFT was built. * * @result description of the FFTW version. */ const char *fftw3_version(void) { static char version[256] = {0}; #if defined(HAVE_FFTW) sprintf(version, "%s", "3.x (details not available)"); #else sprintf(version, "Unknown version"); #endif return version; } /** * @brief return the GSL version used when SWIFT was built. * * @result description of the GSL version. */ const char *libgsl_version(void) { static char version[256] = {0}; #if defined(HAVE_LIBGSL) sprintf(version, "%.255s", gsl_version); #else sprintf(version, "Unknown version"); #endif return version; } /** * @brief return the SUNDIALS version used when SWIFT was built. * * @result description of the SUNDIALS version. */ const char *sundials_version(void) { static char version[256] = {0}; #if defined(HAVE_SUNDIALS) SUNDIALSGetVersion(version, 256); #else sprintf(version, "Unknown version"); #endif return version; } /** * @brief return the thread barrier used in SWIFT. * * @result description of the thread barriers */ const char *thread_barrier_version(void) { static char version[256] = {0}; #if defined(HAVE_PTHREAD_BARRIERS) sprintf(version, "%s", "pthread"); #else sprintf(version, "homemade"); #endif return version; } /** * @brief return the allocator library used in SWIFT. * * @result description of the allocation library */ const char *allocator_version(void) { static char version[256] = {0}; #if defined(HAVE_TBBMALLOC) sprintf(version, "TBB malloc"); #elif defined(HAVE_TCMALLOC) sprintf(version, "tc-malloc"); #elif defined(HAVE_JEMALLOC) sprintf(version, "je-malloc"); #else sprintf(version, "Compiler version (probably glibc)"); #endif return version; } /** * @brief Prints a greeting message to the standard output containing code * version and revision number * * This was constructed using the 'figlet' tool and the 'slant' font. The * lower-bar of the f is then lengthened. * * @param fof Is this for the FOF greeting? */ void greetings(int fof) { if (!fof) { printf(" Welcome to the cosmological hydrodynamical code\n"); printf(" ______ _________________\n"); printf(" / ___/ | / / _/ ___/_ __/\n"); printf(" \\__ \\| | /| / // // /_ / / \n"); printf(" ___/ /| |/ |/ // // __/ / / \n"); printf(" /____/ |__/|__/___/_/ /_/ \n"); printf(" SPH With Inter-dependent Fine-grained Tasking\n\n"); } else { printf(" Welcome to the particle group finding tool\n"); printf(" ______ __________________ __________ ______\n"); printf(" / ___/ | / / _/ ____/_ __/ / ____/ __ \\/ ____/\n"); printf(" \\__ \\| | /| / // // /__ / /_____/ /__ / / / / /__ \n"); printf(" ___/ /| |/ |/ // // ___/ / /_____/ ___// /_/ / ___/ \n"); printf("/____/ |__/|__/___/_/ /_/ /_/ \\____/_/ \n"); printf( " SPH With Inter-dependent Fine-grained Tasking - " "Friend-of-Friends\n\n"); } printf(" Version : %s\n", package_version()); printf(" Revision: %s, Branch: %s, Date: %s\n", git_revision(), git_branch(), git_date()); printf(" Webpage : %s\n\n", PACKAGE_URL); printf(" Config. options: %s\n\n", configuration_options()); printf(" Compiler: %s, Version: %s\n", compiler_name(), compiler_version()); printf(" CFLAGS : %s\n", compilation_cflags()); printf("\n"); #ifdef HAVE_HDF5 printf(" HDF5 library version : %s\n", hdf5_version()); #endif #ifdef HAVE_FFTW printf(" FFTW library version : %s\n", fftw3_version()); #endif #ifdef HAVE_LIBGSL printf(" GSL library version : %s\n", libgsl_version()); #endif #ifdef HAVE_SUNDIALS printf(" SUNDIALS library version : %s\n", sundials_version()); #endif #ifdef WITH_MPI printf(" MPI library version : %s\n", mpi_version()); #ifdef HAVE_METIS printf(" METIS library version : %s\n", metis_version()); #endif #ifdef HAVE_PARMETIS printf(" ParMETIS library version : %s\n", parmetis_version()); #endif #endif printf("\n"); }