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