############################################################################### # # Licensed to Accellera Systems Initiative Inc. (Accellera) under one or # more contributor license agreements. See the NOTICE file distributed # with this work for additional information regarding copyright ownership. # Accellera licenses this file to you under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with the # License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. See the License for the specific language governing # permissions and limitations under the License. # ############################################################################### ############################################################################### # # CMakeLists.txt -- # Top-level CMake script to configure the SystemC sources and to generate # native Makefiles and project workspaces for your compiler environment. # # Original Author: Torsten Maehne, Université Pierre et Marie Curie, Paris, # 2013-06-11 # ############################################################################### ############################################################################### # # MODIFICATION LOG - modifiers, enter your name, affiliation, date and # changes you are making here. # # Name, Affiliation, Date: Guillaume Delbergue, GreenSocs, 08 Mar, 2016 # Description of Modification: Extract SystemC/TLM version and date # ############################################################################### ############################################################################### # # This CMake build script was developed taking the # original autotools-based build system of the Accellera SystemC distribution # as a reference. However, it is less restrictive regarding the supported # OS/processor/compiler combinations by detecting the actual features provided # by the target (Unix or Windows) platform. On Unix (including OS X), # shared libraries can be built. If the QuickThreads library provides support # for the target processor, it will be automatically used. Otherwise, we rely # on Pthreads on Unix and Fiber on Windows. By default, the SystemC library # installation will follow the GNU standard installation layout so that also # other SystemC libraries (SystemC, SCV, TLM, AMS extensions) can be installed # into the same directory hierarchy (Unix: /opt/systemc/; # Windows: $ENV{ProgramFiles}/SystemC/). The target platform's conventions are # respected meaning usually include/ for the headers and lib/, lib64/, or # lib// for the libraries. The lib-${SystemC_TARGET_ARCH})/ # convention is not used by default, as ${SystemC_TARGET_ARCH} does not # reliably encode the OS/processor/compiler tuple. # # The CMake build scripts are compatible with CMake >=2.8.5 and have been tested # on the following OS/processor/compiler platforms: # # - Linux (GCC, Clang): i386, x86_64 # # - Linux (GCC): aarch64 # # - macOS >= 11.6 (Xcode/AppleClang): arm64, x86_64 # # - Windows (MingW32 GCC + optionally MSYS): x86 # # Currently untested, but considered by the build script (based on the # autotools scripts) are: # # - *BSD (GCC, Clang): i386, x86_64 # # - Linux (Clang): aarch64 # # - Windows (Cygwin GCC, MingW32 GCC, Visual C++): x86, AMD64 # # The build process can be configured through the configuration variables # offered to the user in the CMake console and GUI (ccmake and cmake-gui, # respectively). Each variable is annotated with a brief documentation string. # The most important variables are: # # BUILD_SHARED_LIBS Build shared instead of static libraries # (default: ON if not targetting Windows). # # BUILD_SOURCE_DOCUMENTATION Build source code documentation using Doxygen # (default: OFF). # # CMAKE_BUILD_TYPE Specifies the build type on single-configuration # generators. (default: Release). # # CMAKE_INSTALL_PREFIX Root directory of the SystemC libraries # installation (defaults to $ENV{SYSTEMC_HOME} # if set to an absolute path and otherwise to either # /opt/systemc/ (Unix-like platforms including # CYGWIN), $ENV{ProgramFiles}/SystemC/ (on Windows # systems), or ${CMAKE_INSTALL_PREFIX}/systemc. # # CMAKE_OSX_ARCHITECTURES Architectures for cross-compilation on Mac OS X # (default: empty, i.e., only for the system # processor). # # CMAKE_VERBOSE_MAKEFILE Generate a verbose Makefile (default: OFF). # # DISABLE_COPYRIGHT_MESSAGE Do not print the copyright message when starting # the application. (default: OFF) # # ENABLE_ASSERTIONS Always enable the `sc_assert' expressions # (default: ON) # # ENABLE_PTHREADS Use POSIX threads for SystemC processes instead # of QuickThreads on Unix or Fiber on Windows. # # OVERRIDE_DEFAULT_STACK_SIZE Define the default stack size used for SystemC # (thread) processes. (> 0) # # SystemC_TARGET_ARCH Target architecture according to the # Accellera SystemC conventions set either from # $ENV{SYSTEMC_TARGET_ARCH}, $ENV{SYSTEMC_ARCH}, # or detected by CMake. # # INSTALL_TO_LIB_BUILD_TYPE_DIR Install the libraries to a # lib-${CMAKE_BUILD_TYPE}/ to enable parallel # installation of the different build variants. # (default: OFF) # # INSTALL_TO_LIB_TARGET_ARCH_DIR Install the libraries to lib- # to facilitate linking applications, which # build systems assume to find SystemC in # lib-. (default: OFF) # # INSTALL_LIB_TARGET_ARCH_SYMLINK On Unix, install a symlink lib- # to lib-${CMAKE_BUILD_TYPE} facilitating the # linking of user code, which build system assumes # to find the SystemC libraries under # lib-. (default: OFF) # # Other configuration variables will be proposed by CMake depending on the OS # and detected processor, compiler, and libraries. For more information, please # refer to the CMake documentation or . # ############################################################################### # # TODO: # # - Enable the compilation of SystemC as a DLL on Windows! To make it work, the # SystemC library has to be at least split into libsystemc-core.dll and a # static libsystemc.lib. # # - Check whether preprocessor definitions WIN32, _CONSOLE, _LIB, _DEBUG, NDEBUG, # and NOGDI are necessary on WIN32 platforms (MSVC and MinGW). # # - Turn on more compiler warnings by default once SystemC is supposed to # compile without any warnings on recent compiler versions. Currently, the # compiler warning flags are set to reduce the number of generated compiler # warnings (especially with recent Clang versions, e.g., Apple Clang 6.0) to # an acceptable amount. With the chosen flags, the SystemC library compiles # without warnings, but some examples still produce warnings. # # - Test on as many different hardware / OS platforms as possible. # # - Configure and install systemc.pc and tlm.pc for pkg-config # ############################################################################### cmake_minimum_required (VERSION 3.5) cmake_policy(SET CMP0001 NEW) project (SystemCLanguage CXX C) # check for multi-config generators (Ninja, Visual Studio, Xcode, ...) get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) # detect if we are building as package, or by add_subdirectory (pre-3.21 support) if(NOT DEFINED PROJECT_IS_TOP_LEVEL) set(PROJECT_IS_TOP_LEVEL TRUE) if(NOT PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) set(PROJECT_IS_TOP_LEVEL FALSE) endif() endif() set(SystemCLanguage_VERSION_FILE "${PROJECT_SOURCE_DIR}/src/sysc/kernel/sc_ver.h") if(EXISTS ${SystemCLanguage_VERSION_FILE}) file(READ ${SystemCLanguage_VERSION_FILE} SYSTEMC_VERSION_FILE_CONTENT) string(REGEX MATCH "SC_VERSION_MAJOR[ \t]+([0-9]+)" SystemCLanguage_VERSION_MAJOR ${SYSTEMC_VERSION_FILE_CONTENT}) string(REGEX MATCH "([0-9]+)" SystemCLanguage_VERSION_MAJOR ${SystemCLanguage_VERSION_MAJOR}) string(REGEX MATCH "SC_VERSION_MINOR[ \t]+([0-9]+)" SystemCLanguage_VERSION_MINOR ${SYSTEMC_VERSION_FILE_CONTENT}) string(REGEX MATCH "([0-9]+)" SystemCLanguage_VERSION_MINOR ${SystemCLanguage_VERSION_MINOR}) string(REGEX MATCH "SC_VERSION_PATCH[ \t]+([0-9]+)" SystemCLanguage_VERSION_PATCH ${SYSTEMC_VERSION_FILE_CONTENT}) string(REGEX MATCH "([0-9]+)" SystemCLanguage_VERSION_PATCH ${SystemCLanguage_VERSION_PATCH}) string(REGEX MATCH "SC_IS_PRERELEASE[ \t]+([0-9]+)" SystemCLanguage_VERSION_IS_PRERELEASE ${SYSTEMC_VERSION_FILE_CONTENT}) string(REGEX MATCH "([0-9]+)" SystemCLanguage_VERSION_IS_PRERELEASE ${SystemCLanguage_VERSION_IS_PRERELEASE}) string(REGEX MATCH "SC_VERSION_PRERELEASE[ \t]+\"([^\".]+)\"" SystemCLanguage_VERSION_PRERELEASE ${SYSTEMC_VERSION_FILE_CONTENT}) string(REGEX REPLACE "(.*)\"(.*)\"" "\\2" SystemCLanguage_VERSION_PRERELEASE ${SystemCLanguage_VERSION_PRERELEASE}) string(REGEX MATCH "SYSTEMC_VERSION[ \t]+([0-9]+)" SystemCLanguage_VERSION_RELEASE_DATE ${SYSTEMC_VERSION_FILE_CONTENT}) string(REGEX MATCH "([0-9]+)" SystemCLanguage_VERSION_RELEASE_DATE ${SystemCLanguage_VERSION_RELEASE_DATE}) else(EXISTS ${SystemCLanguage_VERSION_FILE}) message (FATAL_ERROR "Unable to read SystemC version file") endif(EXISTS ${SystemCLanguage_VERSION_FILE}) set (SystemCLanguage_VERSION "${SystemCLanguage_VERSION_MAJOR}.${SystemCLanguage_VERSION_MINOR}.${SystemCLanguage_VERSION_PATCH}") if (SystemCLanguage_VERSION_IS_PRERELEASE) set (SystemCLanguage_VERSION "${SystemCLanguage_VERSION}_${SystemCLanguage_VERSION_PRERELEASE}_${SystemCLanguage_VERSION_RELEASE_DATE}") endif (SystemCLanguage_VERSION_IS_PRERELEASE) set (SystemCLanguage_SOVERSION "${SystemCLanguage_VERSION_MAJOR}.${SystemCLanguage_VERSION_MINOR}") set(SystemCTLM_VERSION_FILE "${PROJECT_SOURCE_DIR}/src/tlm_core/tlm_2/tlm_version.h") if(EXISTS ${SystemCTLM_VERSION_FILE}) file(READ ${SystemCTLM_VERSION_FILE} SystemCTLM_VERSION_FILE_CONTENT) string(REGEX MATCH "TLM_VERSION_MAJOR[ \t]+([0-9]+)" SystemCTLM_VERSION_MAJOR ${SystemCTLM_VERSION_FILE_CONTENT}) string(REGEX MATCH "([0-9]+)" SystemCTLM_VERSION_MAJOR ${SystemCTLM_VERSION_MAJOR}) string(REGEX MATCH "TLM_VERSION_MINOR[ \t]+([0-9]+)" SystemCTLM_VERSION_MINOR ${SystemCTLM_VERSION_FILE_CONTENT}) string(REGEX MATCH "([0-9]+)" SystemCTLM_VERSION_MINOR ${SystemCTLM_VERSION_MINOR}) string(REGEX MATCH "TLM_VERSION_PATCH[ \t]+([0-9]+)" SystemCTLM_VERSION_PATCH ${SystemCTLM_VERSION_FILE_CONTENT}) string(REGEX MATCH "([0-9]+)" SystemCTLM_VERSION_PATCH ${SystemCTLM_VERSION_PATCH}) string(REGEX MATCH "TLM_IS_PRERELEASE[ \t]+([0-9]+)" SystemCTLM_VERSION_IS_PRERELEASE ${SystemCTLM_VERSION_FILE_CONTENT}) string(REGEX MATCH "([0-9]+)" SystemCTLM_VERSION_IS_PRERELEASE ${SystemCTLM_VERSION_IS_PRERELEASE}) string(REGEX MATCH "TLM_VERSION_PRERELEASE[ \t]+\"([^\".]+)\"" SystemCTLM_VERSION_PRERELEASE ${SystemCTLM_VERSION_FILE_CONTENT}) string(REGEX REPLACE "(.*)\"(.*)\"" "\\2" SystemCTLM_VERSION_PRERELEASE ${SystemCTLM_VERSION_PRERELEASE}) string(REGEX MATCH "TLM_VERSION_RELEASE_YEAR[ \t]+\"([0-9]+)\"" SystemCTLM_VERSION_RELEASE_YEAR ${SystemCTLM_VERSION_FILE_CONTENT}) string(REGEX MATCH "([0-9]+)" SystemCTLM_VERSION_RELEASE_YEAR ${SystemCTLM_VERSION_RELEASE_YEAR}) string(REGEX MATCH "TLM_VERSION_RELEASE_MONTH[ \t]+\"([0-9]+)\"" SystemCTLM_VERSION_RELEASE_MONTH ${SystemCTLM_VERSION_FILE_CONTENT}) string(REGEX MATCH "([0-9]+)" SystemCTLM_VERSION_RELEASE_MONTH ${SystemCTLM_VERSION_RELEASE_MONTH}) string(REGEX MATCH "TLM_VERSION_RELEASE_DAY[ \t]+\"([0-9]+)\"" SystemCTLM_VERSION_RELEASE_DAY ${SystemCTLM_VERSION_FILE_CONTENT}) string(REGEX MATCH "([0-9]+)" SystemCTLM_VERSION_RELEASE_DAY ${SystemCTLM_VERSION_RELEASE_DAY}) else(EXISTS ${SystemCTLM_VERSION_FILE}) message(FATAL_ERROR "Unable to read TLM version file") endif(EXISTS ${SystemCTLM_VERSION_FILE}) set (SystemCTLM_VERSION_RELEASE_DATE "${SystemCTLM_VERSION_RELEASE_YEAR}${SystemCTLM_VERSION_RELEASE_MONTH}${SystemCTLM_VERSION_RELEASE_DAY}") set (SystemCTLM_VERSION "${SystemCTLM_VERSION_MAJOR}.${SystemCTLM_VERSION_MINOR}.${SystemCTLM_VERSION_PATCH}") if (TLM_IS_PRERELEASE) set (SystemCTLM_VERSION "${SystemCTLM_VERSION}_${SystemCTLM_VERSION_PRERELEASE}_${SystemCTLM_VERSION_RELEASE_DATE}") endif (TLM_IS_PRERELEASE) set (SystemCTLM_SOVERSION "${SystemCTLM_VERSION_MAJOR}.${SystemCTLM_VERSION_MINOR}") ############################################################################### # Build options ############################################################################### if(PROJECT_IS_TOP_LEVEL AND NOT WIN32) set(SYSTEMC_SANITIZER_CONFIGURATION_TYPES Asan Msan Tsan UBsan) if(NOT CMAKE_CXX_COMPILER_ID STREQUAL AppleClang) # LeakSanitizer not supported on AppleClang set(SYSTEMC_SANITIZER_CONFIGURATION_TYPES ${SYSTEMC_SANITIZER_CONFIGURATION_TYPES} Lsan) endif() set(CMAKE_CONFIGURATION_TYPES Release Debug RelWithDebInfo ${SYSTEMC_SANITIZER_CONFIGURATION_TYPES}) endif() if(NOT CMAKE_BUILD_TYPE AND NOT GENERATOR_IS_MULTI_CONFIG) set (CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: empty, ${CMAKE_CONFIGURATION_TYPES}." FORCE) endif() #if (NOT (WIN32 OR CYGWIN)) # option (BUILD_SHARED_LIBS "Build shared libraries." ON) #else (NOT (WIN32 OR CYGWIN)) # option (BUILD_SHARED_LIBS "Build shared libraries." OFF) #endif (NOT (WIN32 OR CYGWIN)) #if (BUILD_SHARED_LIBS AND (WIN32 OR CYGWIN)) # set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) #endif(BUILD_SHARED_LIBS AND (WIN32 OR CYGWIN)) option (BUILD_SOURCE_DOCUMENTATION "Build source documentation with Doxygen." OFF) option (DISABLE_COPYRIGHT_MESSAGE "Do not print the copyright message when starting the application." OFF) option (DISABLE_VCD_SCOPES "Put all traces in a single dummy scope. For compatibility with SystemC 2.3.1." OFF) option (ENABLE_ASSERTIONS "Always enable the `sc_assert' expressions." ON) option (ENABLE_PTHREADS "Use POSIX threads for SystemC processes instead of QuickThreads on Unix or Fiber on Windows." OFF) option (INSTALL_TO_LIB_BUILD_TYPE_DIR "Install the libraries to lib-${CMAKE_BUILD_TYPE} to enable parallel installation of the different build variants. (default: OFF)" OFF) option (ALLOW_DEPRECATED_IEEE_API "Suppress warnings for use of deprecated features in IEEE Std. 1666" OFF) if (NOT INSTALL_TO_LIB_BUILD_TYPE_DIR) option (INSTALL_TO_LIB_TARGET_ARCH_DIR "Install the libraries to lib- to facilitate linking applications, which build systems assume to find SystemC in lib-. (default: OFF)" OFF) else (NOT INSTALL_TO_LIB_BUILD_TYPE_DIR) unset (INSTALL_TO_LIB_TARGET_ARCH_DIR CACHE) endif (NOT INSTALL_TO_LIB_BUILD_TYPE_DIR) if (CMAKE_HOST_UNIX AND NOT INSTALL_TO_LIB_TARGET_ARCH_DIR) option (INSTALL_LIB_TARGET_ARCH_SYMLINK "Install a symlink lib- to lib-${CMAKE_BUILD_TYPE} facilitating the linking of user code, which build system assumes to find the SystemC libraries under lib-." OFF) else (CMAKE_HOST_UNIX AND NOT INSTALL_TO_LIB_TARGET_ARCH_DIR) unset (INSTALL_LIB_TARGET_ARCH_SYMLINK CACHE) endif (CMAKE_HOST_UNIX AND NOT INSTALL_TO_LIB_TARGET_ARCH_DIR) set (OVERRIDE_DEFAULT_STACK_SIZE 0 CACHE STRING "Define the default stack size used for SystemC (thread) processes. (> 0)") if (OVERRIDE_DEFAULT_STACK_SIZE LESS 0) message (SEND_ERROR "Negative default stack size requested for SystemC (thread) processes.") endif (OVERRIDE_DEFAULT_STACK_SIZE LESS 0) # Testing option(ENABLE_EXAMPLES "Build examples" ${PROJECT_IS_TOP_LEVEL}) option(ENABLE_REGRESSION "Build regression tests" OFF) mark_as_advanced(DISABLE_COPYRIGHT_MESSAGE ENABLE_ASSERTIONS OVERRIDE_DEFAULT_STACK_SIZE DISABLE_VCD_SCOPES) ############################################################################### # Set SystemC_TARGET_ARCH depending on OS and processor type ############################################################################### message (STATUS "Checking OS and processor type.") if (APPLE) list (LENGTH CMAKE_OSX_ARCHITECTURES N_OSX_ARCHITECTURES) if (NOT DEFINED CMAKE_OSX_ARCHITECTURES_CACHED OR NOT ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "${CMAKE_OSX_ARCHITECTURES_CACHED}")) set(CMAKE_OSX_ARCHITECTURES_CACHED "${CMAKE_OSX_ARCHITECTURES}" CACHE INTERNAL "" FORCE) unset(SystemC_TARGET_ARCH CACHE) unset(HAS__aarch64__DEFINED CACHE) unset(HAS__i386_DEFINED CACHE) unset(HAS__x86_64__DEFINED CACHE) endif() endif (APPLE) include (CheckSymbolExists) check_symbol_exists (__x86_64__ "" HAS__x86_64__DEFINED) check_symbol_exists (__i386 "" HAS__i386_DEFINED) check_symbol_exists (__aarch64__ "" HAS__aarch64__DEFINED) # Set SystemC_TARGET_ARCH according to the detected # OS/processor/compiler platform if (NOT SystemC_TARGET_ARCH) if (DEFINED ENV{SYSTEMC_TARGET_ARCH}) message (STATUS "Using SYSTEMC_TARGET_ARCH from the environment.") set (_TARGET_ARCH $ENV{SYSTEMC_TARGET_ARCH}) elseif (APPLE) if (N_OSX_ARCHITECTURES GREATER 1) set (_TARGET_ARCH "macosuniversal") elseif (HAS__aarch64__DEFINED) set (_TARGET_ARCH "macosarm64") elseif (HAS__x86_64__DEFINED) set (_TARGET_ARCH "macosx64") else (N_OSX_ARCHITECTURES GREATER 1) set (_TARGET_ARCH "macosunknown") endif (N_OSX_ARCHITECTURES GREATER 1) elseif (UNIX AND CMAKE_SYSTEM_NAME STREQUAL "Linux") if (HAS__i386_DEFINED) set (_TARGET_ARCH "linux") elseif (HAS__x86_64__DEFINED) set (_TARGET_ARCH "linux64") elseif (HAS__aarch64__DEFINED) set (_TARGET_ARCH "linuxaarch64") else (HAS__i386_DEFINED) # Untested platform. set (_TARGET_ARCH "linuxunknown") endif (HAS__i386_DEFINED) elseif (UNIX AND CMAKE_SYSTEM_NAME MATCHES ".*BSD") if (HAS__i386_DEFINED) set (_TARGET_ARCH "bsd") elseif (HAS__x86_64__DEFINED) set (_TARGET_ARCH "bsd64") else (HAS__i386_DEFINED) # Untested platform. set (_TARGET_ARCH "bsdunknown") endif (HAS__i386_DEFINED) elseif (MSVC) set (_TARGET_ARCH "msvc") if (CMAKE_CL_64) set (_TARGET_ARCH "${_TARGET_ARCH}64") endif (CMAKE_CL_64) elseif (CYGWIN) if (HAS__i386_DEFINED) set (_TARGET_ARCH "cygwin") elseif (HAS__x86_64__DEFINED) set (_TARGET_ARCH "cygwin64") else (HAS__i386_DEFINED) set (_TARGET_ARCH "cygwinunknown") endif (HAS__i386_DEFINED) elseif (WIN32 AND ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))) # MinGW platform, as CYGWIN already has been handled if (HAS__i386_DEFINED) set (_TARGET_ARCH "mingw") elseif (HAS__x86_64__DEFINED) set (_TARGET_ARCH "mingw64") else (HAS__i386_DEFINED) set (_TARGET_ARCH "mingwunknown") endif (HAS__i386_DEFINED) else ($ENV{SYSTEMC_TARGET_ARCH}) # Unknown platform, so guess a SystemC target architecture value. string (TOLOWER "${CMAKE_SYSTEM_NAME}${CMAKE_PROCESSOR_NAME}" _TARGET_ARCH) endif (DEFINED ENV{SYSTEMC_TARGET_ARCH}) set (SystemC_TARGET_ARCH ${_TARGET_ARCH} CACHE STRING "SystemC Target Architecture") unset (_TARGET_ARCH) endif (NOT SystemC_TARGET_ARCH) ############################################################################### # Configure QuickThreads ############################################################################### # Set QuickThreads architecture based on the detected preprocessor symbols. message (STATUS "Detect the target processor architecture for QuickThreads.") if (ENABLE_PTHREADS) set (QT_ARCH "IGNORE") # Pthreads will be used for the SystemC coroutines. elseif (MSVC) set (QT_ARCH "IGNORE") # Fibers will be used for the SystemC coroutines. elseif (APPLE AND (N_OSX_ARCHITECTURES GREATER 1)) foreach(arch IN LISTS CMAKE_OSX_ARCHITECTURES) if (arch MATCHES "^(arm64|i386|x86_64)$") set(QT_ARCH "multi") else() message (FATAL_ERROR "QuickThreads is not supported on macOS ${arch} universal build.") endif() endforeach() elseif (HAS__x86_64__DEFINED) set (QT_ARCH "x86_64") elseif (HAS__i386_DEFINED) set (QT_ARCH "i386") elseif (HAS__aarch64__DEFINED) set (QT_ARCH "aarch64") else (ENABLE_PTHREADS) message (WARNING "QuickThreads is not supported on ${CMAKE_SYSTEM} on ${CMAKE_SYSTEM_PROCESSOR}.") set (QT_ARCH "IGNORE") endif (ENABLE_PTHREADS) if (QT_ARCH) # To build QuickThreads, enable the assembler support. enable_language (ASM) else (QT_ARCH) # Otherwise, fall back to Pthreads or Fiber. if (NOT MSVC) set (ENABLE_PTHREADS TRUE CACHE BOOL "Use POSIX threads for SystemC processes instead of QuickThreads on Unix or Fiber on Windows." FORCE) endif (NOT MSVC) endif (QT_ARCH) ############################################################################### # Configure Pthreads or Fiber if necessary. ############################################################################### set (THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) if (WIN32 AND ENABLE_PTHREADS) message (FATAL_ERROR "Pthreads is not supported on ${CMAKE_SYSTEM}.") endif (WIN32 AND ENABLE_PTHREADS) ############################################################################### # Set the installation paths ############################################################################### #if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) # if (IS_ABSOLUTE $ENV{SYSTEMC_HOME}) # set (_CMAKE_INSTALL_PREFIX $ENV{SYSTEMC_HOME}) # elseif (UNIX) # set (_CMAKE_INSTALL_PREFIX "/opt/systemc") # elseif (WIN32) # file (TO_CMAKE_PATH $ENV{ProgramFiles} _WIN32_INSTALL_PREFIX) # set (_CMAKE_INSTALL_PREFIX "${_WIN32_INSTALL_PREFIX}/SystemC") # unset (_WIN32_INSTALL_PREFIX) # else (EXISTS $ENV{SYSTEMC_ROOT_DIR}) # set (_CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/systemc") # endif (IS_ABSOLUTE $ENV{SYSTEMC_HOME}) # set (CMAKE_INSTALL_PREFIX ${_CMAKE_INSTALL_PREFIX} CACHE PATH "Installation root directory" FORCE) # unset (_CMAKE_INSTALL_PREFIX) #endif (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) # Set the installation paths for headers, libraries, and documentation. set (CMAKE_INSTALL_DOCDIR "share/doc/systemc" CACHE PATH "Documentation installation directory") # otherwise mixed-case if (INSTALL_TO_LIB_BUILD_TYPE_DIR) # Install libraries to lib-${CMAKE_BUILD_TYPE} so that different build variants # of the library can be installed in parallel to the same SystemC root # directory. The find_package() mechanism in config-mode of CMake will then # automatically find the correct libraries matching the chosen # ${CMAKE_BUILD_TYPE}. set (_INSTALL_LIBDIR lib-${CMAKE_BUILD_TYPE}) string (TOLOWER ${_INSTALL_LIBDIR} _INSTALL_LIBDIR) set (CMAKE_INSTALL_LIBDIR ${_INSTALL_LIBDIR} CACHE PATH "Object code libraries installation directory" FORCE) unset (_INSTALL_LIBDIR) elseif (INSTALL_TO_LIB_TARGET_ARCH_DIR) # Some build systems assume to find SystemC in lib- set (CMAKE_INSTALL_LIBDIR lib-${SystemC_TARGET_ARCH} CACHE PATH "Object code libraries installation directory" FORCE) endif (INSTALL_TO_LIB_BUILD_TYPE_DIR) include (GNUInstallDirs) # Install symlink lib- to lib-${CMAKE_BUILD_TYPE} if (INSTALL_LIB_TARGET_ARCH_SYMLINK AND CMAKE_HOST_UNIX) install (CODE " EXECUTE_PROCESS(COMMAND cmake -E create_symlink ${CMAKE_INSTALL_LIBDIR} lib-${SystemC_TARGET_ARCH} WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}) ") endif (INSTALL_LIB_TARGET_ARCH_SYMLINK AND CMAKE_HOST_UNIX) if (INSTALL_TO_LIB_BUILD_TYPE_DIR OR INSTALL_TO_LIB_TARGET_ARCH_DIR) set (SystemCLanguage_INSTALL_CMAKEDIR share/cmake/SystemCLanguage CACHE PATH "CMake package configuration installation directory" FORCE) set (SystemCTLM_INSTALL_CMAKEDIR share/cmake/SystemCTLM CACHE PATH "CMake package configuration installation directory" FORCE) else (INSTALL_TO_LIB_BUILD_TYPE_DIR OR INSTALL_TO_LIB_TARGET_ARCH_DIR) set (SystemCLanguage_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/SystemCLanguage CACHE PATH "CMake package configuration installation directory for the SystemCLanguage package.") set (SystemCTLM_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/SystemCTLM CACHE PATH "CMake package configuration installation directory for the SystemCTLM package.") endif (INSTALL_TO_LIB_BUILD_TYPE_DIR OR INSTALL_TO_LIB_TARGET_ARCH_DIR) mark_as_advanced(SystemCLanguage_INSTALL_CMAKEDIR SystemCTLM_INSTALL_CMAKEDIR) set(SystemCLanguage_INSTALL_FULL_CMAKEDIR "${CMAKE_INSTALL_PREFIX}/${SystemCLanguage_INSTALL_CMAKEDIR}") set(SystemCTLM_INSTALL_FULL_CMAKEDIR "${CMAKE_INSTALL_PREFIX}/${SystemCTLM_INSTALL_CMAKEDIR}") ############################################################################### # Global compiler flags (including examples/tests) ############################################################################### option(ENABLE_WARNINGS_AS_ERRORS "Treat compiler warnings as errors" OFF) if(ENABLE_WARNINGS_AS_ERRORS) add_compile_options( $<$,$,$>:-Werror> $<$:/WX> ) endif() # On Xcode, we need to disable the -Wconversion warning explicitly if(XCODE) add_compile_options($<$:-Wno-conversion>) endif() # Sanitizer setup if(DEFINED SYSTEMC_SANITIZER_CONFIGURATION_TYPES) function(set_sanitizer_flags type sanitizer cxx_flags) set(_common_option "-fsanitize=${sanitizer}") set(CMAKE_C_FLAGS_${type} "${_common_option} -fno-omit-frame-pointer ${cxx_flags}" CACHE STRING "CFLAGS for ${type}" FORCE) set(CMAKE_CXX_FLAGS_${type} "${_common_option} -fno-omit-frame-pointer ${cxx_flags}" CACHE STRING "CXXFLAGS for ${type}" FORCE) set(CMAKE_EXE_LINKER_FLAGS_${type} "${_common_option}" CACHE STRING "LINKER_FLAGS for ${type}" FORCE) set(CMAKE_SHARED_LINKER_FLAGS_${type} "${_common_option}" CACHE STRING "SHARED_LINKER_FLAGS for ${type}" FORCE) endfunction() set_sanitizer_flags(ASAN address "-fno-optimize-sibling-calls -g -O1") set_sanitizer_flags(MSAN memory "-fno-optimize-sibling-calls -fsanitize-memory-track-origins -g -O1") set_sanitizer_flags(TSAN thread "-g -O1") set_sanitizer_flags(UBSAN undefined "-g -O1") if(NOT CMAKE_CXX_COMPILER_ID STREQUAL AppleClang) # LeakSanitizer not supported set_sanitizer_flags(LSAN leak "-g -O1") endif() endif() ############################################################################### # Configure RPATH so that all targets find the libraries they link to ############################################################################### # Starting from CMake 2.8.12 use CMake's full RPATH support on Mac OS X set (CMAKE_MACOSX_RPATH TRUE) # Use, i.e., don't skip, the full RPATH for the build tree. set (CMAKE_SKIP_BUILD_RPATH FALSE) # For build, don't use the install RPATH already (but later on when installing). set (CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) # Set the RPATH to be used when installing. set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR}") # Add the automatically determined parts of the RPATH, which point to # directories outside the build tree, to the install RPATH. set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # Set the RPATH to be used when installing, but only if it's not a system directory list (FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_FULL_LIBDIR}" isSystemDir) if ("${isSystemDir}" STREQUAL "-1") set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR}") endif ("${isSystemDir}" STREQUAL "-1") ############################################################################### # Configure status ############################################################################### message (STATUS "========================================================================") message (STATUS "Settings to build SystemC ${SystemCLanguage_VERSION} (${SystemCLanguage_VERSION_RELEASE_DATE}) and TLM ${SystemCTLM_VERSION} (${SystemCTLM_VERSION_RELEASE_DATE})") message (STATUS "------------------------------------------------------------------------") message (STATUS "BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}") message (STATUS "BUILD_SOURCE_DOCUMENTATION = ${BUILD_SOURCE_DOCUMENTATION}") message (STATUS "ENABLE_EXAMPLES = ${ENABLE_EXAMPLES}") message (STATUS "ENABLE_REGRESSION = ${ENABLE_REGRESSION}") if (NOT GENERATOR_IS_MULTI_CONFIG) message (STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}") endif() message (STATUS "DISABLE_COPYRIGHT_MESSAGE = ${DISABLE_COPYRIGHT_MESSAGE}") message (STATUS "DISABLE_VCD_SCOPES = ${DISABLE_VCD_SCOPES}") message (STATUS "ENABLE_ASSERTIONS = ${ENABLE_ASSERTIONS}") if (ENABLE_PTHREADS) message ("ENABLE_PTHREADS = ${ENABLE_PTHREADS}") else (ENABLE_PTHREADS) message (STATUS "ENABLE_PTHREADS = ${ENABLE_PTHREADS}") endif (ENABLE_PTHREADS) if (OVERRIDE_DEFAULT_STACK_SIZE GREATER 0) message (STATUS "OVERRIDE_DEFAULT_STACK_SIZE = ${OVERRIDE_DEFAULT_STACK_SIZE}") endif (OVERRIDE_DEFAULT_STACK_SIZE GREATER 0) message (STATUS "SystemC_TARGET_ARCH = ${SystemC_TARGET_ARCH}") message (STATUS "SystemCLanguage_VERSION = ${SystemCLanguage_VERSION}") message (STATUS "SystemCTLM_VERSION = ${SystemCTLM_VERSION}") message (STATUS "INSTALL_TO_LIB_BUILD_TYPE_DIR = ${INSTALL_TO_LIB_BUILD_TYPE_DIR}") message (STATUS "INSTALL_TO_LIB_TARGET_ARCH_DIR = ${INSTALL_TO_LIB_TARGET_ARCH_DIR}") message (STATUS "INSTALL_LIB_TARGET_ARCH_SYMLINK = ${INSTALL_LIB_TARGET_ARCH_SYMLINK}") message (STATUS "------------------------------------------------------------------------") message (STATUS "CMAKE_SYSTEM = ${CMAKE_SYSTEM}") message (STATUS "CMAKE_SYSTEM_PROCESSOR = ${CMAKE_SYSTEM_PROCESSOR}") message (STATUS "QT_ARCH = ${QT_ARCH}") if (DEFINED CMAKE_OSX_ARCHITECTURES) message (STATUS "CMAKE_OSX_ARCHITECTURES = ${CMAKE_OSX_ARCHITECTURES}") endif (DEFINED CMAKE_OSX_ARCHITECTURES) if (DEFINED CMAKE_OSX_DEPLOYMENT_TARGET) message (STATUS "CMAKE_OSX_DEPLOYMENT_TARGET = ${CMAKE_OSX_DEPLOYMENT_TARGET}") endif (DEFINED CMAKE_OSX_DEPLOYMENT_TARGET) if (DEFINED CMAKE_OSX_SYSROOT) message (STATUS "CMAKE_OSX_SYSROOT = ${CMAKE_OSX_SYSROOT}") endif(DEFINED CMAKE_OSX_SYSROOT) message (STATUS "------------------------------------------------------------------------") message (STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}") message (STATUS "CMAKE_INSTALL_BINDIR = ${CMAKE_INSTALL_BINDIR}") message (STATUS "CMAKE_INSTALL_DOCDIR = ${CMAKE_INSTALL_DOCDIR}") message (STATUS "CMAKE_INSTALL_INCLUDEDIR = ${CMAKE_INSTALL_INCLUDEDIR}") message (STATUS "CMAKE_INSTALL_LIBDIR = ${CMAKE_INSTALL_LIBDIR}") message (STATUS "INSTALL_CMAKEDIR = ${INSTALL_CMAKEDIR}") message (STATUS "========================================================================") ############################################################################### # Subdirectories ############################################################################### list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) add_subdirectory (src) add_subdirectory (docs) #add_subdirectory (examples) #add_subdirectory (tests) ############################################################################### # Install README files ############################################################################### install (FILES AUTHORS.md INSTALL.md cmake/INSTALL_USING_CMAKE.md LICENSE NOTICE README.md RELEASENOTES.md DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT doc) ############################################################################### # Provide package of the SystemC library to other programs using CMake ############################################################################### # Export the systemc library target for usage by other programs to installation tree #install (EXPORT SystemCLanguageTargets # NAMESPACE SystemC:: # DESTINATION ${SystemCLanguage_INSTALL_CMAKEDIR} # COMPONENT dev) # # Register the SystemCLanguage and SystemCTLM packages for use from the # build tree. (This registers the build tree with the global CMake-registry.) #export (PACKAGE SystemCLanguage) #export (PACKAGE SystemCTLM) # # Create the Config.cmake and ConfigVersion files #include(CMakePackageConfigHelpers) #configure_package_config_file(cmake/SystemCLanguageConfig.cmake.in # ${CMAKE_CURRENT_BINARY_DIR}/SystemCLanguageConfig.cmake # INSTALL_DESTINATION ${SystemCLanguage_INSTALL_CMAKEDIR}) #write_basic_package_version_file( # "${CMAKE_CURRENT_BINARY_DIR}/SystemCLanguageConfigVersion.cmake" # VERSION ${SystemCLanguage_VERSION_MAJOR}.${SystemCLanguage_VERSION_MINOR}.${SystemCLanguage_VERSION_PATCH}.${SystemCLanguage_VERSION_RELEASE_DATE} # COMPATIBILITY AnyNewerVersion #) #configure_package_config_file(cmake/SystemCTLMConfig.cmake.in # ${CMAKE_CURRENT_BINARY_DIR}/SystemCTLMConfig.cmake # INSTALL_DESTINATION ${SystemCTLM_INSTALL_CMAKEDIR}) #write_basic_package_version_file( # "${CMAKE_CURRENT_BINARY_DIR}/SystemCTLMConfigVersion.cmake" # VERSION ${SystemCTLM_VERSION_MAJOR}.${SystemCTLM_VERSION_MINOR}.${SystemCTLM_VERSION_PATCH}.${SystemCTLM_VERSION_RELEASE_DATE} # COMPATIBILITY AnyNewerVersion #) # Install the Config.cmake and ConfigVersion.cmake #install(FILES "${PROJECT_BINARY_DIR}/SystemCLanguageConfig.cmake" # "${PROJECT_BINARY_DIR}/SystemCLanguageConfigVersion.cmake" # DESTINATION "${SystemCLanguage_INSTALL_CMAKEDIR}" # COMPONENT dev) #install(FILES "${PROJECT_BINARY_DIR}/SystemCTLMConfig.cmake" # "${PROJECT_BINARY_DIR}/SystemCTLMConfigVersion.cmake" # DESTINATION "${SystemCTLM_INSTALL_CMAKEDIR}" # COMPONENT dev)