Skip to content

Commit e7d6c77

Browse files
committed
METIS as Git submodule
1 parent c498ce4 commit e7d6c77

File tree

9 files changed

+148
-48
lines changed

9 files changed

+148
-48
lines changed

.github/workflows/ci.yml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ on:
77
- "**.cmake"
88
- "**/CMakeLists.txt"
99
- ".github/workflows/ci.yml"
10+
workflow_dispatch:
11+
12+
# avoid wasted runs
13+
concurrency:
14+
group: ${{ github.workflow }}-${{ github.ref }}
15+
cancel-in-progress: true
16+
1017

1118
jobs:
1219

@@ -21,8 +28,6 @@ jobs:
2128
timeout-minutes: 5
2229

2330
steps:
24-
- uses: actions/checkout@v4
25-
2631
- name: Install MPI (Linux)
2732
if: ${{ runner.os == 'Linux' }}
2833
run: sudo apt install libopenmpi-dev
@@ -31,6 +36,9 @@ jobs:
3136
if: ${{ runner.os == 'macOS' }}
3237
run: brew install open-mpi
3338

39+
- &checkout
40+
uses: actions/checkout@v4
41+
3442
- run: cmake -B build -DIDXTYPEWIDTH=${{ matrix.intsize }}
3543
- run: cmake --build build --parallel
3644

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "METIS"]
2+
path = METIS
3+
url = https://github.com/scivision/METIS

CMakeLists.txt

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,59 @@
1-
cmake_minimum_required(VERSION 3.14...3.28)
2-
project(ParMETIS LANGUAGES C)
1+
cmake_minimum_required(VERSION 3.16...4.1)
2+
3+
if(NOT CMAKE_BUILD_TYPE AND NOT DEFINED ENV{CMAKE_BUILD_TYPE})
4+
set(CMAKE_BUILD_TYPE Release CACHE STRING "Debug or Release")
5+
endif()
6+
7+
project(ParMETIS LANGUAGES C VERSION 1.0.0)
38

49
# --- need METIS first
5-
include(FetchContent)
10+
include(GNUInstallDirs)
11+
include(cmake/GitSubmodule.cmake)
612

7-
FetchContent_Declare(GKlib
8-
GIT_REPOSITORY https://github.com/scivision/GKlib.git
9-
GIT_TAG 44630ca
10-
GIT_SHALLOW true
11-
)
12-
FetchContent_MakeAvailable(GKlib)
13+
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND metis_IS_TOP_LEVEL)
14+
set(CMAKE_INSTALL_PREFIX "${PROJECT_BINARY_DIR}/local" CACHE PATH "install prefix" FORCE)
15+
endif()
1316

14-
FetchContent_Declare(metis_fc
15-
GIT_REPOSITORY https://github.com/scivision/metis.git
16-
GIT_TAG fd7799b
17-
GIT_SHALLOW true
18-
)
17+
message(STATUS "${PROJECT_NAME} ${PROJECT_VERSION} CMake ${CMAKE_VERSION} install prefix ${CMAKE_INSTALL_PREFIX}")
1918

20-
FetchContent_MakeAvailable(metis_fc)
19+
git_submodule(${CMAKE_CURRENT_SOURCE_DIR}/METIS)
20+
add_subdirectory(METIS)
2121

22-
if(NOT DEFINED REALTYPEWIDTH)
23-
set(REALTYPEWIDTH 32)
24-
endif()
25-
if(NOT DEFINED IDXTYPEWIDTH)
26-
set(IDXTYPEWIDTH 32)
27-
endif()
28-
add_compile_definitions(REALTYPEWIDTH=${REALTYPEWIDTH} IDXTYPEWIDTH=${IDXTYPEWIDTH})
22+
set(CMAKE_C_STANDARD 99)
2923

30-
message(STATUS "${PROJECT_NAME} ${PROJECT_VERSION} CMake ${CMAKE_VERSION}
31-
REALTYPEWIDTH=${REALTYPEWIDTH} IDXTYPEWIDTH=${IDXTYPEWIDTH}")
32-
message(STATUS "METIS ${metis_fc_SOURCE_DIR}")
33-
message(STATUS "GKlib ${gklib_SOURCE_DIR}")
24+
add_compile_definitions(
25+
"REALTYPEWIDTH=$<IF:$<BOOL:${REALTYPEWIDTH}>,${REALTYPEWIDTH},32>"
26+
"IDXTYPEWIDTH=$<IF:$<BOOL:${IDXTYPEWIDTH}>,${IDXTYPEWIDTH},32>"
27+
)
3428

3529
find_package(MPI REQUIRED)
3630

3731
include(./conf/gkbuild.cmake)
3832

3933
install(FILES include/parmetis.h TYPE INCLUDE)
4034

35+
add_library(parmetis)
36+
target_include_directories(parmetis PUBLIC
37+
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include;${PROJECT_SOURCE_DIR}/libparmetis>"
38+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
39+
)
40+
target_link_libraries(parmetis PRIVATE MPI::MPI_C METIS::METIS)
41+
42+
if(SHARED)
43+
target_link_libraries(parmetis PRIVATE metis GKlib)
44+
endif()
45+
46+
add_library(METIS::PARMETIS INTERFACE IMPORTED GLOBAL)
47+
target_link_libraries(METIS::PARMETIS INTERFACE parmetis)
48+
49+
install(TARGETS parmetis EXPORT ${PROJECT_NAME}-targets)
50+
4151
add_subdirectory(libparmetis)
4252
add_subdirectory(programs)
4353

4454
# This is for testing during development and is not being distributed
4555
#add_subdirectory(test)
56+
57+
include(cmake/install.cmake)
58+
59+
file(GENERATE OUTPUT .gitignore CONTENT "*")

METIS

Submodule METIS added at b67d02c

cmake/GitSubmodule.cmake

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
function(git_submodule submod_dir)
2+
# get/update Git submodule directory to CMake, assuming the
3+
# Git submodule directory is a CMake project.
4+
5+
if(EXISTS ${submod_dir}/CMakeLists.txt)
6+
return()
7+
endif()
8+
9+
set(CMAKE_EXECUTE_PROCESS_COMMAND_ECHO STDOUT)
10+
11+
find_package(Git REQUIRED)
12+
13+
# EXISTS, do not use IS_DIRECTORY as in submodule .git is a file not a directory
14+
if(EXISTS ${PROJECT_SOURCE_DIR}/.git)
15+
message(DEBUG "${PROJECT_SOURCE_DIR} is a Git repository, updating submodule ${submod_dir}")
16+
execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive -- ${submod_dir}
17+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
18+
COMMAND_ERROR_IS_FATAL ANY
19+
)
20+
else()
21+
message(DEBUG "${PROJECT_SOURCE_DIR} is from an archive or otherwise not a Git repository. Getting .gitmodules info to clone")
22+
execute_process(COMMAND ${GIT_EXECUTABLE} config --file ${PROJECT_SOURCE_DIR}/.gitmodules --get submodule.scalapack.url
23+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
24+
OUTPUT_VARIABLE submod_url
25+
OUTPUT_STRIP_TRAILING_WHITESPACE
26+
COMMAND_ERROR_IS_FATAL ANY
27+
)
28+
# Some platforms like Windows, Git might refuse to clone into a totally empty existing directory
29+
# this is a known technique, to "git clone" from that empty directory to make it work.
30+
execute_process(COMMAND ${GIT_EXECUTABLE} clone ${submod_url} ${submod_dir}
31+
WORKING_DIRECTORY ${submod_dir}
32+
COMMAND_ERROR_IS_FATAL ANY
33+
)
34+
endif()
35+
36+
endfunction()

cmake/config.cmake.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@PACKAGE_INIT@
2+
3+
include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake)
4+
5+
check_required_components(@PROJECT_NAME@)

cmake/install.cmake

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# --- BOILERPLATE: install / packaging
2+
3+
include(CMakePackageConfigHelpers)
4+
5+
configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/config.cmake.in
6+
${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake
7+
INSTALL_DESTINATION cmake
8+
)
9+
10+
write_basic_package_version_file(
11+
${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake
12+
COMPATIBILITY SameMajorVersion
13+
)
14+
15+
install(EXPORT ${PROJECT_NAME}-targets
16+
NAMESPACE ${PROJECT_NAME}::
17+
DESTINATION cmake
18+
)
19+
20+
install(FILES
21+
${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake
22+
${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake
23+
DESTINATION cmake
24+
)
25+
26+
# # allow use of package from build directory without installing
27+
export(EXPORT ${PROJECT_NAME}-targets
28+
FILE ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}-targets.cmake
29+
NAMESPACE ${PROJECT_NAME}::
30+
)
31+
32+
# --- CPack
33+
34+
set(CPACK_GENERATOR "TBZ2")
35+
set(CPACK_SOURCE_GENERATOR "TBZ2")
36+
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
37+
set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
38+
set(CPACK_PACKAGE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/package)
39+
40+
# not .gitignore as its regex syntax is more advanced than CMake
41+
set(CPACK_SOURCE_IGNORE_FILES .git/ .github/ .vscode/ _CPack_Packages/
42+
${CMAKE_BINARY_DIR}/ ${PROJECT_BINARY_DIR}/
43+
archive/ concepts/
44+
)
45+
46+
install(FILES ${CPACK_RESOURCE_FILE_README} ${CPACK_RESOURCE_FILE_LICENSE}
47+
DESTINATION share/docs/${PROJECT_NAME}
48+
)
49+
50+
include(CPack)

conf/gkbuild.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ if(APPLE)
2727
endif()
2828

2929
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
30-
list(APPEND GKlib_COPTS -fno-strict-aliasing -Werror -Wall -pedantic -Wno-unused-function -Wno-unused-but-set-variable -Wno-unused-variable -Wno-unknown-pragmas -Wno-unused-label)
30+
list(APPEND GKlib_COPTS -fno-strict-aliasing -Wall -Wno-unused-function -Wno-unused-but-set-variable -Wno-unused-variable -Wno-unknown-pragmas -Wno-unused-label)
3131
endif()
3232

3333
if(UNIX)

libparmetis/CMakeLists.txt

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
# Find sources.
2-
set(parmetis_sources diffutil.c initmsection.c move.c rename.h wave.c
1+
target_sources(parmetis PRIVATE
2+
diffutil.c initmsection.c move.c rename.h wave.c
33
akwayfm.c frename.c initpart.c msetup.c renumber.c weird.c
44
ametis.c gklib.c kmetis.c node_refine.c rmetis.c wspace.c
55
balancemylink.c gklib_defs.h kwayrefine.c ometis.c selectq.c xyzpart.c
@@ -8,20 +8,3 @@ csrmatch.c gkmetis.c match.c proto.h stat.c
88
ctrl.c gkmpi.c mdiffusion.c pspases.c struct.h
99
debug.c graph.c mesh.c redomylink.c timer.c
1010
defs.h initbalance.c mmetis.c remap.c util.c)
11-
12-
# Create libparmetis
13-
add_library(parmetis ${parmetis_sources})
14-
target_include_directories(parmetis PUBLIC
15-
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR};${PROJECT_SOURCE_DIR}/include>"
16-
$<INSTALL_INTERFACE:include>
17-
PRIVATE
18-
${gklib_SOURCE_DIR}
19-
${metis_fc_SOURCE_DIR}/include
20-
)
21-
target_link_libraries(parmetis PRIVATE MPI::MPI_C)
22-
23-
if(SHARED)
24-
target_link_libraries(parmetis PRIVATE metis GKlib)
25-
endif()
26-
27-
install(TARGETS parmetis)

0 commit comments

Comments
 (0)