diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index b8f818bd..e424a5c8 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -17,6 +17,7 @@ jobs: os: [ubuntu-latest] dockerfile: - Dockerfile + - Dockerfile.memcheck - Dockerfile.fortran-intel - Dockerfile.fortran-gcc - Dockerfile.fortran-nvhpc diff --git a/CMakeLists.txt b/CMakeLists.txt index 09787a97..d8feaf55 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ option(MUSICA_ENABLE_INSTALL "Install the musica library" ON) option(MUSICA_ENABLE_TESTS "Builds tests that ensures each enabled MUSICA component can be used" ON) option(MUSICA_ENABLE_MPI "Enable MPI parallel support" OFF) option(MUSICA_ENABLE_OPENMP "Enable OpemMP support" OFF) +option(MUSICA_ENABLE_MEMCHECK "Enable memory checking" OFF) cmake_dependent_option( MUSICA_ENABLE_TUVX "Builds TUV-x, a photolysis calculator library" ON "MUSICA_BUILD_FORTRAN_INTERFACE" OFF) diff --git a/cmake/test_util.cmake b/cmake/test_util.cmake index 6e74d9e8..17a1194e 100644 --- a/cmake/test_util.cmake +++ b/cmake/test_util.cmake @@ -64,23 +64,23 @@ function(add_musica_test test_name test_binary test_args working_dir) COMMAND ${test_binary} ${test_args} WORKING_DIRECTORY ${working_dir}) endif() - # set(MEMORYCHECK_COMMAND_OPTIONS "--error-exitcode=1 --trace-children=yes --leak-check=full --gen-suppressions=all ${MEMCHECK_SUPPRESS}") - # set(memcheck "${MEMORYCHECK_COMMAND} ${MEMORYCHECK_COMMAND_OPTIONS}") - # separate_arguments(memcheck) - # if(MUSICA_ENABLE_MPI AND MEMORYCHECK_COMMAND AND MUSICA_ENABLE_MEMCHECK) - # add_test(NAME memcheck_${test_name} - # COMMAND mpirun -v -np 2 ${memcheck} ${CMAKE_BINARY_DIR}/${test_binary} ${test_args} - # WORKING_DIRECTORY ${working_dir}) + set(MEMORYCHECK_COMMAND_OPTIONS "--error-exitcode=1 --trace-children=yes --leak-check=full --gen-suppressions=all ${MEMCHECK_SUPPRESS}") + set(memcheck "${MEMORYCHECK_COMMAND} ${MEMORYCHECK_COMMAND_OPTIONS}") + separate_arguments(memcheck) + if(MUSICA_ENABLE_MPI AND MEMORYCHECK_COMMAND AND MUSICA_ENABLE_MEMCHECK) + add_test(NAME memcheck_${test_name} + COMMAND mpirun -v -np 2 ${memcheck} ${CMAKE_BINARY_DIR}/${test_binary} ${test_args} + WORKING_DIRECTORY ${working_dir}) - # # add dependency between memcheck and previous test - # # https://stackoverflow.com/a/66931930/5217293 - # set_tests_properties(${test_name} PROPERTIES FIXTURES_SETUP f_${test_name}) - # set_tests_properties(memcheck_${test_name} PROPERTIES FIXTURES_REQUIRED f_${test_name}) - # elseif(MEMORYCHECK_COMMAND AND MUSICA_ENABLE_MEMCHECK) - # add_test(NAME memcheck_${test_name} - # COMMAND ${memcheck} ${CMAKE_BINARY_DIR}/${test_binary} ${test_args} - # WORKING_DIRECTORY ${working_dir}) - # endif() + # add dependency between memcheck and previous test + # https://stackoverflow.com/a/66931930/5217293 + set_tests_properties(${test_name} PROPERTIES FIXTURES_SETUP f_${test_name}) + set_tests_properties(memcheck_${test_name} PROPERTIES FIXTURES_REQUIRED f_${test_name}) + elseif(MEMORYCHECK_COMMAND AND MUSICA_ENABLE_MEMCHECK) + add_test(NAME memcheck_${test_name} + COMMAND ${memcheck} ${CMAKE_BINARY_DIR}/${test_binary} ${test_args} + WORKING_DIRECTORY ${working_dir}) + endif() endfunction(add_musica_test) ################################################################################ diff --git a/docker/Dockerfile b/docker/Dockerfile index e0be1cd1..72e3d2a9 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -24,7 +24,6 @@ COPY . musica RUN cd musica \ && cmake -S . \ -B build \ - -D ENABLE_TESTS=ON \ && cd build \ && make install -j 8 diff --git a/docker/Dockerfile.memcheck b/docker/Dockerfile.memcheck new file mode 100644 index 00000000..516f023f --- /dev/null +++ b/docker/Dockerfile.memcheck @@ -0,0 +1,31 @@ +FROM fedora:35 + +RUN dnf -y update \ + && dnf -y install \ + cmake \ + gcc-c++ \ + gcc-gfortran \ + gdb \ + git \ + lcov \ + make \ + netcdf-fortran-devel \ + json-devel \ + valgrind \ + && dnf clean all + +# Set environment variables +ENV FC=gfortran + +# Copy the musica code +COPY . musica + +# Build +RUN cd musica \ + && cmake -S . \ + -B build \ + -D MUSICA_ENABLE_MEMCHECK=ON \ + && cd build \ + && make install -j 8 + +WORKDIR musica/build