From ff0b2e5de44649c9dfb147f19cab7375dfc2833d Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Tue, 13 Mar 2018 15:06:46 +0100
Subject: [PATCH] Remove CMake generated main function file

---
 cmake/modules/CMakeLists.txt                  |  5 ++-
 cmake/modules/DunePerftoolMacros.cmake        | 13 +++----
 cmake/modules/StandardMain.cmake              | 34 -------------------
 python/dune/perftool/generation/cpp.py        |  2 +-
 .../dune/perftool/pdelab/driver/__init__.py   | 10 ++++--
 5 files changed, 17 insertions(+), 47 deletions(-)
 delete mode 100644 cmake/modules/StandardMain.cmake

diff --git a/cmake/modules/CMakeLists.txt b/cmake/modules/CMakeLists.txt
index 415cd9c6..85e38089 100644
--- a/cmake/modules/CMakeLists.txt
+++ b/cmake/modules/CMakeLists.txt
@@ -1,2 +1,5 @@
-install(FILES DunePerftoolMacros.cmake
+install(FILES deplist.py
+              DunePerftoolMacros.cmake
+              GeneratedSystemtest.cmake
+              perftool_sourcepath.py
         DESTINATION ${DUNE_INSTALL_MODULEDIR})
diff --git a/cmake/modules/DunePerftoolMacros.cmake b/cmake/modules/DunePerftoolMacros.cmake
index 8c8aa346..ca33bfae 100644
--- a/cmake/modules/DunePerftoolMacros.cmake
+++ b/cmake/modules/DunePerftoolMacros.cmake
@@ -96,23 +96,18 @@ function(add_generated_executable)
   endif()
   if(NOT GEN_SOURCE)
     # Generate a driver file
-    set(GEN_DRIVER ${GEN_TARGET}_driver.hh)
-    add_custom_command(OUTPUT ${GEN_DRIVER}
+    set(GEN_SOURCE ${GEN_TARGET}_driver.cc)
+    add_custom_command(OUTPUT ${GEN_SOURCE}
                        COMMAND ${CMAKE_BINARY_DIR}/run-in-dune-env generate_driver
                                --uflfile ${GEN_UFLFILE}
                                --ini-file ${GEN_INIFILE}
                                --target-name ${GEN_TARGET}
-                               --driver-file ${GEN_DRIVER}
+                               --driver-file ${GEN_SOURCE}
                                --project-basedir ${CMAKE_BINARY_DIR}
                                ${GEN_FORM_COMPILER_ARGS}
                        DEPENDS ${GEN_UFLFILE} ${UFL2PDELAB_SOURCES} ${GEN_DEPENDS} ${DUNE_PERFTOOL_ADDITIONAL_PYTHON_SOURCES}
                        COMMENT "Generating driver for the target ${GEN_TARGET}"
                        )
-    set(GEN_SOURCE ${GEN_TARGET}_main.cc)
-    dune_module_path(MODULE dune-perftool
-                     RESULT perftool_path
-                     CMAKE_MODULES)
-    configure_file(${perftool_path}/StandardMain.cmake ${GEN_SOURCE})
   endif()
   if(GEN_EXCLUDE_FROM_ALL)
     set(GEN_EXCLUDE_FROM_ALL "EXCLUDE_FROM_ALL")
@@ -143,7 +138,7 @@ function(add_generated_executable)
     set(header_deps ${header_deps} ${depdata___${op}})
   endforeach()
 
-  add_executable(${GEN_TARGET} ${GEN_EXCLUDE_FROM_ALL} ${GEN_SOURCE} ${GEN_DRIVER} ${header_deps})
+  add_executable(${GEN_TARGET} ${GEN_EXCLUDE_FROM_ALL} ${GEN_SOURCE} ${header_deps})
   target_include_directories(${GEN_TARGET} PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
   add_dependencies(generation ${GEN_TARGET})
 endfunction()
diff --git a/cmake/modules/StandardMain.cmake b/cmake/modules/StandardMain.cmake
deleted file mode 100644
index 028c2efc..00000000
--- a/cmake/modules/StandardMain.cmake
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <dune/common/parallel/mpihelper.hh>
-#include <dune/common/exceptions.hh>
-
-#include"@GEN_DRIVER@"
-
-int main(int argc, char** argv)
-{
-  try{
-    //Maybe initialize Mpi
-    Dune::MPIHelper& helper = Dune::MPIHelper::instance(argc, argv);
-    if(Dune::MPIHelper::isFake)
-      std::cout<< "This is a sequential program." << std::endl;
-    else
-      std::cout<<"I am rank "<<helper.rank()<<" of "<<helper.size()
-        <<" processes!"<<std::endl;
-
-    if (driver(argc, argv))
-      return 1;
-    else
-      return 0;
-  }
-  catch (Dune::Exception &e){
-    std::cerr << "Dune reported error: " << e << std::endl;
-    return 1;
-  }
-  catch (...){
-    std::cerr << "Unknown exception thrown!" << std::endl;
-    return 1;
-  }
-}
diff --git a/python/dune/perftool/generation/cpp.py b/python/dune/perftool/generation/cpp.py
index 0f44b695..858dc1fc 100644
--- a/python/dune/perftool/generation/cpp.py
+++ b/python/dune/perftool/generation/cpp.py
@@ -18,7 +18,7 @@ template_parameter = generator_factory(item_tags=("template_param",), context_ta
 class_basename = generator_factory(item_tags=("basename",), context_tags=("classtag",))
 
 
-@generator_factory(item_tags=("file", "include"), context_tags=("filetag",))
+@generator_factory(item_tags=("file", "include"), context_tags=("filetag",), counted=True)
 def include_file(include, system=False):
     return cgen.Include(include, system=system)
 
diff --git a/python/dune/perftool/pdelab/driver/__init__.py b/python/dune/perftool/pdelab/driver/__init__.py
index 5b768b14..c859c99d 100644
--- a/python/dune/perftool/pdelab/driver/__init__.py
+++ b/python/dune/perftool/pdelab/driver/__init__.py
@@ -232,6 +232,12 @@ def check_parallel_execution():
 
 
 def generate_driver():
+    # Guarantee that config.h is the very first include in the generated file
+    include_file("config.h", filetag="driver")
+
+    # Make sure that the MPI helper is instantiated
+    name_mpihelper()
+
     # Add check to c++ file if this program should only be used in parallel mode
     if get_option("parallel"):
         check_parallel_execution()
@@ -273,7 +279,7 @@ def generate_driver():
 
     from dune.perftool.generation import retrieve_cache_items
     from cgen import FunctionDeclaration, FunctionBody, Block, Value, LineComment, Line
-    driver_signature = FunctionDeclaration(Value('bool', 'driver'), [Value('int', 'argc'), Value('char**', 'argv')])
+    driver_signature = FunctionDeclaration(Value('int', 'main'), [Value('int', 'argc'), Value('char**', 'argv')])
 
     contents = []
 
@@ -327,7 +333,7 @@ def generate_driver():
     filename = get_option("driver_file")
 
     from dune.perftool.file import generate_file
-    generate_file(filename, "driver", [driver])
+    generate_file(filename, "driver", [driver], headerguard=False)
 
     # Reset the caching data structure
     from dune.perftool.generation import delete_cache_items
-- 
GitLab