diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,25 +1,10 @@ -cmake_minimum_required(VERSION 2.8) -project(METIS) +cmake_minimum_required(VERSION 3.0) +project(METIS VERSION 5.1.0 LANGUAGES C) -set(GKLIB_PATH "GKlib" CACHE PATH "path to GKlib") -set(SHARED FALSE CACHE BOOL "build a shared library") - -if(MSVC) - set(METIS_INSTALL FALSE) -else() - set(METIS_INSTALL TRUE) -endif() - -# Configure libmetis library. -if(SHARED) - set(METIS_LIBRARY_TYPE SHARED) -else() - set(METIS_LIBRARY_TYPE STATIC) -endif(SHARED) - -include(${GKLIB_PATH}/GKlibSystem.cmake) +include(GNUInstallDirs) +include(GKlib/GKlibSystem.cmake) # Add include directories. -include_directories(${GKLIB_PATH}) +include_directories(GKlib) include_directories(include) # Recursively look for CMakeLists.txt in subdirs. add_subdirectory("include") diff --git a/GKlib/CMakeLists.txt b/GKlib/CMakeLists.txt --- a/GKlib/CMakeLists.txt +++ b/GKlib/CMakeLists.txt @@ -1,21 +1,23 @@ -cmake_minimum_required(VERSION 2.8) -project(GKlib) +cmake_minimum_required(VERSION 3.0) +project(GKlib LANGUAGES C) -get_filename_component(abs "." ABSOLUTE) -set(GKLIB_PATH ${abs}) -unset(abs) +include(GNUInstallDirs) include(GKlibSystem.cmake) include_directories(".") -add_library(GKlib STATIC ${GKlib_sources}) +add_library(GKlib ${GKlib_sources}) +if(OPENMP AND OPENMP_FOUND) + set_property(TARGET GKlib APPEND PROPERTY COMPILE_FLAGS ${OpenMP_C_FLAGS}) + set_property(TARGET GKlib APPEND PROPERTY LINK_FLAGS ${OpenMP_C_FLAGS}) +endif() if(UNIX) - target_link_libraries(GKlib m) + target_link_libraries(GKlib PRIVATE m) endif(UNIX) include_directories("test") add_subdirectory("test") install(TARGETS GKlib - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib) -install(FILES ${GKlib_includes} DESTINATION include) + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) +install(FILES ${GKlib_includes} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GKlib) diff --git a/GKlib/GKlibSystem.cmake b/GKlib/GKlibSystem.cmake --- a/GKlib/GKlibSystem.cmake +++ b/GKlib/GKlibSystem.cmake @@ -15,35 +15,28 @@ # Add compiler flags. if(MSVC) - set(GKlib_COPTS "/Ox") - set(GKlib_COPTIONS "-DWIN32 -DMSC -D_CRT_SECURE_NO_DEPRECATE -DUSE_GKREGEX") -elseif(MINGW) - set(GKlib_COPTS "-DUSE_GKREGEX") -else() - set(GKlib_COPTS "-O3") - set(GKlib_COPTIONS "-DLINUX -D_FILE_OFFSET_BITS=64") -endif(MSVC) -if(CYGWIN) - set(GKlib_COPTIONS "${GKlib_COPTIONS} -DCYGWIN") -endif(CYGWIN) + add_definitions(-DWIN32 -DMSC -D_CRT_SECURE_NO_DEPRECATE) +elseif(UNIX) + add_definitions(-DLINUX -D_FILE_OFFSET_BITS=64) +elseif(CYGWIN) + add_definitions(-DCYGWIN) +endif() + if(CMAKE_COMPILER_IS_GNUCC) # GCC opts. - set(GKlib_COPTIONS "${GKlib_COPTIONS} -std=c99 -fno-strict-aliasing") - if(NOT MINGW) - set(GKlib_COPTIONS "${GKlib_COPTIONS} -fPIC") - endif(NOT MINGW) + add_compile_options(-std=c99 -fno-strict-aliasing) # GCC warnings. - set(GKlib_COPTIONS "${GKlib_COPTIONS} -Wall -pedantic -Wno-unused-but-set-variable -Wno-unused-variable -Wno-unknown-pragmas") + add_compile_options(-Wall -pedantic -Wno-unused-but-set-variable -Wno-unused-variable -Wno-unknown-pragmas) elseif(${CMAKE_C_COMPILER_ID} MATCHES "Sun") # Sun insists on -xc99. - set(GKlib_COPTIONS "${GKlib_COPTIONS} -xc99") + add_compile_options(-xc99) endif(CMAKE_COMPILER_IS_GNUCC) # Find OpenMP if it is requested. if(OPENMP) include(FindOpenMP) if(OPENMP_FOUND) - set(GKlib_COPTIONS "${GKlib_COPTIONS} -D__OPENMP__ ${OpenMP_C_FLAGS}") + add_definitions(-D__OPENMP__) else() message(WARNING "OpenMP was requested but support was not found") endif(OPENMP_FOUND) @@ -52,64 +45,64 @@ # Add various definitions. if(GDB) - set(GKlib_COPTS "${GKlib_COPTS} -g") - set(GKlib_COPTIONS "${GKlib_COPTIONS} -Werror") + add_compile_options(-g) + add_compile_options(-Werror) endif(GDB) if(DEBUG) - set(GKlib_COPTS "-g") - set(GKlib_COPTIONS "${GKlib_COPTIONS} -DDEBUG") + add_compile_options(-g) + add_definitions(-DDEBUG) endif(DEBUG) if(GPROF) - set(GKlib_COPTS "-pg") + add_compile_options(-pg) endif(GPROF) if(NOT ASSERT) - set(GKlib_COPTIONS "${GKlib_COPTIONS} -DNDEBUG") + add_definitions(-DNDEBUG) endif(NOT ASSERT) if(NOT ASSERT2) - set(GKlib_COPTIONS "${GKlib_COPTIONS} -DNDEBUG2") + add_definitions(-DNDEBUG2) endif(NOT ASSERT2) # Add various options if(PCRE) - set(GKlib_COPTIONS "${GKlib_COPTIONS} -D__WITHPCRE__") + add_definitions(-D__WITHPCRE__) endif(PCRE) if(GKREGEX) - set(GKlib_COPTIONS "${GKlib_COPTIONS} -DUSE_GKREGEX") + add_definitions(-DUSE_GKREGEX) endif(GKREGEX) if(GKRAND) - set(GKlib_COPTIONS "${GKlib_COPTIONS} -DUSE_GKRAND") + add_definitions(-DUSE_GKRAND) endif(GKRAND) # Check for features. check_include_file(execinfo.h HAVE_EXECINFO_H) if(HAVE_EXECINFO_H) - set(GKlib_COPTIONS "${GKlib_COPTIONS} -DHAVE_EXECINFO_H") + add_definitions(-DHAVE_EXECINFO_H) endif(HAVE_EXECINFO_H) check_function_exists(getline HAVE_GETLINE) if(HAVE_GETLINE) - set(GKlib_COPTIONS "${GKlib_COPTIONS} -DHAVE_GETLINE") + add_definitions(-DHAVE_GETLINE) endif(HAVE_GETLINE) # Custom check for TLS. if(MSVC) - set(GKlib_COPTIONS "${GKlib_COPTIONS} -D__thread=__declspec(thread)") + add_definitions(-D__thread=__declspec\(thread\)) else() # This if checks if that value is cached or not. if("${HAVE_THREADLOCALSTORAGE}" MATCHES "^${HAVE_THREADLOCALSTORAGE}$") try_compile(HAVE_THREADLOCALSTORAGE ${CMAKE_BINARY_DIR} - ${GKLIB_PATH}/conf/check_thread_storage.c) + ${CMAKE_CURRENT_LIST_DIR}/conf/check_thread_storage.c) if(HAVE_THREADLOCALSTORAGE) message(STATUS "checking for thread-local storage - found") else() @@ -117,13 +110,10 @@ endif() endif() if(NOT HAVE_THREADLOCALSTORAGE) - set(GKlib_COPTIONS "${GKlib_COPTIONS} -D__thread=") + add_definitions(-D__thread=) endif() endif() -# Finally set the official C flags. -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GKlib_COPTIONS} ${GKlib_COPTS}") - # Find GKlib sources. -file(GLOB GKlib_sources ${GKLIB_PATH}/*.c) -file(GLOB GKlib_includes ${GKLIB_PATH}/*.h) +file(GLOB GKlib_sources ${CMAKE_CURRENT_LIST_DIR}/*.c) +file(GLOB GKlib_includes ${CMAKE_CURRENT_LIST_DIR}/*.h) diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile @@ -6,7 +6,6 @@ gprof = not-set openmp = not-set prefix = not-set -gklib_path = not-set shared = not-set cc = not-set @@ -20,10 +19,6 @@ # Process configuration options. CONFIG_FLAGS = -DCMAKE_VERBOSE_MAKEFILE=1 -ifeq ($(gklib_path), not-set) - gklib_path = GKlib -endif -CONFIG_FLAGS += -DGKLIB_PATH=$(abspath $(gklib_path)) ifneq ($(gdb), not-set) CONFIG_FLAGS += -DGDB=$(gdb) endif @@ -46,7 +41,7 @@ CONFIG_FLAGS += -DCMAKE_INSTALL_PREFIX=$(prefix) endif ifneq ($(shared), not-set) - CONFIG_FLAGS += -DSHARED=1 + CONFIG_FLAGS += -DBUILD_SHARED_LIBS=1 endif ifneq ($(cc), not-set) CONFIG_FLAGS += -DCMAKE_C_COMPILER=$(cc) diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -1,3 +1 @@ -if(METIS_INSTALL) - install(FILES metis.h DESTINATION include) -endif() +install(FILES metis.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/metis) diff --git a/libmetis/CMakeLists.txt b/libmetis/CMakeLists.txt --- a/libmetis/CMakeLists.txt +++ b/libmetis/CMakeLists.txt @@ -3,14 +3,20 @@ # Find sources. file(GLOB metis_sources *.c) # Build libmetis. -add_library(metis ${METIS_LIBRARY_TYPE} ${GKlib_sources} ${metis_sources}) +add_library(metis ${GKlib_sources} ${metis_sources}) +if(OPENMP AND OPENMP_FOUND) + set_property(TARGET metis APPEND PROPERTY COMPILE_FLAGS ${OpenMP_C_FLAGS}) + set_property(TARGET metis APPEND PROPERTY LINK_FLAGS ${OpenMP_C_FLAGS}) +endif() if(UNIX) - target_link_libraries(metis m) + target_link_libraries(metis PRIVATE m) endif() -if(METIS_INSTALL) - install(TARGETS metis - LIBRARY DESTINATION lib - RUNTIME DESTINATION lib - ARCHIVE DESTINATION lib) -endif() +install(TARGETS metis + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + +configure_file(metis.pc.in metis.pc @ONLY) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/metis.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) diff --git a/libmetis/metis.pc.in b/libmetis/metis.pc.in new file mode 100644 --- /dev/null +++ b/libmetis/metis.pc.in @@ -0,0 +1,12 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@ +includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ + +Name: @PROJECT_NAME@ +Description: Software for partitioning unstructured graphs and meshes +Version: @PROJECT_VERSION@ +URL: http://glaros.dtc.umn.edu/gkhome/metis/metis/overview +Libs: -L${libdir} -lmetis +Libs.private: -lm +Cflags: -I${includedir}/metis diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -1,6 +1,5 @@ # These programs use internal metis data structures. include_directories(../libmetis) -link_directories(/home/karypis/local/lib) # Build program. add_executable(gpmetis gpmetis.c cmdline_gpmetis.c io.c stat.c) add_executable(ndmetis ndmetis.c cmdline_ndmetis.c io.c smbfactor.c) @@ -13,10 +12,8 @@ # target_link_libraries(${prog} metis profiler) endforeach(prog) -if(METIS_INSTALL) - install(TARGETS gpmetis ndmetis mpmetis m2gmetis graphchk cmpfillin - RUNTIME DESTINATION bin) -endif() +install(TARGETS gpmetis ndmetis mpmetis m2gmetis graphchk cmpfillin + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # Try to find subversion revision. set(SVNREV "")