From 86b5f0ca86a5089702d3a2b129e1bb27e98df945 Mon Sep 17 00:00:00 2001 From: Jorge L GV Date: Fri, 4 Jul 2025 13:26:51 +1000 Subject: [PATCH 1/4] make instaling vapaa easier --- CMakeLists.txt | 43 +++++++++++++++++++++++++++++++++++++++---- source/CMakeLists.txt | 6 +++--- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index af88468..9cec66d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,9 +13,15 @@ project( VERSION 0.0.0 LANGUAGES Fortran C) set(project_name vapaa) +include(GNUInstallDirs) enable_language(Fortran) enable_language(C) + +option(VAPAA_ENABLE_TESTING "Build tests" OFF) + +if(VAPAA_ENABLE_TESTING) enable_testing() +endif() include(ExternalProject) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) @@ -25,10 +31,11 @@ set(CMAKE_Fortran_STANDARD 2018) set(CMAKE_Fortran_STANDARD_REQUIRED ON) find_package(MPI REQUIRED COMPONENTS C) + set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/source") # Create the static library -set(vapa_lib vapa) +set(vapa_lib vapaa) add_library(${vapa_lib} STATIC) @@ -45,7 +52,9 @@ else() elseif(MPI_Fortran_COMPILER MATCHES "cray") set(FLAG_MPI -DMPICH) else() - set(FLAG_MPI "UnknownMPI") + #set(FLAG_MPI "UnknownMPI") + set(FLAG_MPI -DOPEN_MPI) + set(WARNING "Automatic detection failed, assuming OpenMPI") endif() message(STATUS "Automatically detected MPI Vendor: ${FLAG_MPI}") endif() @@ -59,8 +68,34 @@ target_link_libraries(${vapa_lib} PRIVATE MPI::MPI_C) # Set the library output and module directories set_target_properties( ${vapa_lib} - PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" - Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/modules") + PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib" + Fortran_MODULE_DIRECTORY "${PROJECT_BINARY_DIR}/include") + +target_include_directories(${vapa_lib} + PUBLIC + $ + $ +) + add_subdirectory(source) +if(VAPAA_ENABLE_TESTING) add_subdirectory(tests) +endif() + +install(TARGETS ${vapa_lib} + EXPORT vapaaTargets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin +) + +install(DIRECTORY "${PROJECT_BINARY_DIR}/include/" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + ) + +install(EXPORT vapaaTargets + FILE vapaaTargets.cmake + NAMESPACE vapaa:: + DESTINATION lib/cmake/vapaa) + diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index b2d2b55..30994a1 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -1,4 +1,4 @@ +file(GLOB SRC_C CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/*.c") +file(GLOB SRC_FC CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/*.F90") -file(GLOB C_files *.c) -file(GLOB FC_files *.F90) -target_sources(${vapa_lib} PRIVATE ${C_files} ${FC_files}) +target_sources(${vapa_lib} PRIVATE ${SRC_C} ${SRC_FC}) From a82a2f446d63a81400177ab66fb5b6198d5d7d30 Mon Sep 17 00:00:00 2001 From: JorgeGV Date: Fri, 11 Jul 2025 09:07:32 +1000 Subject: [PATCH 2/4] updates to library --- CMakeLists.txt | 58 ++++++++++++++++++++++++++++++++----------- source/CMakeLists.txt | 2 +- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cec66d..8bab2e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,7 @@ project( VERSION 0.0.0 LANGUAGES Fortran C) set(project_name vapaa) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) include(GNUInstallDirs) enable_language(Fortran) enable_language(C) @@ -23,33 +24,37 @@ if(VAPAA_ENABLE_TESTING) enable_testing() endif() include(ExternalProject) + set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) -set(CMAKE_Fortran_STANDARD 2018) -set(CMAKE_Fortran_STANDARD_REQUIRED ON) - find_package(MPI REQUIRED COMPONENTS C) set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/source") # Create the static library -set(vapa_lib vapaa) +set(vapaa_lib vapaa) -add_library(${vapa_lib} STATIC) +add_library(${vapaa_lib} STATIC) if(DEFINED MPI_VENDOR) set(FLAG_MPI ${MPI_VENDOR}) message(STATUS "MPI Vendor explicitly set to: ${MPI_VENDOR}") else() - if(MPI_Fortran_COMPILER MATCHES "openmpi|ompi") + message(STATUS "The mpi compiler is in: ${MPI_C_COMPILER}") + # the "finding" MPI really depends on the path having the name of the MPI + # cmake does not have a MPI_LIBRARY_NAME variable that will 100% give us the + # name. Additionally, these flags are set based on the Makefiles included with + # vapaa upon which this CMake is based on + if(MPI_C_COMPILER MATCHES "openmpi|ompi") set(FLAG_MPI -DOPEN_MPI) - elseif(MPI_Fortran_COMPILER MATCHES "mpich") + elseif(MPI_C_COMPILER MATCHES "mpich") set(FLAG_MPI -DMPICH) - elseif(MPI_Fortran_COMPILER MATCHES "intel") + elseif(MPI_C_COMPILER MATCHES "intel") set(FLAG_MPI -DMPICH) - elseif(MPI_Fortran_COMPILER MATCHES "cray") + elseif(MPI_C_COMPILER MATCHES "cray") + # this is based on most cray machines using cray-mpich set(FLAG_MPI -DMPICH) else() #set(FLAG_MPI "UnknownMPI") @@ -61,17 +66,40 @@ endif() message(STATUS "Final MPI Vendor Flag: ${FLAG_MPI}") -target_compile_options(${vapa_lib} PRIVATE -Wall -Wextra -fPIE) -target_compile_definitions(${vapa_lib} PRIVATE -DHAVE_CFI ${FLAG_MPI}) -target_link_libraries(${vapa_lib} PRIVATE MPI::MPI_C) +set(WARNFLAGS "-Wall -Wextra -fPIE") +if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g -std=f2018") +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g -std=f2018") +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "NAG") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g -f2018 -DHAVE_CFI") +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g -stand f18") +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "IntelLLVM") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g -stand f18") +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Cray") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g ") +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "NVHPC") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g ") +else() + message(WARNING "Unknown Fortran compiler: ${CMAKE_Fortran_COMPILER_ID}") + message(WARNING "F2018 standard may not be properly set") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g") +endif() + +# Display final flags +message(STATUS "Fortran compiler flags: ${CMAKE_Fortran_FLAGS}") + +target_compile_definitions(${vapaa_lib} PRIVATE -DHAVE_CFI ${FLAG_MPI}) +target_link_libraries(${vapaa_lib} PRIVATE MPI::MPI_C) # Set the library output and module directories set_target_properties( - ${vapa_lib} + ${vapaa_lib} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib" Fortran_MODULE_DIRECTORY "${PROJECT_BINARY_DIR}/include") -target_include_directories(${vapa_lib} +target_include_directories(${vapaa_lib} PUBLIC $ $ @@ -83,7 +111,7 @@ if(VAPAA_ENABLE_TESTING) add_subdirectory(tests) endif() -install(TARGETS ${vapa_lib} +install(TARGETS ${vapaa_lib} EXPORT vapaaTargets ARCHIVE DESTINATION lib LIBRARY DESTINATION lib diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 30994a1..9dd25fb 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -1,4 +1,4 @@ file(GLOB SRC_C CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/*.c") file(GLOB SRC_FC CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/*.F90") -target_sources(${vapa_lib} PRIVATE ${SRC_C} ${SRC_FC}) +target_sources(${vapaa_lib} PRIVATE ${SRC_C} ${SRC_FC}) From 83146aa0e4892808e08eb1684035d5c8a425075e Mon Sep 17 00:00:00 2001 From: JorgeGV Date: Fri, 11 Jul 2025 20:33:52 +1000 Subject: [PATCH 3/4] include path through hacky ways and remove warnings from compilers that don't support it --- CMakeLists.txt | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8bab2e8..1a28abb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,17 +70,25 @@ set(WARNFLAGS "-Wall -Wextra -fPIE") if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g -std=f2018") elseif(CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang") - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g -std=f2018") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g -std=f2018") elseif(CMAKE_Fortran_COMPILER_ID MATCHES "NAG") - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g -f2018 -DHAVE_CFI") +# this is a hack for now + # Get the full path to the NAG Fortran compiler + get_filename_component(NAGFOR_PATH "${CMAKE_Fortran_COMPILER}" REALPATH) + # Go up two directories to reach $NAG_ROOT (assuming $NAG_ROOT/bin/nagfor) + get_filename_component(NAG_ROOT "${NAGFOR_PATH}" DIRECTORY) # bin/ + get_filename_component(NAG_ROOT "${NAG_ROOT}" DIRECTORY) # $NAG_ROOT/ + message(STATUS "NAG HOME is in ${NAG_ROOT}") + target_include_directories(${vapaa_lib} PRIVATE ${NAG_ROOT}/lib) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g -f2018") elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g -stand f18") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g -stand f18") elseif(CMAKE_Fortran_COMPILER_ID MATCHES "IntelLLVM") - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g -stand f18") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g -stand f18") elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Cray") - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g ") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g ") elseif(CMAKE_Fortran_COMPILER_ID MATCHES "NVHPC") - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g ") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g ") else() message(WARNING "Unknown Fortran compiler: ${CMAKE_Fortran_COMPILER_ID}") message(WARNING "F2018 standard may not be properly set") From 3d5b1da9f1995adbf6333576d24a1ef0ac3edc21 Mon Sep 17 00:00:00 2001 From: JorgeGV Date: Sat, 12 Jul 2025 23:44:58 +1000 Subject: [PATCH 4/4] remove warn flags from default build --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a28abb..9a5f97b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,7 +68,7 @@ message(STATUS "Final MPI Vendor Flag: ${FLAG_MPI}") set(WARNFLAGS "-Wall -Wextra -fPIE") if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${WARNFLAGS} -g -std=f2018") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g -std=f2018") elseif(CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang") set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -g -std=f2018") elseif(CMAKE_Fortran_COMPILER_ID MATCHES "NAG")