1#-----------------------------------------------
2# Ctest driver for siconos install.
3# Target : continuous integration on gitlab-ci,
4# aims at providing a proper install of siconos for a given configuration.
5#
6# Input variables :
7# - SICONOS_INSTALL_DIR : where to install siconos. Default : /home/install-siconos
8# - USER_FILE : user option file used by cmake to configure siconos. Default : siconos_conf.cmake.
9#   Warning : always searched in siconos-tutorials/ci directory.
10#   using common commands (lsb_release ...)
11# ----------------------------------------------
12
13
14message("--- Start conf for siconos ctest pipeline.")
15
16# ============= setup  ================
17
18# -- CI_PROJECT_DIR is a required environment variable --
19# --> set by default for gitlab-ci, even inside the docker container
20# --> unknown in docker container run with travis/siconos pipeline.
21
22if(DEFINED ENV{TRAVIS})
23  if($ENV{TRAVIS} STREQUAL true)
24    set(CI_TRAVIS ON)
25    set(ENV{CI_PROJECT_DIR} ${CTEST_SOURCE_DIRECTORY})
26  endif()
27elseif(DEFINED ENV{GITLAB_CI})
28  if($ENV{GITLAB_CI} STREQUAL true)
29    set(CI_GITLAB ON)
30  endif()
31endif()
32
33if(NOT DEFINED ENV{CI_PROJECT_DIR} )
34  message(FATAL_ERROR "Please set env variable CI_PROJECT_DIR to siconos sources directory (git repo).")
35endif()
36
37# -- Definition of all variables required for ctest --
38include($ENV{CI_PROJECT_DIR}/ci_gitlab/ctest_tools.cmake)
39if(CI_TRAVIS)
40  list(APPEND CMAKE_MODULE_PATH ${CTEST_SOURCE_DIRECTORY}/ci_travis/cmake)
41  list(APPEND CMAKE_MODULE_PATH ${CTEST_SOURCE_DIRECTORY}/ci_travis/config)
42  list(APPEND CMAKE_MODULE_PATH ${CTEST_SOURCE_DIRECTORY}/ci_travis)
43  include(Tools)
44
45  # -- Get config --
46  # i.e. set extra options/values (cmake -Doption=value ...)
47  # either from file default.cmake or
48  # from file CI_CONFIG.cmake
49  # --> may set SICONOS_CMAKE_OPTIONS
50  # --> may set DSICONOS_COMPONENTS
51  # Rq : For Travis CI, we include cmake files while for gitlab CI we use
52  # siconos user option file. Todo: one way to rule them all?
53
54  if(CI_CONFIG)
55    string(REPLACE "," ";" CI_CONFIG_LIST ${CI_CONFIG})
56    foreach(_CI IN LISTS CI_CONFIG_LIST)
57      include(${_CI})
58    endforeach()
59  else()
60    set(CI_CONFIG default)
61    include(${CI_CONFIG})
62  endif()
63endif()
64
65# - Source dir and path to siconos install
66if(NOT CTEST_SOURCE_DIRECTORY)
67  set(CTEST_SOURCE_DIRECTORY $ENV{CI_PROJECT_DIR})
68endif()
69
70# - Top level build directory -
71# If not specified : current dir.
72if(NOT CTEST_BINARY_DIRECTORY)
73  set(CTEST_BINARY_DIRECTORY .)
74endif()
75
76# Install dir (used as CMAKE_INSTALL_PREFIX)
77if(NOT SICONOS_INSTALL_DIR)
78  set(SICONOS_INSTALL_DIR /home/install-siconos/)
79endif()
80# Build name (for cdash)
81if(NOT CTEST_BUILD_NAME)
82  set_cdash_build_name()
83endif()
84
85if(USER_FILE)
86  list(APPEND SICONOS_CMAKE_OPTIONS -DUSER_OPTIONS_FILE=${USER_FILE})
87endif()
88
89list(APPEND SICONOS_CMAKE_OPTIONS -DCMAKE_INSTALL_PREFIX=${SICONOS_INSTALL_DIR})
90list(APPEND SICONOS_CMAKE_OPTIONS -DWITH_GIT=ON) # required to generate siconos-commit.txt to tag cdash build in the examples.
91
92if(DEFINED ENV{OCE_INSTALL}) # set if oce has been installed using oce repo, in install_oce.sh
93  message("Search oce in $ENV{OCE_INSTALL}.")
94  list(APPEND SICONOS_CMAKE_OPTIONS -DOCE_DIR=$ENV{OCE_INSTALL})
95endif()
96
97# Parallel build only for siconos_install. For examples it leads to: warning: jobserver unavailable: using -j1. Add `+' to parent make rule.
98#set(CTEST_MEMORYCHECK_SUPPRESSIONS_FILE ${CTEST_SOURCE_DIRECTORY}/cmake/valgrind.supp)
99
100if(NOT CTEST_CMAKE_GENERATOR)
101  set(CTEST_CMAKE_GENERATOR "Unix Makefiles")
102endif()
103
104if(NOT CTEST_SITE)
105  set_site_name()
106endif()
107
108if(NOT CTEST_BUILD_CONFIGURATION)
109  set(CTEST_BUILD_CONFIGURATION "Release")
110endif()
111
112
113# Write a note file for cdash server.
114# Content :
115# - info. regarding the runner, the system
116# - siconos config (user option file)
117write_notes()
118
119# =============  Run ctest steps ================
120# Either one by one (to split ci jobs) if CTEST_MODE=Configure, Build, Test or
121# all in a row if CTEST_MODE=all.
122# Submit : only after test phase except if conf or build failed.
123
124# - Configure --
125if(${CTEST_MODE} STREQUAL "Configure" OR ${CTEST_MODE} STREQUAL "all")
126
127  # Current testing model. Priority:
128  # Nightly -> set by scheduler on gricad-gitlab
129  # Continuous -> set in .gitlab-ci.yml
130  # Experimental : default
131  if(NOT model)
132    set(model Experimental)
133  endif()
134
135  ctest_start(${model})
136
137  # Set CTEST_CONFIGURE_COMMAND to cmake followed by siconos options
138  set(CTEST_CONFIGURE_COMMAND ${CMAKE_COMMAND})
139  foreach(option IN LISTS SICONOS_CMAKE_OPTIONS)
140    set(CTEST_CONFIGURE_COMMAND "${CTEST_CONFIGURE_COMMAND} ${option}")
141  endforeach()
142  set(CTEST_CONFIGURE_COMMAND "${CTEST_CONFIGURE_COMMAND} ${CTEST_SOURCE_DIRECTORY}")
143
144  message("\n\n=============== Start ctest_configure =============== ")
145  message("- Configure command line :\n ${CTEST_CONFIGURE_COMMAND}\n")
146
147  ctest_configure(
148    RETURN_VALUE _RESULT
149    CAPTURE_CMAKE_ERROR _STATUS
150    #QUIET
151    )
152  post_ctest(PHASE Configure)
153endif()
154
155# - Build -
156if(${CTEST_MODE} STREQUAL "Build" OR ${CTEST_MODE} STREQUAL "all")
157
158  if(${CTEST_MODE} STREQUAL "Build")
159    ctest_start(APPEND) # Restart from existing (configure step) cdash config
160  endif()
161  # --- Build ---
162
163  message("\n\n=============== Start ctest_build =============== ")
164
165  cmake_host_system_information(RESULT NP QUERY NUMBER_OF_LOGICAL_CORES)
166  if(NOT ALLOW_PARALLEL_BUILD)
167    set(NP 1)
168  endif()
169  ctest_build(
170    FLAGS -j${NP}
171    CAPTURE_CMAKE_ERROR _STATUS
172    RETURN_VALUE _RESULT
173    #QUIET if quiet, travis failed because of missing outputs during a long time ...
174    )
175  post_ctest(PHASE Build)
176endif()
177
178# - Test -
179if(${CTEST_MODE} STREQUAL "Test" OR ${CTEST_MODE} STREQUAL "all")
180  # -- Tests --
181
182  if(${CTEST_MODE} STREQUAL "Test")
183    ctest_start(APPEND)
184  endif()
185  message("\n\n=============== Start ctest_test (nbprocs = ${NP}) =============== ")
186  ctest_test(
187    #PARALLEL_LEVEL NP
188    CAPTURE_CMAKE_ERROR _STATUS
189    #SCHEDULE_RANDOM ON
190    RETURN_VALUE _RESULT
191    # QUIET
192    )
193  post_ctest(PHASE Test)
194
195  if(WITH_MEMCHECK AND CTEST_COVERAGE_COMMAND)
196    #find_program(CTEST_COVERAGE_COMMAND NAMES gcov)
197    # set(CTEST_COVERAGE_COMMAND gcov)
198
199    ctest_coverage(
200      CAPTURE_CMAKE_ERROR COVERAGE_STATUS
201      RETURN_VALUE COVERAGE_RESULT
202      )
203  endif()
204
205  if(WITH_MEMCHECK AND CTEST_MEMORYCHECK_COMMAND)
206    ctest_memcheck()
207  endif()
208
209  if(CDASH_SUBMIT)
210    ctest_submit(
211      RETURN_VALUE RETURN_STATUS
212      CAPTURE_CMAKE_ERROR SUBMISSION_STATUS
213      )
214    if(NOT SUBMISSION_STATUS EQUAL 0)
215      message(WARNING " *** submission failure *** ")
216    endif()
217  endif()
218
219  # -- memory check -- Skip this to 'enlight' submit process, since cdash inria is overbooked ...
220  # if(CTEST_BUILD_CONFIGURATION MATCHES "Profiling")
221  #   find_program(CTEST_MEMORYCHECK_COMMAND NAMES valgrind)
222  #   set(CTEST_MEMORYCHECK_COMMAND_OPTIONS "--quiet --leak-check=full --show-leak-kinds=definite,possible --track-origins=yes --error-limit=no --gen-suppressions=all")
223  #   set(CTEST_MEMORYCHECK_COMMAND_OPTIONS "--quiet --leak-check=full --show-reachable=yes --error-limit=no --gen-suppressions=all")
224  #   ctest_memcheck(PARALLEL_LEVEL NP QUIET)
225  # endif()
226
227endif()
228
229
230# ============= Summary =============
231message(STATUS "\n============================================ Summary ============================================")
232message(STATUS "CTest process for Siconos has ended.")
233message(STATUS "Ctest model is: ${model}")
234message(STATUS "Ctest mode was: ${CTEST_MODE}")
235message(STATUS "Ctest executed on sources directory : ${CTEST_SOURCE_DIRECTORY}")
236message(STATUS "CTEST_BINARY_DIRECTORY is: ${CTEST_BINARY_DIRECTORY}")
237message(STATUS "CTEST_BUILD_CONFIGURATION is: ${CTEST_BUILD_CONFIGURATION}")
238if(CDASH_SUBMIT)
239  message(STATUS "Cdash server name: ${CTEST_DROP_SITE}/${CTEST_DROP_LOCATION}.")
240  message(STATUS "Cdash build name: ${CTEST_BUILD_NAME}")
241  message(STATUS "Cdash Site name: ${CTEST_SITE}")
242endif()
243message(STATUS "=================================================================================================\n")
244