cmakelists.txt 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. cmake_minimum_required(VERSION 3.8)
  2. project(gsl C)
  3. include(GNUInstallDirs)
  4. option(INSTALL_HEADERS "Install public header files" ON)
  5. # Function to extract parameter from makefile. Space separated values are returned as lists
  6. function(extract_from_makefile PATTERN RETURN FILEPATH)
  7. file(READ ${FILEPATH} MAKEFILE_CONTENT)
  8. string(REGEX MATCH "${PATTERN}" CONTENTS "${MAKEFILE_CONTENT}")
  9. set(CONTENTS ${CMAKE_MATCH_1})
  10. # Split string into list
  11. string(REGEX REPLACE "([\t ]+(\\\\\n)?)+" ";" CONTENTS "${CONTENTS}")
  12. string(REGEX REPLACE "[\t ]*\\\\\n[\t ]*;" "" CONTENTS "${CONTENTS}")
  13. if("${CONTENTS}" STREQUAL "")
  14. message(AUTHOR_WARNING "No match for \"${PATTERN}\" found in file ${FILEPATH}")
  15. endif()
  16. # Return
  17. set(${RETURN} ${CONTENTS} PARENT_SCOPE)
  18. endfunction(extract_from_makefile)
  19. # Function to extract C sources from makefile
  20. function(extract_sources SUBFOLDER ALLSOURCES)
  21. extract_from_makefile("lib[a-zA-Z1-9_]*_la_SOURCES[ \t]*=[ \t]*(((\\\\\n)?[^\n])*)" SOURCEFILES "${SUBFOLDER}/Makefile.am")
  22. # Add the folder in front of the file names
  23. string(REGEX REPLACE "([^;]+)" "${SUBFOLDER}/\\1" SOURCEFILES "${SOURCEFILES}")
  24. # Return
  25. set(${ALLSOURCES} ${${ALLSOURCES}} ${SOURCEFILES} PARENT_SCOPE)
  26. endfunction(extract_sources)
  27. set(SOURCES)
  28. set(CBLAS_SOURCES)
  29. extract_from_makefile("SUBDIRS = (((\\\\\n)?[^\n])*)" FOLDERS "./Makefile.am")
  30. extract_sources("." SOURCES)
  31. foreach(DIR IN LISTS FOLDERS)
  32. if("${DIR}" STREQUAL "cblas")
  33. extract_sources("${DIR}" CBLAS_SOURCES)
  34. else()
  35. extract_sources("${DIR}" SOURCES)
  36. endif()
  37. endforeach()
  38. file(READ gsl_types.h GSLTYPES_H)
  39. string(REPLACE "#ifdef WIN32" "#ifdef _WIN32" GSLTYPES_H "${GSLTYPES_H}")
  40. if(BUILD_SHARED_LIBS)
  41. string(REPLACE "# ifdef GSL_DLL" "# if 1 /*GSL_DLL*/" GSLTYPES_H "${GSLTYPES_H}")
  42. endif()
  43. file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gsl_types.h "${GSLTYPES_H}")
  44. file(GLOB_RECURSE PUBLIC_HEADERS gsl*.h)
  45. list(APPEND PUBLIC_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/gsl_types.h)
  46. # The debug libraries have a "d" postfix so that CMake's FindGSL.cmake
  47. # module can distinguish between Release and Debug libraries
  48. set(CMAKE_DEBUG_POSTFIX "d")
  49. add_library(gslcblas ${CBLAS_SOURCES})
  50. set_target_properties(gslcblas PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
  51. add_library(gsl ${SOURCES})
  52. set_target_properties(gsl PROPERTIES DEFINE_SYMBOL DLL_EXPORT WINDOWS_EXPORT_ALL_SYMBOLS ON)
  53. target_link_libraries(gsl PUBLIC gslcblas)
  54. if(INSTALL_HEADERS)
  55. set_target_properties(gsl PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}")
  56. endif()
  57. target_include_directories(gslcblas PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
  58. target_include_directories(gsl PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
  59. # For the build, we need to copy all headers to the gsl directory
  60. file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/gsl)
  61. file(COPY ${PUBLIC_HEADERS} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/gsl")
  62. set(TARGET_INSTALL_OPTIONS)
  63. if(INSTALL_HEADERS)
  64. set(TARGET_INSTALL_OPTIONS PUBLIC_HEADER DESTINATION include/gsl)
  65. endif()
  66. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/gsl.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/gsl.pc" @ONLY)
  67. install(FILES "${CMAKE_CURRENT_BINARY_DIR}/gsl.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
  68. install(TARGETS gsl gslcblas
  69. RUNTIME DESTINATION bin
  70. LIBRARY DESTINATION lib
  71. ARCHIVE DESTINATION lib
  72. ${TARGET_INSTALL_OPTIONS}
  73. )