Skip to content

Commit

Permalink
separate fortran and cpp files into their own targets
Browse files Browse the repository at this point in the history
combining fortran and cpp files in the same target was causing fortran
flags to be applied to cpp files, which could cause build failures
with clang.
  • Loading branch information
caitlinross committed Oct 18, 2023
1 parent a43d013 commit 8ec2f16
Showing 1 changed file with 52 additions and 6 deletions.
58 changes: 52 additions & 6 deletions bindings/Fortran/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,34 @@ if(ADIOS2_USE_Fortran_flag_argument_mismatch)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fallow-argument-mismatch")
endif()

add_library(adios2_fortran
# separate the cpp files and fortran files into separate targets
# otherwise clang complains about unknown arg -fallow-argument-mismatch for cpp files
add_library(adios2_f2c
f2c/adios2_f2c_adios.cpp
f2c/adios2_f2c_attribute.cpp
f2c/adios2_f2c_io.cpp
f2c/adios2_f2c_variable.cpp
f2c/adios2_f2c_engine.cpp
f2c/adios2_f2c_operator.cpp
)
set_property(TARGET adios2_f2c PROPERTY EXPORT_NAME f2c)
set_property(TARGET adios2_f2c PROPERTY OUTPUT_NAME adios2${ADIOS2_LIBRARY_SUFFIX}_f2c)

target_include_directories(adios2_f2c
PUBLIC
$<BUILD_INTERFACE:${CMAKE_Fortran_MODULE_DIRECTORY}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/adios2/fortran>
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
)

target_link_libraries(adios2_f2c
PRIVATE
adios2_c
adios2_core
)

add_library(adios2_fortran
modules/adios2_mod.f90
modules/adios2_functions_mod.f90
modules/adios2_functions_allocate_mod.f90
Expand Down Expand Up @@ -69,6 +89,7 @@ target_link_libraries(adios2_fortran
PRIVATE
adios2_c
adios2_core
adios2_f2c
)

if(ADIOS2_HAVE_FORTRAN_SUBMODULES)
Expand All @@ -81,20 +102,40 @@ set_target_properties(adios2_fortran PROPERTIES
SOVERSION ${ADIOS2_LIBRARY_SOVERSION}
)

add_library(adios2::f2c ALIAS adios2_f2c)
add_library(adios2::fortran ALIAS adios2_fortran)

if(ADIOS2_HAVE_MPI)
target_compile_definitions(adios2_fortran PRIVATE "$<$<COMPILE_LANGUAGE:Fortran>:ADIOS2_HAVE_MPI_F>")

set(adios2_f2c_mpi_srcs
f2c/adios2_f2c_adios_mpi.cpp
f2c/adios2_f2c_io_mpi.cpp
)
set(adios2_fortran_mpi_srcs
modules/adios2_adios_init_mpi_smod.F90
modules/adios2_io_open_mpi_smod.F90
f2c/adios2_f2c_adios_mpi.cpp
f2c/adios2_f2c_io_mpi.cpp
)

if(ADIOS2_HAVE_FORTRAN_SUBMODULES)
# With submodules we can put MPI implementations in a separate library.
add_library(adios2_f2c_mpi ${adios2_f2c_mpi_srcs})
target_include_directories(adios2_f2c_mpi PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(adios2_f2c_mpi
PUBLIC
adios2_f2c
PRIVATE
adios2_c_mpi
adios2_core_mpi
PUBLIC
MPI::MPI_C
)
set_target_properties(adios2_f2c_mpi PROPERTIES
VERSION ${ADIOS2_LIBRARY_VERSION}
SOVERSION ${ADIOS2_VERSION_MAJOR}
)
set_property(TARGET adios2_f2c_mpi PROPERTY OUTPUT_NAME adios2${ADIOS2_LIBRARY_SUFFIX}_f2c_mpi)

add_library(adios2_fortran_mpi ${adios2_fortran_mpi_srcs})
target_include_directories(adios2_fortran_mpi PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(adios2_fortran_mpi
Expand All @@ -103,6 +144,7 @@ if(ADIOS2_HAVE_MPI)
PRIVATE
adios2_c_mpi
adios2_core_mpi
adios2_f2c_mpi
PUBLIC
MPI::MPI_Fortran
)
Expand All @@ -120,19 +162,23 @@ if(ADIOS2_HAVE_MPI)
target_link_libraries(adios2_fortran PRIVATE adios2_c_mpi adios2_core_mpi)
endif()

set_property(TARGET adios2_f2c_mpi PROPERTY EXPORT_NAME fortran2c_mpi)
target_compile_definitions(adios2_f2c_mpi INTERFACE ADIOS2_USE_MPI)
add_library(adios2::f2c_mpi ALIAS adios2_f2c_mpi)

set_property(TARGET adios2_fortran_mpi PROPERTY EXPORT_NAME fortran_mpi)
target_compile_definitions(adios2_fortran_mpi INTERFACE ADIOS2_USE_MPI)
add_library(adios2::fortran_mpi ALIAS adios2_fortran_mpi)
set(maybe_adios2_fortran_mpi adios2_fortran_mpi)
set(maybe_adios2_fortran_mpi adios2_fortran_mpi adios2_f2c_mpi)
else()
set(maybe_adios2_fortran_mpi)
endif()

add_library(adios2_f INTERFACE)
target_link_libraries(adios2_f INTERFACE ${maybe_adios2_fortran_mpi} adios2_fortran)
target_link_libraries(adios2_f INTERFACE ${maybe_adios2_fortran_mpi} adios2_fortran adios2_f2c)

install(
TARGETS adios2_fortran ${maybe_adios2_fortran_mpi} adios2_f EXPORT adios2FortranExports
TARGETS adios2_f2c adios2_fortran ${maybe_adios2_fortran_mpi} adios2_f EXPORT adios2FortranExports
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT adios2_fortran-runtime
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT adios2_fortran-libraries NAMELINK_COMPONENT adios2_fortran-development
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT adios2_fortran-development
Expand Down

0 comments on commit 8ec2f16

Please sign in to comment.