Newer
Older
cmake_minimum_required( VERSION 2.8.10 )
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include( OptimizeForArchitecture )
if( CMAKE_BUILD_TYPE STREQUAL "Debug")
set( PROJECT_BUILD_PATH ${PROJECT_SOURCE_DIR}/Debug/src )
set( PROJECT_TESTS_PATH ${PROJECT_SOURCE_DIR}/Debug/tests )
set( PROJECT_TOOLS_PATH ${PROJECT_SOURCE_DIR}/Debug/tools )
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Debug/lib )
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Debug/bin )
set( debugExt -dbg )
set( CXX_FLAGS "${CXXFLAGS} -g ")
#AddCompilerFlag( "-g" )
else()
set( PROJECT_BUILD_PATH ${PROJECT_SOURCE_DIR}/Release/src )
set( PROJECT_TESTS_PATH ${PROJECT_SOURCE_DIR}/Release/tests )
set( PROJECT_TOOLS_PATH ${PROJECT_SOURCE_DIR}/Release/tools )
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Release/lib)
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Release/bin)
#OptimizeForArchitecture()
AddCompilerFlag( "-O3 -march=native -DNDEBUG" )
#####
# Check for CUDA
#
find_package( CUDA )
if( CUDA_FOUND )
set( BUILD_CUDA TRUE)
set(CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE OFF)
set(BUILD_SHARED_LIBS ON)
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} ; -DHAVE_CUDA )
AddCompilerFlag( "-DHAVE_NOT_CXX11" ) # -U_GLIBCXX_ATOMIC_BUILTINS -U_GLIBCXX_USE_INT128 " )
set( ALL_CUDA_ARCHS -gencode arch=compute_20,code=sm_20
-gencode arch=compute_30,code=sm_30
-gencode arch=compute_32,code=sm_32
-gencode arch=compute_35,code=sm_35
-gencode arch=compute_37,code=sm_37
-gencode arch=compute_50,code=sm_50
-gencode arch=compute_52,code=sm_52 )
if( WITH_CUDA_ARCH STREQUAL "all" )
set( CUDA_ARCH ${ALL_CUDA_ARCHS} )
else()
if( WITH_CUDA_ARCH STREQUAL "auto")
####
# Select GPU architecture
#
set( CUDA_ARCH_EXECUTABLE ${EXECUTABLE_OUTPUT_PATH}/tnl-cuda-arch)
set( CUDA_ARCH_SOURCE ${PROJECT_SOURCE_DIR}/tools/src/tnl-cuda-arch.cu)
message( "Compiling tnl-cuda-arch ..." )
file( MAKE_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} )
execute_process( COMMAND nvcc ${CUDA_ARCH_SOURCE} -o ${CUDA_ARCH_EXECUTABLE}
RESULT_VARIABLE CUDA_ARCH_RESULT
OUTPUT_VARIABLE CUDA_ARCH_OUTPUT
ERROR_VARIABLE CUDA_ARCH_OUTPUT )
execute_process( COMMAND ${CUDA_ARCH_EXECUTABLE}
OUTPUT_VARIABLE CUDA_ARCH )
if( NOT CUDA_ARCH_RESULT )
# strip linebreaks and convert to list delimited with ';'
string( REGEX REPLACE "[\n ]" ";" CUDA_ARCH ${CUDA_ARCH} )
# cache the result
set( CUDA_ARCH ${CUDA_ARCH} CACHE LIST "GPU architecture options" )
else()
message( "Failed to detect GPU architecture:\n${CUDA_ARCH_OUTPUT}" )
message( "Using (almost) all GPU architectures as fallback." )
set( CUDA_ARCH ${ALL_CUDA_ARCHS} )
endif()
message( "GPU architecture options: ${CUDA_ARCH}" )
else()
set( CUDA_ARCH -gencode arch=compute_${WITH_CUDA_ARCH},code=sm_${WITH_CUDA_ARCH} )
endif()
endif()
set( CUDA_ADD_EXECUTABLE_OPTIONS ${CUDA_ARCH} )
set( CUDA_ADD_LIBRARY_OPTIONS ${CUDA_ARCH} -shared )
set( CUDA_LINKER_OPTIONS "-arch sm_20 -shared" )
####
# Check for cuBLAS
#
if( WITH_CUBLAS STREQUAL "yes" )
message( "Enabling CUBLAS." )
set( HAVE_CUBLAS TRUE)
set( HAVE_CUBLAS "#define HAVE_CUBLAS" )
endif( WITH_CUBLAS STREQUAL "yes" )
####
# Check for CUSP
#
find_path( CUSP_INCLUDE_DIR cusp/hyb_matrix.h
DOC "CUSP headers." )
if( ${CUSP_INCLUDE_DIR} STREQUAL "CUSP_INCLUDE_DIR-NOTFOUND" )
message( "CUSP not found." )
set( HAVE_CUSP "//#define HAVE_CUSP" )
else()
message( "CUSP found. -- ${CUSP_INCLUDE_DIR}" )
set( HAVE_CUSP "#define HAVE_CUSP" )
cuda_include_directories( ${CUSP_INCLUDE_DIR} )
endif()
####
# Check for CUSPARSE
#
if( NOT WITH_CUSPARSE STREQUAL "no" )
find_path( CUSPARSE_INCLUDE_DIR cusparse.h
/usr/local/cuda/include
${CUDA_INCLUDE_DIR}
DOC "CUSPARSE headers." )
if( ${CUSPARSE_INCLUDE_DIR} STREQUAL "CUSPARSE_INCLUDE_DIR-NOTFOUND" )
message( "CUSPARSE not found." )
set( HAVE_CUSPARSE "//#define HAVE_CUSPARSE" )
else()
message( "CUSPARSE found. -- ${CUSPARSE_INCLUDE_DIR}" )
set( HAVE_CUSPARSE "#define HAVE_CUSPARSE" )
cuda_include_directories( ${CUSPARSE_INCLUDE_DIR} )
set( CUSPARSE_LIBRARY "${CUDA_cusparse_LIBRARY}" )
endif( NOT WITH_CUSPARSE STREQUAL "no" )
else( CUDA_FOUND )
AddCompilerFlag( "-std=gnu++0x" )
#AddCompilerFlag( "-std=gnu++0x -ftree-vectorizer-verbose=1" )
AddCompilerFlag( "-std=gnu++0x" )
####
# Check for OpenMP
#
find_package( OpenMP )
if( OPENMP_FOUND )
message( "Compiler supports OpenMP." )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_OPENMP -fopenmp")
#find_package( MPI )
#if( MPI_CXX_FOUND )
# set( BUILD_MPI TRUE )
# message( "MPI headers found -- ${MPI_CXX_INCLUDE_PATH}")
#endif()
find_package( DCMTK )
if( DCMTK_FOUND )
set( HAVE_DCMTK_H "#define HAVE_DCMTK_H" )
include_directories( ${DCMTK_INCLUDE_DIRS} )
else()
set( HAVE_DCMTK_H "//#define HAVE_DCMTK_H" )
endif()
find_package( PNG )
if( PNG_FOUND )
set( HAVE_PNG_H "#define HAVE_PNG_H" )
include_directories( ${PNG_INCLUDE_DIRS} )
else()
set( HAVE_PNG_H "//#define HAVE_PNG_H" )
endif()
####
# Check for some system header
#
find_path( SYS_TIME_INCLUDE_DIR sys/time.h
/usr/include/x86_64-linux-gnu
/usr/include
DOC "System timer headers." )
if( ${SYS_TIME_INCLUDE_DIR} STREQUAL "SYS_TIME_INCLUDE_DIR-NOTFOUND" )
message( "Missing header file sys/time.h" )
set( HAVE_SYS_TIME_H "//#define HAVE_SYS_TIME_H" )
else()
include_directories( ${SYS_TIME_INCLUDE_DIR}/tnl-${tnlVersion} )
set( HAVE_SYS_TIME_H "#define HAVE_SYS_TIME_H" )
endif()
find_path( SYS_RESOURCE_INCLUDE_DIR sys/resource.h
/usr/include/x86_64-linux-gnu
/usr/include
DOC "System resources headers." )
if( ${SYS_RESOURCE_INCLUDE_DIR} STREQUAL "SYS_RESOURCE_INCLUDE_DIR-NOTFOUND" )
message( "Missing header file sys/time.h" )
set( HAVE_SYS_RESOURCE_H "//#define HAVE_SYS_RESOURCE_H" )
else()
include_directories( ${SYS_RESOURCE_INCLUDE_DIR}/tnl-${tnlVersion} )
set( HAVE_SYS_RESOURCE_H "#define HAVE_SYS_RESOURCE_H" )
endif()
####
# Check for cppunit
#
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
if( WITH_TESTS STREQUAL "yes" )
FIND_PATH(CPPUNIT_INCLUDE_DIR cppunit/TestCase.h
/usr/local/include
/usr/include
DOC "CppUnit headers."
)
####
# With Win32, important to have both
#
if(WIN32)
FIND_LIBRARY(CPPUNIT_LIBRARY cppunit
${CPPUNIT_INCLUDE_DIR}/../lib
/usr/local/lib
/usr/lib)
FIND_LIBRARY(CPPUNIT_DEBUG_LIBRARY cppunitd
${CPPUNIT_INCLUDE_DIR}/../lib
/usr/local/lib
/usr/lib)
else(WIN32)
# On unix system, debug and release have the same name
FIND_LIBRARY(CPPUNIT_LIBRARY cppunit
${CPPUNIT_INCLUDE_DIR}/../lib
/usr/local/lib
/usr/lib)
FIND_LIBRARY(CPPUNIT_DEBUG_LIBRARY cppunit
${CPPUNIT_INCLUDE_DIR}/../lib
/usr/local/lib
/usr/lib)
endif(WIN32)
if( ${CPPUNIT_INCLUDE_DIR} STREQUAL "CPPUNIT_INCLUDE_DIR-NOTFOUND" )
message( "CPPUNIT not found." )
set( HAVE_CPPUNIT "//#define HAVE_CPPUNIT" )
else( ${CPPUNIT_INCLUDE_DIR} STREQUAL "CPPUNIT_INCLUDE_DIR-NOTFOUND" )
message( "CPPUNIT headers found -- ${CPPUNIT_INCLUDE_DIR}" )
if(CPPUNIT_LIBRARY)
message( "CPPUNIT library found -- ${CPPUNIT_LIBRARY}" )
set(CPPUNIT_FOUND "YES")
set(CPPUNIT_LIBRARIES ${CPPUNIT_LIBRARY} ${CMAKE_DL_LIBS})
set(CPPUNIT_DEBUG_LIBRARIES ${CPPUNIT_DEBUG_LIBRARY}
${CMAKE_DL_LIBS})
set( HAVE_CPPUNIT "#define HAVE_CPPUNIT" )
endif(CPPUNIT_LIBRARY)
endif( ${CPPUNIT_INCLUDE_DIR} STREQUAL "CPPUNIT_INCLUDE_DIR-NOTFOUND" )
ENABLE_TESTING()
INCLUDE( Dart )
endif( WITH_TESTS STREQUAL "yes" )
#if( BUILD_MPI )
# FIND_PATH( PETSC_INCLUDE_DIR petsc.h
# /usr/include/petsc
# ${PETSC_DIR}/${PETSC_ARCH}/include
# ${PETSC_DIR}/include
# DOC "PETSC headers."
# )
# if( ${PETSC_INCLUDE_DIR} STREQUAL "PETSC_INCLUDE_DIR-NOTFOUND" )
# message( "PETSC not found." )
# else()
# message( "PETSC headers found -- ${PETSC_INCLUDE_DIR}" )
# FIND_LIBRARY(PETSC_LIBRARY petsc
# ${PETSC_INCLUDE_DIR}/../lib
# /usr/local/lib
# /usr/lib)
# if( PETSC_LIBRARY )
# #string( REPLACE ";" " " MPI_LIBRARIES "${MPI_CXX_LIBRARIES}" )
# #set( PETSC_LIBRARY "${MPI_LIBRARIES} ${PETSC_LIBRARY}")
# message( "PETSC library found -- ${PETSC_LIBRARY}")
# list( GET MPI_CXX_INCLUDE_PATH 0 MPI_CXX_PATH )
# set(PETSC_CXX_FLAGS "-DHAVE_PETSC -I${PETSC_INCLUDE_DIR} -DHAVE_MPI -I${MPI_CXX_PATH}")
# endif()
# endif()
#endif()
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
####
# Explicit template instantiation
#
if( WITH_TEMPLATE_INSTANTIATION STREQUAL "yes" )
AddCompilerFlag( "-DTEMPLATE_EXPLICIT_INSTANTIATION " )
endif()
if( INSTANTIATE_INT STREQUAL "yes" )
AddCompilerFlag( "-DINSTANTIATE_INT " )
endif()
if( INSTANTIATE_LONG_INT STREQUAL "yes" )
AddCompilerFlag( "-DINSTANTIATE_LONG_INT " )
endif()
if( INSTANTIATE_FLOAT STREQUAL "yes" )
AddCompilerFlag( "-DINSTANTIATE_FLOAT " )
endif()
if( INSTANTIATE_DOUBLE STREQUAL "yes" )
AddCompilerFlag( "-DINSTANTIATE_DOUBLE " )
endif()
if( INSTANTIATE_LONG_DOUBLE STREQUAL "yes" )
AddCompilerFlag( "-DINSTANTIATE_LONG_DOUBLE " )
endif()
set( CXX_TEST_FLAGS "-fprofile-arcs -ftest-coverage" )
set( LD_TEST_FLAGS "-lgcov -coverage" )
set( configDirectory \"${CMAKE_INSTALL_PREFIX}/share/tnl-${tnlVersion}/\")
set( sourceDirectory \"${PROJECT_SOURCE_DIR}/\" )
set( testsDirectory \"${PROJECT_TESTS_PATH}/\" )
CONFIGURE_FILE( "tnlConfig.h.in" "${PROJECT_BUILD_PATH}/tnlConfig.h" )
INSTALL( FILES ${PROJECT_BUILD_PATH}/tnlConfig.h DESTINATION include/tnl-${tnlVersion} )
#Nastavime cesty k hlavickovym souborum a knihovnam
INCLUDE_DIRECTORIES( src )
INCLUDE_DIRECTORIES( ${PROJECT_BUILD_PATH} )
LINK_DIRECTORIES( ${LIBRARY_OUTPUT_PATH} )
#Pokracujeme dalsimi podadresari
add_subdirectory( src )
add_subdirectory( tests )
add_subdirectory( tools )
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Template Numerical Library")
set(CPACK_PACKAGE_VENDOR "MMG")
#set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/ReadMe.txt")
#set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt")
set(CPACK_PACKAGE_VERSION_MAJOR "0")
set(CPACK_PACKAGE_VERSION_MINOR "1")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}")
if(WIN32 AND NOT UNIX)
# There is a bug in NSI 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_NSIS_INSTALLED_ICON_NAME "bin\\\\MyExecutable.exe")
set(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} Template Numerical Library")
set(CPACK_NSIS_HELP_LINK "http:\\\\\\\\geraldine.fjfi.cvut.cz/~oberhuber/doku-wiki-tnl")
set(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\geraldine.fjfi.cvut.cz/~oberhuber/doku-wiki-tnl")
set(CPACK_NSIS_CONTACT "tomas.oberhuber@fjfi.cvut.cz")
set(CPACK_NSIS_MODIFY_PATH ON)
else(WIN32 AND NOT UNIX)
# set(CPACK_STRIP_FILES "bin/MyExecutable")
endif(WIN32 AND NOT UNIX)
set(CPACK_SOURCE_STRIP_FILES "Debug")
set(CPACK_SOURCE_STRIP_FILES "Release")
#set(CPACK_PACKAGE_EXECUTABLES "MyExecutable" "My Executable")