]> www.ginac.de Git - ginac.git/blobdiff - CMakeLists.txt
[build] GiNaC can be built with CMake now.
[ginac.git] / CMakeLists.txt
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..86d76fa
--- /dev/null
@@ -0,0 +1,177 @@
+cmake_minimum_required(VERSION 2.6)
+set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
+
+project(GiNaC)
+file(STRINGS ${CMAKE_SOURCE_DIR}/ginac/version.h _ginac_vinfo REGEX "^#define[\t ]+GINACLIB_.*_VERSION.*")
+string(REGEX REPLACE "^.*GINACLIB_MAJOR_VERSION[ \t]+([0-9]+).*" "\\1" GINAC_MAJOR_VERSION "${_ginac_vinfo}")
+string(REGEX REPLACE "^.*GINACLIB_MINOR_VERSION[ \t]+([0-9]+).*" "\\1" GINAC_MINOR_VERSION "${_ginac_vinfo}")
+string(REGEX REPLACE "^.*GINACLIB_MICRO_VERSION[ \t]+([0-9]+).*" "\\1" GINAC_MICRO_VERSION "${_ginac_vinfo}")
+set(GINAC_VERSION "${GINAC_MAJOR_VERSION}.${GINAC_MINOR_VERSION}.${GINAC_MICRO_VERSION}")
+
+# Library versioning info
+file(STRINGS ${CMAKE_SOURCE_DIR}/ginac/version.h _ginac_vinfo REGEX "^#define[\t ]+GINAC_LT_.*")
+string(REGEX REPLACE "^.*GINAC_LT_CURRENT[ \t]+([0-9]+).*" "\\1" ginac_lt_current "${_ginac_vinfo}")
+string(REGEX REPLACE "^.*GINAC_LT_AGE[ \t]+([0-9]+).*" "\\1" ginac_lt_age "${_ginac_vinfo}")
+string(REGEX REPLACE "^.*GINAC_LT_REVISION[ \t]+([0-9]+).*" "\\1" ginac_lt_revision "${_ginac_vinfo}")
+# XXX: it looks like we need to set this for every platform?
+math(EXPR ginaclib_soversion "${ginac_lt_current} - ${ginac_lt_age}")
+set(ginaclib_version ${ginaclib_soversion}.${ginac_lt_age}.${ginac_lt_revision})
+
+# make check
+enable_testing()
+add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
+# make info
+add_custom_target(info ALL)
+add_custom_target(html)
+add_custom_target(pdf)
+
+find_package(CLN 1.2.2 REQUIRED)
+include_directories(${CLN_INCLUDE_DIR})
+
+include(CheckIncludeFile)
+check_include_file("stdint.h" HAVE_STDINT_H)
+check_include_file("unistd.h" HAVE_UNISTD_H)
+
+include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/ginac)
+
+# This macro implements some very special logic how to deal with the cache.
+# By default the various install locations inherit their value from their
+#"parent" variable, so if you set CMAKE_INSTALL_PREFIX, then
+# EXEC_INSTALL_PREFIX, BIN_INSTALL_DIR, LIB_INSTALL_DIR, etc will calculate
+# their value by appending subdirs to CMAKE_INSTALL_PREFIX.
+# This would work just fine without using the cache.
+# But if somebody wants e.g. a different EXEC_INSTALL_PREFIX this value
+# has to go into the cache, otherwise it will be forgotten on the next cmake
+# run. Once a variable is in the cache, it doesn't depend on its "parent"
+# variables anymore and you can only change it by editing it directly.
+# This macro helps in this regard, because as long as you don't set one
+# of the variables explicitly to some location, the value will be computed
+# from parents of the variable in question. So modifying CMAKE_INSTALL_PREFIX
+# later on will have the desired effect.
+# But once you decide to set e.g. EXEC_INSTALL_PREFIX to some special
+# location this will go into the cache and it will no longer depend on
+# CMAKE_INSTALL_PREFIX.
+
+macro(_set_fancy _var _value _comment)
+       set(predefinedvalue "${_value}")
+       if ("${CMAKE_INSTALL_PREFIX}" STREQUAL "${GINAC_INSTALL_DIR}" AND DEFINED GINAC_${_var})
+               set(predefinedvalue "${GINAC_${_var}}")
+       endif()
+       if (NOT DEFINED ${_var})
+               set(${_var} ${predefinedvalue})
+       else()
+               set(${_var} "${${_var}}" CACHE PATH "${_comment}")
+       endif()
+endmacro(_set_fancy)
+
+_set_fancy(EXEC_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}"
+          "Base directory for libraries and executables")
+_set_fancy(LIB_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/lib"
+          "Libraries installation directory")
+_set_fancy(BIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/bin"
+          "Binaries installation directory")
+_set_fancy(SHARE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/share"
+          "Base directory for architecture independent files")
+_set_fancy(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include"
+          "Headers installation directory")
+
+if (NOT DEFINED BUILD_SHARED_LIBS)
+       if (NOT MSVC)
+               set(BUILD_SHARED_LIBS true)
+       else()
+               set(BUILD_SHARED_LIBS false)
+       endif()
+endif()
+
+# Set proper rpath so tools will Just Work(TM) after make install.
+# Also take care to add -Wl,-rpath, stanza into the *.pc file so that
+#
+# g++ `pkg-config --cflags --libs ginac`
+#
+# will Just Work (TM), too.
+# Distro packagers should use -DCMAKE_INSTALL_RPATH="" to avoid
+# setting rpath on installed binaries.
+
+# rpath for making binaries/libraries relocatable
+set(_ginac_rpath_reloc "$ORIGIN/../lib")
+set(_wl_rpath "${CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG}")
+
+# rpath for the pkg-config meta-data.
+set(_ginaclib_rpath "${_wl_rpath}${_ginac_rpath_reloc}")
+list(FIND CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "${LIB_INSTALL_DIR}" isSystemDir)
+if ("${isSystemDir}" STREQUAL "-1")
+       list(APPEND _ginaclib_rpath "${_wl_rpath}\${libdir}")
+endif()
+set(GINACLIB_RPATH)
+if (NOT CMAKE_SKIP_RPATH)
+       if (_wl_rpath)
+               set(GINACLIB_RPATH "${_ginaclib_rpath}")
+       endif()
+endif()
+
+configure_file(${CMAKE_SOURCE_DIR}/ginac.pc.cmake ${CMAKE_BINARY_DIR}/ginac.pc @ONLY)
+install(FILES ${CMAKE_BINARY_DIR}/ginac.pc DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
+
+# rpath for libginac.so itself, ginsh, and friends
+set(_ginac_rpath ${_ginac_rpath_reloc})
+foreach(_d ${CLN_LIBRARY_DIRS} ${LIB_INSTALL_DIR})
+       list(FIND CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "${_d}" isSystemDir)
+       if ("${isSystemDir}" STREQUAL "-1")
+               list(APPEND _ginac_rpath "${_d}")
+       endif()
+endforeach()
+list(REMOVE_DUPLICATES _ginac_rpath)
+string(REPLACE ";" ":" ginac_rpath "${_ginac_rpath}")
+
+if (NOT DEFINED CMAKE_INSTALL_RPATH_USE_LINK_RPATH)
+       set(CMAKE_INSTALL_RPATH_USE_LINK_RPATH TRUE)
+endif()
+if (NOT DEFINED CMAKE_INSTALL_RPATH)
+       set(CMAKE_INSTALL_RPATH ${ginac_rpath})
+endif()
+if (APPLE AND NOT DEFINED CMAKE_INSTALL_NAME_DIR)
+       set(CMAKE_INSTALL_NAME_DIR ${LIB_INSTALL_DIR})
+endif()
+
+list(FIND CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "${LIB_INSTALL_DIR}" isSystemDir)
+if ("${isSystemDir}" STREQUAL "-1")
+       string(REPLACE ":" ";" _install_rpath "${CMAKE_INSTALL_RPATH}")
+       list(FIND _install_rpath "${LIB_INSTALL_DIR}" _is_rpath_consistent)
+       if ("${_is_rpath_consistent}" STREQUAL "-1")
+               message(WARNING "the libginac.so library will be installed into "
+                               "a non-standard directory (${LIB_INSTALL_DIR}), "
+                               "however, the rpath (${_install_rpath}) "
+                               "does not contain that directory. Most likely "
+                               "things won't work without extra configuration "
+                               "(tweaking LD_LIBRARY_PATH, /etc/ld.so.conf, etc).")
+       endif()
+endif()
+
+
+include(FindFLEX)
+include(FindBISON)
+find_package(BISON)
+find_package(FLEX)
+find_package(Readline)
+if (READLINE_FOUND)
+       set(HAVE_LIBREADLINE 1)
+       set(HAVE_READLINE_READLINE_H 1)
+       set(HAVE_READLINE_HISTORY_H 1)
+endif()
+
+find_program(MAKEINFO makeinfo)
+find_program(FIG2DEV fig2dev)
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
+add_definitions(-DHAVE_CONFIG_H)
+
+add_subdirectory(ginac)
+add_subdirectory(tools)
+add_subdirectory(check)
+if (BISON_FOUND AND FLEX_FOUND)
+       add_subdirectory(ginsh)
+endif()
+if (MAKEINFO)
+       add_subdirectory(doc)
+endif()
+