-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathCMakeLists.txt
149 lines (118 loc) · 6.12 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
## CMakeFile for libSUFR
## AF, 2010-12-07
##
## Copyright 2010-2013 Marc van der Sluys - marc.vandersluys.nl
##
## This file is part of the libSUFR package,
## see: http://libsufr.sf.net/
##
## This is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published
## by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
##
## This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License along with this code. If not, see
## <http://www.gnu.org/licenses/>.
##
##
## To compile, from the directory that contains this file, do:
## $ mkdir build; cd build
## $ cmake ..
## $ make install
cmake_minimum_required( VERSION 3.0 FATAL_ERROR )
# Set build type. Do this *before* we set the project name:
if( NOT CMAKE_BUILD_TYPE )
set( CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
"Choose the type of build, options are: None Debug Release RelWithDebInfo Profile."
FORCE )
endif( NOT CMAKE_BUILD_TYPE )
set( CMAKE_CONFIGURATION_TYPES "${CMAKE_BUILD_TYPE}" CACHE INTERNAL "internal" )
# Project name and language:
project( libSUFR Fortran )
# Increase verbosity for debugging:
option( CMAKE_VERBOSE_MAKEFILE "Verbose makefile" on )
# Search in the CMake/ directory for CMake modules:
list( APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake )
# Various compile/optimisation options that we may want to enable:
include( SetCompileOptions )
# Place the products in their directories:
get_filename_component( Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME )
if( COMPILER_SPECIFIC_LIBS )
set( MODULE_DIRECTORY "${CMAKE_SOURCE_DIR}/usr/include/libSUFR/${Fortran_COMPILER_NAME}" )
else( COMPILER_SPECIFIC_LIBS )
set( MODULE_DIRECTORY "${CMAKE_SOURCE_DIR}/usr/include/libSUFR" )
endif( COMPILER_SPECIFIC_LIBS )
set( LIBRARY_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/usr/lib${LIB_SUFFIX}" )
# Set source files:
include( FileList )
# Set FORTRAN compiler flags:
include( CompilerFlags_Fortran )
# Create the file libSUFR_version.f90, which contains the code version number/hash and date (and which will be removed at make clean):
if( NOT EXISTS ${CMAKE_SOURCE_DIR}/src/libSUFR_version.f90 OR CREATE_VERSION )
add_custom_command(
OUTPUT ${CMAKE_SOURCE_DIR}/src/libSUFR_version.f90
COMMAND cd $(CMAKE_SOURCE_DIR)
COMMAND . ${CMAKE_SOURCE_DIR}/code_version.sh ${CMAKE_SOURCE_DIR} src/libSUFR_version.f90 ${Fortran_COMPILER_NAME} ${OPT_FLAGS}
)
# Tell CMake the source won't be available until build time:
set_source_files_properties( ${CMAKE_SOURCE_DIR}/src/libSUFR_version.f90 PROPERTIES GENERATED 1 )
endif( NOT EXISTS ${CMAKE_SOURCE_DIR}/src/libSUFR_version.f90 OR CREATE_VERSION )
# Create libraries:
if( CREATE_SHAREDLIB )
add_library( "libSUFR_shared" SHARED ${SRC_FILES} )
if( COMPILER_SPECIFIC_LIBS )
set_target_properties( libSUFR_shared PROPERTIES OUTPUT_NAME "SUFR_${Fortran_COMPILER_NAME}" ) # Sets the file name and soname to libSUFR_<FC>.so
else( COMPILER_SPECIFIC_LIBS )
set_target_properties( libSUFR_shared PROPERTIES OUTPUT_NAME "SUFR" ) # Sets the file name and soname to libSUFR.so
endif( COMPILER_SPECIFIC_LIBS )
set_target_properties( libSUFR_shared PROPERTIES Fortran_MODULE_DIRECTORY ${MODULE_DIRECTORY} )
endif( CREATE_SHAREDLIB )
# Use add_dependencies below in order to pretend the static lib depends on the shared. This
# seems to be necessary to ensure that it is built *after* shared. If this doesn't
# happen, multiple threads will be pouring data into the libSUFR_version file simultaneously.
if( CREATE_STATICLIB )
add_library( "libSUFR_static" STATIC ${SRC_FILES} )
if( COMPILER_SPECIFIC_LIBS )
set_target_properties( libSUFR_static PROPERTIES OUTPUT_NAME "SUFR_${Fortran_COMPILER_NAME}" )
else( COMPILER_SPECIFIC_LIBS )
set_target_properties( libSUFR_static PROPERTIES OUTPUT_NAME "SUFR" )
endif( COMPILER_SPECIFIC_LIBS )
set_target_properties( libSUFR_static PROPERTIES Fortran_MODULE_DIRECTORY ${MODULE_DIRECTORY} )
add_dependencies( libSUFR_static libSUFR_shared ) # Ensure it is built after the shared lib
endif( CREATE_STATICLIB )
# Find the package version from the VERSION file and stick it into PKG_VERSION:
# The file VERSION is either in the root directory of the package, or in doc/:
set( VERSION_FILE ${CMAKE_SOURCE_DIR}/VERSION )
if( NOT EXISTS ${VERSION_FILE} )
set( VERSION_FILE ${CMAKE_SOURCE_DIR}/doc/VERSION )
endif( NOT EXISTS ${VERSION_FILE} )
set( PKG_VERSION "Unknown" ) # Indicates that the version number was not found
file(STRINGS ${VERSION_FILE} Lines )
foreach( Line ${Lines} )
string(REGEX MATCH "Release version:.+" Line ${Line} ) # Returns the matching string
string(COMPARE NOTEQUAL "${Line}" "" Matches ) # If the string is not empty, we have a match
if( Matches )
string(REPLACE "Release version:" "" Line ${Line}) # Remove text
string(STRIP ${Line} Line) # Strip leading and trailing spaces
set( PKG_VERSION ${Line} )
endif( Matches )
endforeach()
message( STATUS "libSUFR version reported by the package: ${PKG_VERSION}" )
message( STATUS "Compiling for an ${CMAKE_SYSTEM_PROCESSOR} architecture" )
message( STATUS "" )
# Install to destination:
# use DIRECTORY rather than TARGETS to allow include/<fortrancompiler>/
install( DIRECTORY usr/ DESTINATION ${CMAKE_INSTALL_PREFIX} )
# Install man pages:
install( DIRECTORY man/ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man )
# Install documents:
if( NOT EXISTS VERSION )
install( FILES doc/CHANGELOG doc/LICENCE doc/README doc/VERSION DESTINATION ${CMAKE_INSTALL_PREFIX}/share/doc/libsufr-${PKG_VERSION} )
else( NOT EXISTS VERSION )
install( FILES CHANGELOG LICENCE README VERSION DESTINATION ${CMAKE_INSTALL_PREFIX}/share/doc/libsufr-${PKG_VERSION} )
endif( NOT EXISTS VERSION )
# Create Linux-distribution binary package:
if( WANT_PACKAGE )
include( CPack_package )
endif( WANT_PACKAGE )