Skip to content

Conversation

aaroncblack
Copy link
Contributor

The current conduit CMake logic expects lower case fortran modules names. This currently breaks when using the Cray compiler (which produces uppercase name).

This update alters the install logic to install the fortran modules by DIRECTORY rather than a specific FILE list.

@aaroncblack
Copy link
Contributor Author

aaroncblack commented Nov 2, 2023

@BradWhitlock @cyrush Can you eyeball this?

I'm trying to get a working build of conduit with a Cray compiler. Due to some peculiarities of the platform and using a mixed vendor compiler build, I do not have the ability to use the '-ef' flag to have Cray produce lowercase module names.

This PR changes the current INSTALL commands using explicit module names with a single INSTALL using the module directory.

It works, but it does alter the prior design of having the install commands broken out over the blueprint, relay, and core lib cmake logic. It's now a single install command that will copy all files in the fortran module directory that conduit produces, so you lose control over having an explicit file list of fortran modules.

Not sure if conduit produces any fortran modules you don't want available to a downstream library.

@BradWhitlock
Copy link
Member

I tried a build on rzvernal and then linked a Fortran test program against the installed build. It worked and I did not use the -ef flag.

Build

#!/bin/bash

function build_with_hdf5
{
cmake -DBUILD_SHARED_LIBS:BOOL=OFF \
      -DCMAKE_C_COMPILER=/usr/tce/packages/cce/cce-16.0.0-magic/bin/craycc \
      -DCMAKE_CXX_COMPILER=/usr/tce/packages/cce/cce-16.0.0-magic/bin/crayCC \
      -DCMAKE_Fortran_COMPILER=/usr/tce/packages/cce/cce-16.0.0-magic/bin/crayftn \
      -DMPI_C_COMPILER=/opt/cray/pe/mpich/8.1.26/ofi/crayclang/16.0/bin/mpicc \
      -DMPI_CXX_COMPILER=/opt/cray/pe/mpich/8.1.26/ofi/crayclang/16.0/bin/mpicxx \
      -DMPI_Fortran_COMPILER=/opt/cray/pe/mpich/8.1.26/ofi/crayclang/16.0/bin/mpif90 \
      -DCMAKE_C_FLAGS="-fPIC" \
      -DCMAKE_CXX_FLAGS="-std=c++14 -fPIC" \
      -DCMAKE_Fortran_FLAGS="-fPIC" \
      -DCMAKE_EXE_LINKER_FLAGS="-Wl,-rpath,/opt/cray/pe/mpich/8.1.26/gtl/lib,-rpath,/opt/rocm-5.5.1/lib,-rpath,/opt/cray/pe/cce/16.0.0/cce-clang/x86_64/lib,-rpath,/opt/cray/pe/gcc/10.3.0/snos/lib64,-rpath,/opt/cray/pe/cc
e/16.0.0/cce-clang/x86_64/lib/x86_64-unknown-linux-gnu/" \
      -DCMAKE_BUILD_TYPE:STRING=Release \
      -DCMAKE_INSTALL_PREFIX:PATH=/usr/WS2/whitlocb/DT/conduit_fortran/conduit/install_rzvernal \
      -DENABLE_MPI=ON \
      -DENABLE_FORTRAN=ON \
      -DENABLE_DOCS=OFF \
      -DHDF5_DIR=/usr/workspace/teton/libraries/20230922/linux-rhel8-zen3/cce-16.0.0-magic/hdf5-1.12.2-bfor4lxuq3n2dffo7dse6ydhbrgxrw37 \
      ../src
}

build_with_hdf5

Test program

program use_conduit
    use iso_c_binding
    use conduit
    use conduit_blueprint
    use conduit_blueprint_mesh

    type(C_PTR) :: n
    type(C_PTR) :: ntopo
    integer(C_SIZE_T) :: dims(3)
    data dims/4,4,4/

    n = conduit_node_create()
    ntopo = conduit_node_create()
    
    call conduit_blueprint_mesh_examples_braid("hexs",dims(1),dims(2),dims(3),n)

    ntopo = conduit_node_fetch(n,"topologies/mesh")

    call conduit_node_print(ntopo)

    call conduit_node_destroy(n)
    call conduit_node_destroy(ntopo)
end program

Test program CMakeLists.txt

cmake_minimum_required(VERSION 3.23)

set(CMAKE_C_COMPILER /usr/tce/packages/cce/cce-16.0.0-magic/bin/craycc)
set(CMAKE_CXX_COMPILER /usr/tce/packages/cce/cce-16.0.0-magic/bin/crayCC)
set(CMAKE_Fortran_COMPILER /usr/tce/packages/cce/cce-16.0.0-magic/bin/crayftn)
project(test C CXX Fortran)
find_package(Conduit
             PATHS /usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/lib/cmake/conduit)
add_executable(test test.f90)
target_link_libraries(test conduit::conduit_mpi)

My only criticism would be that all modules get installed, even the ones for Conduit test programs.

rzvernal33{whitlocb}128: find /usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal -name "*.mod"
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/CONDUIT_ENDIANNESS_ENUM.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/CONDUIT.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/CONDUIT_OBJ.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/CONDUIT_BLUEPRINT.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/CONDUIT_BLUEPRINT_MCARRAY.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/CONDUIT_BLUEPRINT_MESH.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/CONDUIT_BLUEPRINT_TABLE.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/F_TYPE_SIZES.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/T_F_CONDUIT_SMOKE.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/F_CONDUIT_NODE.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/T_F_CONDUIT_NODE_DATATYPE.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/F_CONDUIT_NODE_INT32.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/F_CONDUIT_NODE_FLOAT64.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/F_CONDUIT_NODE_CHAR8_STR.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/F_CONDUIT_INTRO_FTN_EXAMPLE.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/F_CONDUIT_NODE_OBJ.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/CONDUIT_RELAY.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/T_F_BLUEPRINT_SMOKE.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/T_F_BLUEPRINT_TABLE.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/T_F_BLUEPRINT_MESH.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/T_F_BLUEPRINT_MCARRAY.mod
/usr/WS2/whitlocb/DT/conduit_fortran/aaron/conduit/install_rzvernal/include/conduit/T_F_RELAY_SMOKE.mod

@cyrush
Copy link
Member

cyrush commented Nov 2, 2023

I hoped that CMake would give us a way to inspect the names of the generated modules, but not sure that exists given general discussion about installing fortran modules:

https://gitlab.kitware.com/cmake/cmake/-/issues/19608

We could look for both upper and lowercase version for each lib we care about?

Your current solution might be the best compromise even if the modules for tests have to go along for the ride

@aaroncblack aaroncblack closed this Nov 2, 2023
@aaroncblack aaroncblack deleted the feature/aaroncblack/support_case_insensitive_fortran_modules branch November 2, 2023 23:29
@aaroncblack aaroncblack restored the feature/aaroncblack/support_case_insensitive_fortran_modules branch November 6, 2023 23:24
@aaroncblack aaroncblack reopened this Nov 6, 2023
@aaroncblack
Copy link
Contributor Author

Re-opened this, as I couldn't find a better implementation that worked.

@cyrush
Copy link
Member

cyrush commented Nov 7, 2023

@aaroncblack thanks for testing out these solutions and helping us converge.

@cyrush cyrush merged commit 746826b into LLNL:develop Nov 7, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants