about summary refs log tree commit diff homepage
path: root/runtime/CMakeLists.txt
diff options
context:
space:
mode:
authorMartin Nowack <m.nowack@imperial.ac.uk>2019-11-08 22:55:56 +0000
committerCristian Cadar <c.cadar@imperial.ac.uk>2020-11-04 15:14:47 +0000
commit6156b4eeb9a429ccc370782d719d0d6c787a6f72 (patch)
tree71ca1ec35a44d8170798cf0dc44dd75f71d94040 /runtime/CMakeLists.txt
parent5b8e54a95bc2e1f373710aa62f5e6b70768555e7 (diff)
downloadklee-6156b4eeb9a429ccc370782d719d0d6c787a6f72.tar.gz
[cmake] Add support to generate arbitrary runtime library configurations
Every runtime library can be build with multiple configurations.

Replace the Makefile-based setup by cmake one.
Currently, we generate 32bit and 64bit libraries simultaneously and can link against them.
Diffstat (limited to 'runtime/CMakeLists.txt')
-rw-r--r--runtime/CMakeLists.txt231
1 files changed, 95 insertions, 136 deletions
diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt
index 88a3faf8..327f5407 100644
--- a/runtime/CMakeLists.txt
+++ b/runtime/CMakeLists.txt
@@ -6,150 +6,109 @@
 # License. See LICENSE.TXT for details.
 #
 #===------------------------------------------------------------------------===#
+# Handle binaries
 add_subdirectory(Runtest)
 
-if ("${KLEE_RUNTIME_BUILD_TYPE}" MATCHES "Release")
-  set(RUNTIME_IS_RELEASE 1)
-else()
-  set(RUNTIME_IS_RELEASE 0)
-endif()
+# Handle bitcode libraries
+# Define the different configurations to be compiled and made available using a specific suffix
+
+set(bc_architectures 32 64)
+
+set(LIB_BC_SUFFIX "")
+
+foreach (bc_architecture ${bc_architectures})
+    foreach (bc_optimization ${available_klee_runtime_build_types})
+        # Add configuration to the set of available configurations
+        list(APPEND LIB_BC_SUFFIX "${bc_architecture}_${bc_optimization}")
+
+        # Set specific flags for that configuration
+        set(local_flags "")
+        if (bc_architecture EQUAL "32")
+            list(APPEND local_flags -m32)
+        endif ()
+
+
+        # Set specific compiler flags depending on the optimization
+        if (bc_optimization STREQUAL "Release")
+            list(APPEND local_flags -O2 -DNDebug)
+        elseif (bc_optimization STREQUAL "Release+Debug")
+            list(APPEND local_flags -O2 -g -DNDebug)
+        elseif (bc_optimization STREQUAL "Release+Asserts")
+            list(APPEND local_flags -O2 -g)
+        elseif (bc_optimization STREQUAL "Release+Debug+Asserts")
+            list(APPEND local_flags -O2 -g)
+        elseif (bc_optimization STREQUAL "Debug")
+            list(APPEND local_flags -g -DNDebug)
+        elseif (bc_optimization STREQUAL "Debug+Asserts")
+            list(APPEND local_flags -g)
+        else()
+            message(FATAL_ERROR
+                    "Optimization (\"${bc_optimization}\") for runtime library unknown.")
+        endif ()
+
+        # Define suffix-specific optimizations
+        set("LIB_BC_FLAGS_${bc_architecture}_${bc_optimization}" ${local_flags})
+    endforeach ()
+endforeach ()
+
+message(STATUS "LIB_BC_SUFFIX: ${LIB_BC_SUFFIX}")
+message(STATUS "KLEE_RUNTIME_DIRECTORY: ${KLEE_RUNTIME_DIRECTORY}")
+
+# Add additional setups if needed, e.g.
+# `list(APPEND LIB_BC_SUFFIX MY_SPECIAL_CONFIG)`
+
+# Following define the specific flags: LIB_BC_FLAGS_*SUFFIX_FROM_ABOVE*
+set(LIB_BC_FLAGS_64)
+set(LIB_BC_FLAGS_32
+        -m32
+        )
+
+# Common for all library configurations
+# Setup all compilation flags
+set(COMMON_CC_FLAGS
+        "-I${CMAKE_SOURCE_DIR}/include"
+        "-I${CMAKE_BINARY_DIR}/include"
+        -g
+        -D_DEBUG
+        -D_GNU_SOURCE
+        -D__STDC_LIMIT_MACROS
+        -D__STDC_CONSTANT_MACROS
+        -Wall
+        -Wwrite-strings
+        )
 
-if ("${KLEE_RUNTIME_BUILD_TYPE}" MATCHES "Asserts")
-  set(RUNTIME_HAS_ASSERTIONS 1)
-else()
-  set(RUNTIME_HAS_ASSERTIONS 0)
-endif()
+if (${LLVM_VERSION_MAJOR} GREATER 4)
+    list(APPEND COMMON_CC_FLAGS "-Xclang" "-disable-O0-optnone")
+endif ()
 
-if ("${KLEE_RUNTIME_BUILD_TYPE}" MATCHES "Debug")
-  set(RUNTIME_HAS_DEBUG_SYMBOLS 1)
-else()
-  set(RUNTIME_HAS_DEBUG_SYMBOLS 0)
-endif()
+foreach (_suffix ${LIB_BC_SUFFIX})
+    list(APPEND "LIB_BC_FLAGS_${_suffix}" ${COMMON_CC_FLAGS})
+endforeach ()
 
-if (ENABLE_POSIX_RUNTIME)
-  set(BUILD_POSIX_RUNTIME 1)
-else()
-  set(BUILD_POSIX_RUNTIME 0)
-endif()
+add_subdirectory(FreeStanding)
+add_subdirectory(Intrinsic)
+add_subdirectory(klee-libc)
+
+set(RUNTIME_LIBRARIES
+        RuntimeFreeStanding
+        RuntimeIntrinsic
+        RuntimeKLEELibc
+        )
 
 if (ENABLE_KLEE_EH_CXX)
-  set(BUILD_KLEE_EH_CXX 1)
-else()
-  set(BUILD_KLEE_EH_CXX 0)
-endif()
-
-# Configure the bitcode build system
-configure_file("Makefile.cmake.bitcode.config.in"
-  "Makefile.cmake.bitcode.config"
-  @ONLY
-)
-
-# Copy over the makefiles to the build directory
-configure_file("Makefile.cmake.bitcode" "Makefile.cmake.bitcode" COPYONLY)
-configure_file("Makefile.cmake.bitcode.rules" "Makefile.cmake.bitcode.rules" COPYONLY)
-
-# Makefile for root runtime directory
-# Copy over makefiles for libraries
-set(BITCODE_LIBRARIES "Intrinsic" "klee-libc" "FreeStanding")
-if (ENABLE_POSIX_RUNTIME)
-  list(APPEND BITCODE_LIBRARIES "POSIX")
-endif()
-if (ENABLE_KLEE_EH_CXX)
-  list(APPEND BITCODE_LIBRARIES "klee-eh-cxx")
-endif()
-foreach (bl ${BITCODE_LIBRARIES})
-  configure_file("${bl}/Makefile.cmake.bitcode"
-    "${CMAKE_CURRENT_BINARY_DIR}/${bl}/Makefile.cmake.bitcode"
-    COPYONLY)
-endforeach()
-
-# Find GNU make
-find_program(MAKE_BINARY
-  NAMES make gmake
-)
-
-if (NOT MAKE_BINARY)
-  message(STATUS "Failed to find make binary")
-endif()
-
-# Find env
-find_program(ENV_BINARY
-  NAMES env
-)
-if (NOT ENV_BINARY)
-  message(FATAL_ERROR "Failed to find env binary")
-endif()
-
-option(KLEE_RUNTIME_ALWAYS_REBUILD "Always try to rebuild KLEE runtime" ON)
-if (KLEE_RUNTIME_ALWAYS_REBUILD)
-  set(EXTERNAL_PROJECT_BUILD_ALWAYS_ARG 1)
-else()
-  set(EXTERNAL_PROJECT_BUILD_ALWAYS_ARG 0)
-endif()
-
-# Build the runtime as an external project.
-# We do this because CMake isn't really suitable
-# for building the runtime because it can't handle
-# the source file dependencies properly.
-include(ExternalProject)
-ExternalProject_Add(BuildKLEERuntimes
-  SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}"
-  BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}"
-  CONFIGURE_COMMAND "${CMAKE_COMMAND}" -E echo "" # Dummy command
-  BUILD_COMMAND "${CMAKE_COMMAND}" -E echo "" # Dummy command
-  INSTALL_COMMAND "${CMAKE_COMMAND}" -E echo "" # Dummy command
-)
-
-set(O0OPT "-O0")
-if (${LLVM_VERSION_MAJOR} GREATER 4)
-	set(O0OPT "${O0OPT} -Xclang -disable-O0-optnone")
-endif()
-
-
-# Use `ExternalProject_Add_Step` with `ALWAYS` argument instead of directly
-# building in `ExternalProject_Add` with `BUILD_ALWAYS` argument due to lack of
-# support for the `BUILD_ALWAYS` argument in CMake < 3.1.
-ExternalProject_Add_Step(BuildKLEERuntimes RuntimeBuild
-  # `env` is used here to make sure `MAKEFLAGS` of KLEE's build
-  # is not propagated into the bitcode build system.
-  COMMAND ${ENV_BINARY} MAKEFLAGS="" O0OPT=${O0OPT} ${MAKE_BINARY} -f Makefile.cmake.bitcode all
-  ALWAYS ${EXTERNAL_PROJECT_BUILD_ALWAYS_ARG}
-  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
-  ${EXTERNAL_PROJECT_ADD_STEP_USES_TERMINAL_ARG}
-)
-
-# Target for cleaning the bitcode build system
-# NOTE: Invoking `make clean` does not invoke this target.
-# Instead the user needs to invoke the `clean_all` target.
-# It's also weird that `ExternalProject` provides no way to do a clean.
-add_custom_target(clean_runtime
-  COMMAND ${ENV_BINARY} MAKEFLAGS="" ${MAKE_BINARY} -f Makefile.cmake.bitcode clean
-  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
-  ${ADD_CUSTOM_COMMAND_USES_TERMINAL_ARG}
-)
-add_dependencies(clean_all clean_runtime)
-
-###############################################################################
-# Runtime install
-###############################################################################
-set(RUNTIME_FILES_TO_INSTALL)
-
-list(APPEND RUNTIME_FILES_TO_INSTALL
-  "${KLEE_RUNTIME_DIRECTORY}/libkleeRuntimeIntrinsic.bca"
-  "${KLEE_RUNTIME_DIRECTORY}/libklee-libc.bca"
-  "${KLEE_RUNTIME_DIRECTORY}/libkleeRuntimeFreeStanding.bca"
-  )
+    list(APPEND RUNTIME_LIBRARIES eh-cxx)
+    add_subdirectory(klee-eh-cxx)
+endif ()
 
 if (ENABLE_POSIX_RUNTIME)
-  list(APPEND RUNTIME_FILES_TO_INSTALL
-    "${KLEE_RUNTIME_DIRECTORY}/libkleeRuntimePOSIX.bca")
-endif()
+    list(APPEND RUNTIME_LIBRARIES RuntimePOSIX)
+    add_subdirectory(POSIX)
+endif ()
 
-if (ENABLE_KLEE_EH_CXX)
-  list(APPEND RUNTIME_FILES_TO_INSTALL
-    "${KLEE_RUNTIME_DIRECTORY}/libklee-eh-cxx.bca")
-endif()
+add_custom_target(BuildKLEERuntimes
+        DEPENDS "${RUNTIME_LIBRARIES}"
+        )
 
-install(FILES
-  ${RUNTIME_FILES_TO_INSTALL}
-  DESTINATION "${KLEE_INSTALL_RUNTIME_DIR}")
+install(DIRECTORY "${KLEE_RUNTIME_DIRECTORY}/"
+        DESTINATION "${KLEE_INSTALL_RUNTIME_DIR}"
+        )
\ No newline at end of file