Skip to content

Commit 1ec2283

Browse files
committed
basic modern CMakeLists files with targest
targets are exported into install and build tree test can be anabled if needed
1 parent efe37c4 commit 1ec2283

File tree

4 files changed

+132
-117
lines changed

4 files changed

+132
-117
lines changed

CMakeLists.txt

+63-109
Original file line numberDiff line numberDiff line change
@@ -1,128 +1,82 @@
1-
#################################################################
2-
# HEADER
3-
#################################################################
4-
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7)
5-
PROJECT(PENF Fortran)
6-
7-
SET(${PROJECT_NAME}_VERSION 0.0.1)
8-
SET(${PROJECT_NAME}_SOVERSION 1)
9-
SET(LIB ${PROJECT_NAME})
1+
# The target of the library PENF is exported
2+
# as PENF::PENF to a package config file for PENF
3+
#
4+
# usage find_package(PENF)
5+
# ...
6+
# target_link_library(<target> PENF)
7+
#
8+
# the config file is generatet in the build and install directories
109

11-
#SET(CMAKE_VERBOSE_MAKEFILE TRUE)
12-
13-
#################################################################
14-
# DEFINE PATHS
1510
#################################################################
16-
17-
SET(SRC_PATH ${CMAKE_SOURCE_DIR}/src)
18-
SET(LIB_PATH ${SRC_PATH}/lib)
19-
SET(TESTS_PATH ${SRC_PATH}/tests)
20-
21-
#SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake/Modules/")
22-
23-
24-
#################################################################
25-
# BUILD PATHS
11+
# HEADER
2612
#################################################################
27-
28-
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
29-
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
30-
SET(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/modules)
31-
SET(THIRDPARTY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/thirdparty)
32-
INCLUDE_DIRECTORIES(${CMAKE_Fortran_MODULE_DIRECTORY})
13+
cmake_minimum_required(VERSION 3.10...3.11)
14+
project(PENF VERSION 1.2.1 LANGUAGES Fortran)
3315

3416
#################################################################
3517
# CONFIGURATION TYPES & BUILD MODE & BUILD_TESTS
3618
#################################################################
3719

38-
SET(CMAKE_CONFIGURATION_TYPES DEBUG RELEASE)
39-
IF(NOT CMAKE_BUILD_TYPE)
40-
SET(CMAKE_BUILD_TYPE DEBUG CACHE STRING
41-
"Choose the type of build, options are: NONE DEBUG RELEASE"
42-
FORCE)
43-
44-
SET_PROPERTY(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS NONE DEBUG RELEASE)
45-
ENDIF(NOT CMAKE_BUILD_TYPE)
46-
47-
IF(NOT ${PROJECT_NAME}_ENABLE_TESTS)
48-
OPTION(${PROJECT_NAME}_ENABLE_TESTS "Enable/disable tests compilation" OFF)
49-
ENDIF(NOT ${PROJECT_NAME}_ENABLE_TESTS)
50-
5120
#################################################################
52-
# FFLAGS depend on the compiler and the build type
21+
# set export variables needed for building
5322
#################################################################
5423

55-
GET_FILENAME_COMPONENT(Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)
56-
57-
IF(CMAKE_BUILD_TYPE STREQUAL "DEBUG")
58-
# SET(MACROS "${MACROS} -DDEBUG -Dmemcheck")
59-
ADD_DEFINITIONS(-DDEBUG)
60-
ADD_DEFINITIONS(-Dmemcheck)
61-
ENDIF()
62-
63-
ADD_DEFINITIONS(-D${CMAKE_Fortran_COMPILER_ID})
64-
65-
message(STATUS "COMPILER INFO: ${CMAKE_Fortran_COMPILER_ID} - ${Fortran_COMPILER_NAME}")
66-
67-
IF (${CMAKE_Fortran_COMPILER_ID} STREQUAL "GNU" OR Fortran_COMPILER_NAME MATCHES "gfortran*")
68-
# gfortran
69-
set(FORTRAN_FLAGS "-fdefault-real-8 -ffree-line-length-0 -cpp -Wimplicit-interface ${EXTRA_FLAGS} ")
70-
set (CMAKE_Fortran_FLAGS "${FORTRAN_FLAGS} ${MACROS} ${INCLUDES} " CACHE STRING "" FORCE)
71-
set (CMAKE_Fortran_FLAGS_RELEASE "-O3 ${EXTRA_FLAGS} " CACHE STRING "" FORCE)
72-
set (CMAKE_Fortran_FLAGS_DEBUG "-g -fbacktrace -fbounds-check -fprofile-arcs -ftest-coverage -Wimplicit-interface ${EXTRA_FLAGS} " CACHE STRING "" FORCE)
73-
ELSEIF (${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel" OR Fortran_COMPILER_NAME MATCHES "ifort*")
74-
# ifort (untested)
75-
set(FORTRAN_FLAGS "-r8 -fpp -W1 ${EXTRA_FLAGS} ")
76-
set (CMAKE_Fortran_FLAGS "${FORTRAN_FLAGS} ${MACROS} ${INCLUDES}" CACHE STRING "" FORCE)
77-
set (CMAKE_Fortran_FLAGS_RELEASE "-O3 ${EXTRA_FLAGS} " CACHE STRING "" FORCE)
78-
set (CMAKE_Fortran_FLAGS_DEBUG "-O0 -traceback -g -debug all -check all -ftrapuv -warn nointerfaces ${EXTRA_FLAGS} " CACHE STRING "" FORCE)
79-
# A partir de CMake 3.1
80-
# -prof-gen:srcpos -prof-dir${PROJECT_BINARY_DIR}
81-
82-
ELSEIF (${CMAKE_Fortran_COMPILER_ID} STREQUAL "XL" OR Fortran_COMPILER_NAME MATCHES "xlf*")
83-
# xlf (untested)
84-
set(FORTRAN_FLAGS "-q64 -qrealsize=8 -qsuffix=f=f90:cpp=f90 ${EXTRA_FLAGS} ")
85-
set (CMAKE_Fortran_FLAGS "${FORTRAN_FLAGS} ${MACROS} ${INCLUDES}" CACHE STRING "" FORCE)
86-
set (CMAKE_Fortran_FLAGS_RELEASE "-O3 -qstrict ${EXTRA_FLAGS} " CACHE STRING "" FORCE)
87-
set (CMAKE_Fortran_FLAGS_DEBUG "-O0 -g -qfullpath -qkeepparm ${EXTRA_FLAGS} " CACHE STRING "" FORCE)
88-
ELSE ()
89-
message ("No optimized Fortran compiler flags are known, we just try -O2...")
90-
set (CMAKE_Fortran_FLAGS_RELEASE "-O2")
91-
set (CMAKE_Fortran_FLAGS_DEBUG "-O0 -g")
92-
ENDIF ()
93-
94-
SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--allow-multiple-definition")
95-
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--allow-multiple-definition")
96-
97-
message (STATUS "CMAKE_Fortran_COMPILER full path: " ${CMAKE_Fortran_COMPILER})
98-
message (STATUS "CMAKE_Fortran_FLAGS: " ${CMAKE_Fortran_FLAGS})
99-
message (STATUS "CMAKE_Fortran_FLAGS_RELEASE: " ${CMAKE_Fortran_FLAGS_RELEASE})
100-
message (STATUS "CMAKE_Fortran_FLAGS_DEBUG: " ${CMAKE_Fortran_FLAGS_DEBUG})
24+
set(TARGETS_EXPORT_NAME "${PROJECT_NAME}-targets")
25+
set(NAMESPACE "${PROJECT_NAME}::")
10126

10227
#################################################################
103-
# ENABLE TESTING
28+
# generate the library and install instructions
10429
#################################################################
10530

106-
SET(BUILDNAME ${CMAKE_Fortran_COMPILER_ID}_${CMAKE_BUILD_TYPE}_MKL=${${PROJECT_NAME}_ENABLE_MKL} CACHE STRING "" )
107-
IF(${PROJECT_NAME}_ENABLE_TESTS)
108-
ENABLE_TESTING()
109-
INCLUDE(CTest)
110-
ENDIF()
31+
add_subdirectory(src/lib)
11132

11233
#################################################################
113-
# STATIC LIBRARIES
114-
#################################################################
115-
# Try to search first static libraries
116-
IF(NOT ${BUILD_SHARED_LIBS})
117-
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a ${CMAKE_FIND_LIBRARY_SUFFIXES}")
118-
ENDIF()
119-
120-
#################################################################
121-
# ADD SOURCE SUBDIRS
34+
# ENABLE TESTING
12235
#################################################################
12336

124-
ADD_SUBDIRECTORY(${LIB_PATH})
125-
IF(${PROJECT_NAME}_ENABLE_TESTS)
126-
ADD_SUBDIRECTORY(${TESTS_PATH})
127-
ENDIF()
128-
37+
option(BUILD_TESTING "Build the testing tree." OFF)
38+
if(BUILD_TESTING)
39+
include(CTest)
40+
add_subdirectory(src/tests)
41+
endif()
42+
43+
#################################################################
44+
# generate package config files
45+
#################################################################
46+
47+
include(GNUInstallDirs)
48+
set(project_config "${PROJECT_NAME}-config.cmake")
49+
set(cmake_files_dir "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles")
50+
set(config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
51+
set(config_build_dir "${CMAKE_CURRENT_BINARY_DIR}/${config_install_dir}")
52+
53+
# export targets for install
54+
install(EXPORT ${TARGETS_EXPORT_NAME}
55+
NAMESPACE
56+
${NAMESPACE}
57+
DESTINATION
58+
${config_install_dir}
59+
COMPONENT Development
60+
)
61+
62+
# export targets into build
63+
export(EXPORT ${TARGETS_EXPORT_NAME}
64+
NAMESPACE
65+
${NAMESPACE}
66+
FILE
67+
${config_build_dir}/${TARGETS_EXPORT_NAME}.cmake
68+
)
69+
70+
#create package config
71+
include(CMakePackageConfigHelpers)
72+
configure_package_config_file(cmake/${project_config}.in ${cmake_files_dir}/${project_config}
73+
INSTALL_DESTINATION ${config_install_dir}
74+
)
75+
install(FILES ${cmake_files_dir}/${project_config}
76+
DESTINATION ${config_install_dir}
77+
)
78+
79+
configure_package_config_file(cmake/${project_config}.in ${config_build_dir}/${project_config}
80+
INSTALL_DESTINATION ${config_build_dir}
81+
INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}
82+
)

cmake/PENF-config.cmake.in

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
@PACKAGE_INIT@
2+
3+
include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake")
4+
check_required_components("@PROJECT_NAME@")

src/lib/CMakeLists.txt

+38-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,43 @@
11
#################################################################
2-
# Search F90 files recursively in all subdirs
2+
# set type specific output defaults
33
#################################################################
4+
include(GNUInstallDirs)
45

5-
FILE(GLOB_RECURSE LIB_SRC *.f90 *.F90 *.c)
6-
SET(LIB_SRC ${LIB_SRC} PARENT_SCOPE)
6+
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
7+
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
8+
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}")
9+
SET(CMAKE_Fortran_MODULE_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}")
710

8-
#################################################################
9-
# Library target
10-
#################################################################
11-
ADD_LIBRARY(${LIB} ${LIB_SRC})
11+
set(LIB PENF)
12+
add_library(${LIB}
13+
penf.F90
14+
penf_b_size.F90
15+
penf_global_parameters_variables.F90
16+
penf_stringify.F90
17+
)
18+
add_library(${NAMESPACE}::${LIB} ALIAS ${LIB})
19+
20+
target_include_directories(${LIB}
21+
INTERFACE
22+
$<BUILD_INTERFACE:${CMAKE_Fortran_MODULE_DIRECTORY}>
23+
)
24+
25+
set_target_properties(${LIB} PROPERTIES
26+
VERSION
27+
${PROJECT_VERSION}
28+
SOVERSION
29+
${PROJECT_VERSION_MAJOR}
30+
)
31+
32+
# installation and export of targets
33+
install(DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/
34+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
35+
COMPONENT Developement
36+
)
1237

13-
SET_TARGET_PROPERTIES(${LIB} PROPERTIES VERSION ${${PROJECT_NAME}_VERSION} SOVERSION ${${PROJECT_NAME}_SOVERSION})
38+
install(TARGETS ${LIB} EXPORT ${TARGETS_EXPORT_NAME}
39+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development
40+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT RuntimeLibraries
41+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT RuntimeLibraries
42+
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
43+
)

src/tests/CMakeLists.txt

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
include(GNUInstallDirs)
2+
3+
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/tests/${CMAKE_INSTALL_BINDIR}")
4+
5+
function(add_penf_doctest test_src libraries)
6+
get_filename_component(test_name ${test_src} NAME_WE)
7+
get_filename_component(test_dir ${test_src} DIRECTORY)
8+
set(result_src "${test_dir}/${test_name}.result")
9+
10+
add_executable(${test_name} ${test_src})
11+
foreach(lib IN LISTS libraries)
12+
target_link_libraries(${test_name} ${lib})
13+
endforeach()
14+
add_test(NAME ${test_name} COMMAND ${test_name})
15+
16+
file(STRINGS ${result_src} result_raw)
17+
string(REGEX REPLACE "([+.])([^+.]*)" "\\\\\\1\\2" result ${result_raw})
18+
19+
set_tests_properties(${test_name} PROPERTIES
20+
PASS_REGULAR_EXPRESSION "${result}")
21+
endfunction()
22+
23+
file(GLOB_RECURSE penf_doctests *.f90)
24+
25+
foreach(penf_doctest IN LISTS penf_doctests)
26+
add_penf_doctest(${penf_doctest} PENF)
27+
endforeach()

0 commit comments

Comments
 (0)