Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cmake -- Possibility to configure, compile, install and package HOS-NWT with cmake #1

Merged
merged 2 commits into from
Jan 22, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cmake/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
build*
install*
103 changes: 103 additions & 0 deletions cmake/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.8)
PROJECT(HOS-NWT)

SET(CMAKE_VERBOSE_MAKEFILE OFF)
SET(BUILD_SHARED_LIBS ON)

# Define manually these variables to access fftw and lapack libraries
# FFTW_ROOT
# LAPACK_ROOT

################################################################################
SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
SET(SRC_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../sources)
SET(BENCHMARK_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../Benchmark)

IF(NOT DEFINED CMAKE_COLOR_MAKEFILE)
SET(CMAKE_COLOR_MAKEFILE OFF)
ENDIF()

IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
SET(ARCH64_BITS TRUE)
ELSE()
SET(ARCH64_BITS FALSE)
ENDIF()

IF(NOT DEFINED CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE Debug)
ENDIF()

MESSAGE(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
STRING(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_UPPER)
IF(CMAKE_BUILD_TYPE_UPPER MATCHES DEBUG)
SET(BUILD_SHARED_LIBS OFF)
ENDIF()

IF(DEFINED INSTALL_PREFIX)
SET(CMAKE_INSTALL_PREFIX ${INSTALL_PREFIX})
ELSE()
SET(CMAKE_INSTALL_PREFIX ../install${CMAKE_BUILD_TYPE})
ENDIF()

################################################################################
SET(FFTW_USE_STATIC_LIBS TRUE)
FIND_PACKAGE(FFTW REQUIRED)
MESSAGE(STATUS "FFTW_INCLUDES : ${FFTW_INCLUDES}")
MESSAGE(STATUS "FFTW_LIBRARIES : ${FFTW_LIBRARIES}")
MESSAGE(STATUS "FFTW_LIB : ${FFTW_LIB}")
MESSAGE(STATUS "FFTWF_LIB : ${FFTWF_LIB}")
MESSAGE(STATUS "FFTWL_LIB : ${FFTWL_LIB}")

IF(DEFINED LAPACK_ROOT)
FIND_PACKAGE(LAPACK REQUIRED
HINTS ${LAPACK_ROOT})
ELSE()
FIND_PACKAGE(LAPACK REQUIRED)
ENDIF()
################################################################################

MESSAGE(STATUS "CMAKE_GENERATOR = ${CMAKE_GENERATOR}")
MESSAGE(STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")

INCLUDE(CMakeOutputDirectories)

ENABLE_LANGUAGE(Fortran)
INCLUDE(CMakeCompilationOptionsFortran)

################################################################################
INCLUDE(CMakeSources.cmake)
################################################################################

MESSAGE(STATUS "CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}")
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})

ADD_EXECUTABLE(HOS_NWT ${src})
TARGET_LINK_LIBRARIES(HOS_NWT lapack blas ${FFTW_LIB})

INSTALL(TARGETS HOS_NWT
RUNTIME DESTINATION ${RUNTIME_OUTPUT_DIRECTORY}
LIBRARY DESTINATION ${LIBRARY_OUTPUT_DIRECTORY})
SET(ADDITIONAL_LIB)
LIST(APPEND ADDITIONAL_LIB blas lapack)
FOREACH(f ${ADDITIONAL_LIB})
IF(EXISTS ${f})
INSTALL(FILES ${f} DESTINATION ${LIBRARY_OUTPUT_DIRECTORY})
ENDIF()
ENDFOREACH()

ENABLE_TESTING()
MACRO(ADD_A_NEW_BENCHMARK test_name)
EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E make_directory ${BENCHMARK_DIRECTORY}/${test_name}/Results)
# SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES TRUE)
ADD_TEST(NAME ${test_name}
COMMAND HOS_NWT input_HOS-NWT.dat
WORKING_DIRECTORY ${BENCHMARK_DIRECTORY}/${test_name})
ENDMACRO()

ADD_A_NEW_BENCHMARK(Irreg_2D)
ADD_A_NEW_BENCHMARK(Irreg_3D)
ADD_A_NEW_BENCHMARK(Regular)
ADD_A_NEW_BENCHMARK(Regular_3D)
ADD_A_NEW_BENCHMARK(Sloshing)

INCLUDE(CMakePack)
24 changes: 24 additions & 0 deletions cmake/CMakeSources.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
SET(src
${SRC_DIRECTORY}/main/HOS-NWT.f90
${SRC_DIRECTORY}/main/wavemaking.f90
${SRC_DIRECTORY}/main/filtering.f90
${SRC_DIRECTORY}/main/dealiasing.f90
${SRC_DIRECTORY}/main/resol_HOS.f90
${SRC_DIRECTORY}/main/resol_wmkr.f90
${SRC_DIRECTORY}/main/initial_condition.f90
${SRC_DIRECTORY}/variabledef/variables.f90
${SRC_DIRECTORY}/variabledef/common_vars.f90
${SRC_DIRECTORY}/variabledef/type.f90
${SRC_DIRECTORY}/wave/definition2.f90
${SRC_DIRECTORY}/wave/config_def.f90
${SRC_DIRECTORY}/wave/read_ocean_txt.f90
${SRC_DIRECTORY}/wave/wave_def.f90
${SRC_DIRECTORY}/wave/linear_wave.f90
${SRC_DIRECTORY}/fourier/fourier_FFTW.f90
${SRC_DIRECTORY}/timeintegration/runge_kutta.f90
${SRC_DIRECTORY}/timeintegration/variablechange.f90
${SRC_DIRECTORY}/IO/input.f90
${SRC_DIRECTORY}/IO/vol_energy.f90
${SRC_DIRECTORY}/IO/velocities.f90
${SRC_DIRECTORY}/IO/output.f90
)
44 changes: 44 additions & 0 deletions cmake/cmake/CMakeCompilationOptionsFortran.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
GET_FILENAME_COMPONENT(Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME_WE)
IF(Fortran_COMPILER_NAME MATCHES "gfortran.*")
# http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
# http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html
# -std=f2003
# -fcheck=all
# SET(CMAKE_Fortran_FLAGS "-cpp -Wextra -Wunused -Wall -fmessage-length=0 -ffixed-line-length-none -ffree-line-length-none -fno-automatic -fdefault-real-8 -fdefault-double-8 -fno-f2c)
SET(CMAKE_Fortran_FLAGS "-cpp -Wextra -Wunused -Wall -fmessage-length=0 -ffixed-line-length-none -ffree-line-length-none -fno-automatic -fdefault-real-8 -fdefault-double-8")
SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fno-f2c -pedantic -pedantic-errors -w -Wno-globals -Wunused -Wuninitialized -Wall -Wsurprising -Werror -W")
# SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -finit-real=nan -finit-logical=false")
SET(CMAKE_Fortran_FLAGS_RELEASE "-funroll-loops -O3")
#-O3 -march=corei7 -msse2 -funroll-loops -fno-protect-parens -ffast-math
SET(CMAKE_Fortran_FLAGS_DEBUG "-O0 -g3")
#-O0 -Wline-truncation -fbounds-check -fpack-derived -fbacktrace -ffpe-summary=all -fimplicit-none -fcheck=all -Wall -Wtabs -Wextra -Wunderflow -Wno-zerotrip -finit-integer=inf -finit-real=nan -ffpe-trap=zero,overflow
SET(CMAKE_Fortran_FLAGS_PROFILE "-g -pg")
IF(CMAKE_BUILD_TYPE_UPPER MATCHES COVERAGE)
SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g --coverage")
ELSEIF(CMAKE_BUILD_TYPE_UPPER MATCHES PROFILE)
SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -pg")
ENDIF()
ELSEIF(Fortran_COMPILER_NAME STREQUAL "ifort")
EXECUTE_PROCESS(COMMAND ifort --version
OUTPUT_VARIABLE INTEL_COMPILER_VERSION)
STRING(REGEX MATCH "([0-9]+)"
NUM_VERSION ${INTEL_COMPILER_VERSION})
IF("${NUM_VERSION}" STREQUAL "13")
ADD_DEFINITIONS(-DINTEL_13)
ENDIF()
ADD_DEFINITIONS(-DIntel)
ADD_DEFINITIONS(-DINTEL)
SET(CMAKE_Fortran_FLAGS_RELEASE "-f77rtl -O3")
SET(CMAKE_Fortran_FLAGS_DEBUG "-f77rtl -O0 -g")
ELSEIF(Fortran_COMPILER_NAME STREQUAL "g77")
SET(CMAKE_Fortran_FLAGS_RELEASE "-funroll-all-loops -fno-f2c -O3")
SET(CMAKE_Fortran_FLAGS_DEBUG "-fno-f2c -O0 -g")
ELSE()
MESSAGE(STATUS "CMAKE_Fortran_COMPILER full path: " ${CMAKE_Fortran_COMPILER})
MESSAGE(STATUS "Fortran compiler: " ${Fortran_COMPILER_NAME})
MESSAGE(STATUS "No optimized Fortran compiler flags are known, we just try -O2...")
SET(CMAKE_Fortran_FLAGS_RELEASE "-O2 ")
SET(CMAKE_Fortran_FLAGS_DEBUG "-O0 -g")
ENDIF()

MESSAGE(STATUS "CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE_UPPER} ${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE_UPPER}}")
8 changes: 8 additions & 0 deletions cmake/cmake/CMakeOutputDirectories.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
FOREACH(f RUNTIME_OUTPUT_DIRECTORY
LIBRARY_OUTPUT_DIRECTORY
ARCHIVE_OUTPUT_DIRECTORY)
IF(NOT DEFINED ${f})
SET(${f} "bin")
ENDIF()
MESSAGE(STATUS "${f} : ${${f}}")
ENDFOREACH()
59 changes: 59 additions & 0 deletions cmake/cmake/CMakePack.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Install the dependencies of the program
IF(MSYS)
GET_FILENAME_COMPONENT(MINGW_BIN_PATH ${CMAKE_CXX_COMPILER} PATH)
MESSAGE(STATUS "MINGW_BIN_PATH = ${MINGW_BIN_PATH}")
LIST(APPEND MINGW_ADDITIONAL_LIB "${MINGW_BIN_PATH}/libgcc_s_dw2-1.dll")
LIST(APPEND MINGW_ADDITIONAL_LIB "${MINGW_BIN_PATH}/libstdc++-6.dll")
LIST(APPEND MINGW_ADDITIONAL_LIB "${MINGW_BIN_PATH}/libgfortran-3.dll")
LIST(APPEND MINGW_ADDITIONAL_LIB "${MINGW_BIN_PATH}/libquadmath-0.dll")
LIST(APPEND MINGW_ADDITIONAL_LIB "${MINGW_BIN_PATH}/libgcc_s_seh-1.dll")
LIST(APPEND MINGW_ADDITIONAL_LIB "${MINGW_BIN_PATH}/libwinpthread-1.dll")
FOREACH(f ${MINGW_ADDITIONAL_LIB})
IF(EXISTS ${f})
INSTALL(FILES ${f} DESTINATION ${LIBRARY_OUTPUT_DIRECTORY})
ENDIF()
ENDFOREACH()
ENDIF()

################################################################################
# Instructions to build an installer
IF(UNIX OR MSYS)
INCLUDE(InstallRequiredSystemLibraries)
SET(CPACK_PACKAGE_NAME "${PROJECT_NAME}_installer")
SET(CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION OFF)
SET(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)
SET(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY OFF)
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "${PROJECT_NAME}")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_NAME}")
SET(CPACK_PACKAGE_VENDOR "")
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/../LICENSE.txt")
SET(CPACK_PACKAGE_VERSION_MAJOR "1")
SET(CPACK_PACKAGE_VERSION_MINOR "0")
SET(CPACK_PACKAGE_VERSION_PATCH "0")
#SET(CPACK_STRIP_FILES ON)
IF(WIN32)
# There is a bug in NSIS that does not handle full unix paths properly. Make
# sure there is at least one set of four (4) backlasshes.
#SET(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/Utilities/Release\\\\InstallIcon.bmp")
SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}")
SET(CPACK_NSIS_INSTALLED_ICON_NAME "${PROJECT_NAME}_installer")
SET(CPACK_NSIS_DISPLAY_NAME "${PROJECT_NAME}")
SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.ec-nantes.fr")
SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.ec-nantes.fr")
SET(CPACK_NSIS_CONTACT "guillaume.ducrozet@ec-nantes.fr")
SET(CPACK_NSIS_MODIFY_PATH OFF)
MESSAGE(STATUS "CPACK_NSIS_INSTALL_ROOT : ${CPACK_NSIS_INSTALL_ROOT}")
MESSAGE(STATUS "CPACK_PACKAGE_INSTALL_DIRECTORY :${CPACK_PACKAGE_INSTALL_DIRECTORY}")
ELSE(WIN32)
SET(CPACK_STRIP_FILES "./${PROJECT_NAME}_installer")
SET(CPACK_SOURCE_STRIP_FILES "")
SET(CPACK_PACKAGE_EXECUTABLES "${PROJECT_NAME}" "${PROJECT_NAME}")
IF(NOT CPACK_GENERATOR)
SET(CPACK_GENERATOR "DEB")
ENDIF()
##CPACK_PACKAGING_INSTALL_PREFIX : Sets the default root that the generated package installs into, '/usr' is the default for the debian and redhat generators
SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}")
SET(CPACK_PACKAGING_INSTALL_PREFIX "$HOME/${PROJECT_NAME}")
ENDIF()
INCLUDE(CPack)
ENDIF()
118 changes: 118 additions & 0 deletions cmake/cmake/FindFFTW.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
# - Find the FFTW library
#
# Usage:
# find_package(FFTW [REQUIRED] [QUIET] )
#
# It sets the following variables:
# FFTW_FOUND ... true if fftw is found on the system
# FFTW_LIBRARIES ... full path to fftw library
# FFTW_INCLUDES ... fftw include directory
#
# The following variables will be checked by the function
# FFTW_USE_STATIC_LIBS ... if true, only static libraries are found
# FFTW_ROOT ... if set, the libraries are exclusively searched
# under this path
# FFTW_LIBRARY ... fftw library to use
# FFTW_INCLUDE_DIR ... fftw include directory
#

#If environment variable FFTWDIR is specified, it has same effect as FFTW_ROOT
if( NOT FFTW_ROOT AND ENV{FFTWDIR} )
set( FFTW_ROOT $ENV{FFTWDIR} )
endif()

## Check if we can use PkgConfig
#find_package(PkgConfig)
#
##Determine from PKG
#if( PKG_CONFIG_FOUND AND NOT FFTW_ROOT )
# pkg_check_modules( PKG_FFTW QUIET "fftw3" )
#endif()

#Check whether to search static or dynamic libs
set( CMAKE_FIND_LIBRARY_SUFFIXES_SAV ${CMAKE_FIND_LIBRARY_SUFFIXES} )

if( ${FFTW_USE_STATIC_LIBS} )
set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX} )
else()
set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX} )
endif()

if( FFTW_ROOT )

#find libs
find_library(
FFTW_LIB
NAMES "fftw3"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)

find_library(
FFTWF_LIB
NAMES "fftw3f"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)

find_library(
FFTWL_LIB
NAMES "fftw3l"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)

#find includes
find_path(
FFTW_INCLUDES
NAMES "fftw3.h"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "include"
NO_DEFAULT_PATH
)

else()

find_library(
FFTW_LIB
NAMES "fftw3"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)

find_library(
FFTWF_LIB
NAMES "fftw3f"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)


find_library(
FFTWL_LIB
NAMES "fftw3l"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)

find_path(
FFTW_INCLUDES
NAMES "fftw3.h"
PATHS ${PKG_FFTW_INCLUDE_DIRS} ${INCLUDE_INSTALL_DIR}
)

endif( FFTW_ROOT )

set(FFTW_LIBRARIES ${FFTW_LIB} ${FFTWF_LIB})

if(FFTWL_LIB)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTWL_LIB})
endif()

set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_SAV} )

#include(FindPackageHandleStandardArgs)
#find_package_handle_standard_args(FFTW DEFAULT_MSG
# FFTW_INCLUDES FFTW_LIBRARIES)

mark_as_advanced(FFTW_INCLUDES FFTW_LIBRARIES FFTW_LIB FFTWF_LIB FFTWL_LIB)
Loading