1######################################################################
2## ctest_script.cmake
3## This file is part of the G+Smo library.
4## https://raw.githubusercontent.com/gismo/gismo/stable/cmake/ctest_script.cmake
5##
6## Author: Angelos Mantzaflaris
7######################################################################
8
9######################################################################
10##
11## To execute:
12##
13##   ctest -S ctest_script.cmake
14##
15## The script creates sources and build folders in the same directory
16##
17## For more verbosity add the flag
18##
19##   ctest -S /path/to/ctest_script.cmake -V
20##
21## or even -VV.
22##
23## Options can be passed by arguments (default options are displayed here):
24## NOTE: Line wrap can be done under Linux/macOS with \, under Windows with ^
25##
26## ctest -S ctest_script.cmake -D CTEST_TEST_MODEL=Experimental \
27##   -D CTEST_CONFIGURATION_TYPE=Release -D CTEST_BUILD_JOBS=8 \
28##   -D CTEST_CMAKE_GENERATOR="Unix Makefiles" -D CNAME=gcc -D CXXNAME=g++ \
29##   -D CTEST_TEST_TIMEOUT=100 -D CTEST_MEMORYCHECK_TYPE=Valgrind \
30##   -D DO_COVERAGE=TRUE
31##
32## Different dashboard projects and subprojects are possible:
33##
34## ctest -S /path/to/ctest_script.cmake -D PROJECT_NAME=myGismo \
35##   -D CTEST_BUILD_JOBS=2 -D CTEST_CMAKE_GENERATOR="Unix Makefiles" \
36##   -D CTEST_TEST_TIMEOUT=100 -D LABELS_FOR_SUBPROJECTS='gismo;examples;unittests' \
37##   -D CTEST_SOURCE_DIRECTORY=./gismo_src -D CTEST_BINARY_DIRECTORY=./build
38##
39## On linux this script can be invoked in a cronjob. e.g.:
40##    $ crontab -e
41## Add the line:
42##    0 3 * * * ctest -S /path/toctest_script.cmake -D CTEST_TEST_MODEL=Nightly -Q
43## save and exit. Now with
44##    $ crontab -l
45## you can see the scheduled task. The script will
46## be executed every night at 03:00am.
47##
48######################################################################
49
50######################################################################
51##
52## Complete Options List:
53##
54## ctest parameters: (ctest -D ...)
55##   CMAKE_ARGS
56##   CNAME
57##   CTEST_BINARY_DIRECTORY
58##   CTEST_BUILD_JOBS
59##   CTEST_BUILD_NAME
60##   CTEST_CMAKE_GENERATOR
61##   CTEST_CONFIGURATION_TYPE
62##   CTEST_COVERAGE_COMMAND
63##   CTEST_MEMORYCHECK_TYPE
64##   CTEST_SITE
65##   CTEST_SOURCE_DIRECTORY
66##   CTEST_TEST_JOBS
67##   CTEST_TEST_MODEL
68##   CTEST_TEST_TIMEOUT
69##   CXXNAME
70##   DO_COVERAGE
71##   DO_TESTS
72##   DROP_LOCATION
73##   DROP_METHOD
74##   DROP_SITE
75##   EMPTY_BINARY_DIRECTORY
76##   GISMO_BRANCH
77##   GISMO_SUBMODULES
78##   LABELS_FOR_SUBPROJECTS
79##   PROJECT_NAME
80##   UPDATE_REPO
81##   UPDATE_MODULES
82##   UPDATE_TYPE
83##
84## Environment
85##   CFLAGS
86##   CXXFLAGS
87##   LDFLAGS
88##
89######################################################################
90
91cmake_minimum_required(VERSION 2.8.12)
92
93if (POLICY CMP0048)# CMake 3.0
94  cmake_policy(SET CMP0011 NEW)
95  cmake_policy(SET CMP0042 NEW)
96  cmake_policy(SET CMP0048 NEW)
97endif()
98
99if (POLICY CMP0054)# CMake 3.1
100  cmake_policy(SET CMP0054 NEW)
101endif()
102
103if (POLICY CMP0053)# CMake 3.1.3
104  cmake_policy(SET CMP0053 NEW)
105endif()
106
107if (POLICY CMP0063)# CMake 3.3
108  cmake_policy(SET CMP0063 NEW)
109endif()
110
111## #################################################################
112## Configuration
113## #################################################################
114
115#set(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS           "200" )
116#set(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS         "500" )
117#set(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE    "104857600") # 100 MB
118#set(CTEST_CUSTOM_COVERAGE_EXCLUDE                   "")
119
120if (DEFINED KEEPCONFIG)
121  message(STATUS "Building in the current directory")
122endif()
123
124# Test model (Nightly, Continuous, Experimental)
125if (NOT DEFINED CTEST_TEST_MODEL)
126  set(CTEST_TEST_MODEL Experimental)
127endif()
128
129# Configuration type (Debug Release RelWithDebInfo MinSizeRel)
130if (NOT DEFINED CTEST_CONFIGURATION_TYPE AND NOT DEFINED KEEPCONFIG)
131  set(CTEST_CONFIGURATION_TYPE Release)
132endif()
133
134# Number of jobs for build/test (later on)
135#set(CTEST_BUILD_JOBS 8)
136#set(CTEST_TEST_JOBS 10)
137
138# Tip for C/C++ compilers
139# e.g. "cc/g++", "icc/icpc", "clang/clang++", "mpicc/mpic++", cl.exe/cl.exe
140#set(CNAME cc)
141#set(CXXNAME g++)
142
143# Test timeout in seconds
144if (NOT DEFINED CTEST_TEST_TIMEOUT)
145  set(CTEST_TEST_TIMEOUT 200)
146  #set(CTEST_TIMEOUT 200)
147endif()
148
149# Dynamic analysis
150#Valgrind, Purify, BoundsChecker. ThreadSanitizer, AddressSanitizer,
151#LeakSanitizer, MemorySanitizer, and UndefinedBehaviorSanitizer.
152if (NOT DEFINED CTEST_MEMORYCHECK_TYPE)
153  set(CTEST_MEMORYCHECK_TYPE "None")
154endif()
155
156# Coverage analysis - only GCC
157# if GCC was changed with CNAME/CXXNAME, CTEST_COVERAGE_COMMAND needs
158# also to be changed
159if (NOT DEFINED DO_COVERAGE)
160  set(DO_COVERAGE FALSE)
161endif()
162
163if (NOT DEFINED DO_TESTS)
164  set(DO_TESTS TRUE)
165endif()
166
167if(DEFINED CNAME)
168  find_program (CC NAMES ${CNAME})
169  set(ENV{CC}  ${CC})
170endif()
171if(DEFINED CXXNAME)
172  find_program (CXX NAMES ${CXXNAME})
173  set(ENV{CXX}  ${CXX})
174endif()
175
176# Other Environment variables and scripts
177#set(ENV{OMP_NUM_THREADS} 3)
178#set(ENV{CXXFLAGS} "-Ofast")
179#execute_process(COMMAND source "/path/to/iccvars.sh intel64")
180#set(ENV{LD_LIBRARY_PATH} /path/to/vendor/lib)
181#set(ENV{MAKEFLAGS} "-j12")
182
183# Build options
184if(NOT DEFINED CMAKE_ARGS)
185  set(CMAKE_ARGS
186    -DGISMO_WARNINGS=OFF
187    -DGISMO_COEFF_TYPE=double
188    -DGISMO_BUILD_LIB=ON
189    #-DCMAKE_CXX_STANDARD=11
190    -DGISMO_BUILD_EXAMPLES=ON
191    -DGISMO_BUILD_UNITTESTS=ON
192    #-DGISMO_WITH_OPENMP=ON
193    #-DGISMO_WITH_MPI=ON
194    #-DGISMO_WITH_SPECTRA=ON
195    #-DGISMO_WITH_IPOPT=ON -DIpOpt_DIR=/path/to/ipopt
196    #-DGISMO_WITH_PSOLID=ON -DParasolid_DIR=/path/to/parasolid
197    #-DGISMO_BUILD_AXL=ON -DAxel_DIR=/path/to/axel
198    -DGISMO_WITH_ONURBS=ON
199    -DGISMO_WITH_TRILINOS=OFF
200    -DGISMO_WITH_SPECTRA=OFF
201    -DGISMO_EXTRA_DEBUG=OFF
202    -DGISMO_BUILD_PCH=OFF
203    #-DGISMO_PLAINDOX=ON
204    -DNOSNIPPETS=OFF
205    )
206endif()
207
208# Source folder (defaults inside the script directory)
209if(NOT DEFINED CTEST_SOURCE_DIRECTORY)
210  if(EXISTS ${CTEST_SCRIPT_DIRECTORY}/gismoConfig.cmake.in
211      AND EXISTS ${CTEST_SCRIPT_DIRECTORY}/../CMakeLists.txt)
212    get_filename_component(CTEST_SOURCE_DIRECTORY ${CTEST_SCRIPT_DIRECTORY} DIRECTORY)
213  else()
214    set(CTEST_SOURCE_DIRECTORY ${CTEST_SCRIPT_DIRECTORY}/gismo_src)
215  endif()
216endif()
217
218# Build folder (defaults next to source directory)
219if(NOT DEFINED CTEST_BINARY_DIRECTORY)
220  if (DEFINED KEEPCONFIG)
221    set(CTEST_BINARY_DIRECTORY ./)
222  else()
223    get_filename_component(base_dir ${CTEST_SOURCE_DIRECTORY} DIRECTORY)
224    get_filename_component(cnamewe "${CXXNAME}" NAME_WE)
225    set(CTEST_BINARY_DIRECTORY ${base_dir}/build_${CTEST_TEST_MODEL}${CTEST_CONFIGURATION_TYPE}_${cnamewe})
226  endif()
227endif()
228
229if (DEFINED KEEPCONFIG)
230  ctest_read_custom_files(${CTEST_BINARY_DIRECTORY})
231endif()
232
233# Empty previous directory before building (otherwise builds are incremental)
234if(EMPTY_BINARY_DIRECTORY)
235  ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
236endif()
237
238# The Generator for CMake
239# ("Unix Makefiles", "Ninja", "Xcode", "NMake Makefiles", "NMake Makefiles JOM",
240#  "MinGW Makefiles", "Visual Studio 12 2013", "Visual Studio 14 2015",
241#  "Visual Studio 14 2015 Win64", and so on)
242if (NOT DEFINED CTEST_CMAKE_GENERATOR)
243  file(WRITE ${CTEST_BINARY_DIRECTORY}/cgtest/CMakeLists.txt "message(\"\${CMAKE_GENERATOR}\")\n")
244  execute_process(COMMAND ${CMAKE_COMMAND} -Wno-dev .
245    ERROR_VARIABLE CTEST_CMAKE_GENERATOR
246    OUTPUT_QUIET
247    WORKING_DIRECTORY ${CTEST_BINARY_DIRECTORY}/cgtest/
248    ERROR_STRIP_TRAILING_WHITESPACE)
249endif()
250
251if(NOT DEFINED KEEPCONFIG)
252# Cleanup previous tests, settings and test data
253file(REMOVE_RECURSE ${CTEST_BINARY_DIRECTORY}/bin)
254file(REMOVE ${CTEST_BINARY_DIRECTORY}/CMakeCache.txt)
255file(REMOVE_RECURSE ${CTEST_BINARY_DIRECTORY}/Testing)
256endif()
257
258if (DO_COVERAGE)
259  if(NOT DEFINED CTEST_COVERAGE_COMMAND)
260    find_program(CTEST_COVERAGE_COMMAND NAMES gcov)
261  endif()
262  set(CTEST_CUSTOM_COVERAGE_EXCLUDE "${CTEST_SOURCE_DIRECTORY}/external/")
263  set(ENV{CXXFLAGS} "$ENV{CXXFLAGS} -g -O0 --coverage -fprofile-arcs -ftest-coverage")
264  set(ENV{CFLAGS} "$ENV{CFLAGS} -g -O0 --coverage -fprofile-arcs -ftest-coverage")
265endif()
266
267if ("x${CTEST_MEMORYCHECK_TYPE}" STREQUAL "xValgrind")
268  find_program(CTEST_MEMORYCHECK_COMMAND NAMES valgrind)
269  set(MEMORYCHECK_SUPPRESSIONS_FILE "${CTEST_SOURCE_DIRECTORY}/cmake/valgrind_supp.txt")
270  set(MEMORYCHECK_COMMAND_OPTIONS "--error-exitcode=1 --leak-check=yes -q")
271  #--tool=memcheck --show-reachable=yes --num-callers=50 --track-origins=yes --trace-children=yes
272endif()
273
274if("x${CTEST_MEMORYCHECK_TYPE}" STREQUAL "xAddressSanitizer")
275  #See https://github.com/google/sanitizers
276  set(ENV{CXXFLAGS} "$ENV{CXXFLAGS} -fsanitize=address -fno-omit-frame-pointer")
277  set(ENV{LDFLAGS}  "$ENV{LDFLAGS} -fsanitize=address")
278  set(ENV{ASAN_OPTIONS}  "symbolize=1:detect_leaks=1")
279  #find_program(LLVMSYM NAMES llvm-symbolizer) #needed in path
280  #set(ENV{ASAN_SYMBOLIZER_PATH}  "${LLVMSYM}")
281endif()
282if("x${CTEST_MEMORYCHECK_TYPE}" STREQUAL "xLeakSanitizer")#part of AddressSanitizer
283  set(ENV{CXXFLAGS} "$ENV{CXXFLAGS} -fsanitize=leak -fno-omit-frame-pointer")
284  set(ENV{LDFLAGS}  "$ENV{LDFLAGS} -fsanitize=leak")
285  #set(ENV{LSAN_OPTIONS} "suppressions="${CTEST_SOURCE_DIRECTORY}/cmake/asan_supp.txt")
286endif()
287if("x${CTEST_MEMORYCHECK_TYPE}" STREQUAL "xMemorySanitizer")
288  # Note: requires full code (including libc++) compiled with -fsanitize=memory
289  set(ENV{CXXFLAGS} "$ENV{CXXFLAGS} -fsanitize=memory -fno-omit-frame-pointer -fsanitize-memory-track-origins")
290  set(ENV{LDFLAGS}  "$ENV{LDFLAGS} -fsanitize=memory -fsanitize-memory-track-origins")
291  set(ENV{MSAN_OPTIONS}  "symbolize=1")
292  #find_program(LLVMSYM NAMES llvm-symbolizer) #needed in path
293  #set(ENV{MSAN_SYMBOLIZER_PATH}  "${LLVMSYM}")
294endif()
295if("x${CTEST_MEMORYCHECK_TYPE}" STREQUAL "xThreadSanitizer")
296  set(ENV{CXXFLAGS} "$ENV{CXXFLAGS} -fsanitize=thread")
297  set(ENV{LDFLAGS}  "$ENV{LDFLAGS} -fsanitize=thread")
298  #set(ENV{TSAN_OPTIONS} "report_bugs=1")
299endif()
300if("x${CTEST_MEMORYCHECK_TYPE}" STREQUAL "xUndefinedBehaviorSanitizer")
301  set(ENV{CXXFLAGS} "$ENV{CXXFLAGS} -fsanitize=undefined -fno-omit-frame-pointer")
302  set(ENV{LDFLAGS}  "$ENV{LDFLAGS} -fsanitize=undefined")
303  set(ENV{UBSAN_OPTIONS} "print_stacktrace=1")
304endif()
305
306# Update G+Smo from remote (no effect on Continuous builds)
307if (NOT DEFINED UPDATE_REPO)
308  set(UPDATE_REPO ON)
309endif()
310
311# Update type (git, svn, wget or url)
312if (NOT DEFINED UPDATE_TYPE AND NOT DEFINED KEEPCONFIG)
313  set(UPDATE_TYPE git)
314endif()
315
316if (NOT DEFINED GISMO_BRANCH) #for initial checkout
317  set(GISMO_BRANCH stable)
318endif()
319
320# Update modules with fetch HEAD commits for all initialized
321# submodules
322if (NOT DEFINED UPDATE_MODULES)
323  set(UPDATE_MODULES OFF)
324endif()
325
326# For continuous builds, number of seconds to stay alive
327set(test_runtime 43200) #12h by default
328
329# Computer ID shown on the dashboard (will be set automatically)
330# set(CTEST_SITE "Server0407")
331
332# Ignore certain tests during test or memcheck
333#set(CTEST_CUSTOM_TESTS_IGNORE "")
334#set(CTEST_CUSTOM_MEMCHECK_IGNORE "")
335
336## #################################################################
337## Test routines
338## #################################################################
339
340#message(STATUS "Preserve full output (CTEST_FULL_OUTPUT)")
341
342if (NOT DEFINED KEEPCONFIG)
343  find_program(CTEST_UPDATE_COMMAND NAMES ${UPDATE_TYPE} ${UPDATE_TYPE}.exe)
344endif()
345
346# Initial checkout
347if(NOT EXISTS "${CTEST_SOURCE_DIRECTORY}" AND NOT DEFINED KEEPCONFIG)
348  if("x${UPDATE_TYPE}" STREQUAL "xgit")
349    if("x${UPDATE_PROT}" STREQUAL "xhttps")
350      set(gismo_url https://github.com/gismo/gismo.git)
351    else() #ssh
352      set(gismo_url git@github.com:gismo/gismo.git)
353    endif()
354    execute_process(COMMAND ${CTEST_UPDATE_COMMAND} clone --depth 1 --branch ${GISMO_BRANCH} ${gismo_url} ${CTEST_SOURCE_DIRECTORY})
355    unset(CTEST_CHECKOUT_COMMAND)
356
357  elseif("x${UPDATE_TYPE}" STREQUAL "xsvn")
358    if("x${GISMO_BRANCH}" STREQUAL "xstable") # stable
359      set(CTEST_CHECKOUT_COMMAND "${CTEST_UPDATE_COMMAND} checkout https://github.com/gismo/gismo.git/trunk ${CTEST_SOURCE_DIRECTORY}")
360    else() # branch
361      set(CTEST_CHECKOUT_COMMAND "${CTEST_UPDATE_COMMAND} checkout https://github.com/gismo/gismo.git/branches/${GISMO_BRANCH} ${CTEST_SOURCE_DIRECTORY}")
362    endif()
363  elseif("x${UPDATE_TYPE}" STREQUAL "xwget")
364    execute_process(COMMAND /bin/bash "-c" "wget --no-check-certificate -qO - https://github.com/gismo/gismo/archive/${GISMO_BRANCH}.tar.gz | tar -zxf -")
365    execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink gismo-${GISMO_BRANCH} ${CTEST_SOURCE_DIRECTORY})
366    set(CTEST_CHECKOUT_COMMAND "${CMAKE_COMMAND} --version")
367  elseif("x${UPDATE_TYPE}" STREQUAL "xurl")
368    file(DOWNLOAD https://github.com/gismo/gismo/archive/${GISMO_BRANCH}.tar.gz ${CTEST_SCRIPT_DIRECTORY}/${GISMO_BRANCH}.tar.gz)
369    execute_process(
370      COMMAND ${CMAKE_COMMAND} -E tar xzf ${GISMO_BRANCH}.tar.gz
371      COMMAND ${CMAKE_COMMAND} -E create_symlink gismo-${GISMO_BRANCH} ${CTEST_SOURCE_DIRECTORY}
372      WORKING_DIRECTORY ${CTEST_SCRIPT_DIRECTORY} )
373    set(CTEST_CHECKOUT_COMMAND "${CMAKE_COMMAND} --version")
374  endif()
375endif()
376
377if("x${UPDATE_TYPE}" STREQUAL "xgit")
378
379  if (NOT "x${GISMO_SUBMODULES}" STREQUAL "x")
380    foreach (submod ${GISMO_SUBMODULES})
381      #string(TOUPPER ${submod} csubmod)
382      #set(SUBM_ARGS ${SUBM_ARGS} -D${csubmod}=ON)
383      if ("x${submod}" STREQUAL "xunsupported")
384	set(SUBM_ARGS ${SUBM_ARGS} -DGISMO_UNSUPPORTED=ON)
385      endif()
386      if ("x${submod}" STREQUAL "xmotor")
387	set(SUBM_ARGS ${SUBM_ARGS} -DGISMO_MOTOR=ON)
388      endif()
389      if ("x${submod}" STREQUAL "xgsElasticity")
390	set(SUBM_ARGS ${SUBM_ARGS} -DGISMO_ELASTICITY=ON)#GSELASTICITY=ON
391      endif()
392      if ("x${submod}" STREQUAL "xgsExastencils")
393	set(SUBM_ARGS ${SUBM_ARGS} -DGISMO_EXASTENCILS=ON)
394      endif()
395    endforeach()
396  endif()
397
398  foreach (submodule ${GISMO_SUBMODULES})
399    if( NOT EXISTS "${CTEST_SOURCE_DIRECTORY}/extensions/${submodule}/.git" )
400      execute_process(COMMAND ${CTEST_UPDATE_COMMAND} submodule update --init extensions/${submodule}
401	WORKING_DIRECTORY ${CTEST_SOURCE_DIRECTORY})
402    endif()
403    if( NOT EXISTS "${CTEST_SOURCE_DIRECTORY}/extensions/${submodule}/.git" )
404      message(SEND_ERROR "Problem fetching ${submodule}")
405    endif()
406
407    if(${UPDATE_MODULES})
408      execute_process(COMMAND ${CTEST_UPDATE_COMMAND} checkout master
409	WORKING_DIRECTORY ${CTEST_SOURCE_DIRECTORY}/extensions/${submodule})
410    endif()
411  endforeach()
412  if(${UPDATE_MODULES})
413    set(CTEST_GIT_UPDATE_CUSTOM ${CTEST_UPDATE_COMMAND} pull)
414    unset(CTEST_GIT_UPDATE_OPTIONS)
415  endif()
416endif()
417
418if("${CTEST_CMAKE_GENERATOR}" MATCHES "Make" OR "${CTEST_CMAKE_GENERATOR}" MATCHES "Ninja")
419  set(CTEST_USE_LAUNCHERS 1)
420else()
421  set(CTEST_USE_LAUNCHERS 0)
422endif()
423
424set(ENV{CTEST_OUTPUT_ON_FAILURE} 1)
425set( $ENV{LC_MESSAGES} "en_EN")
426set(ENV{LC_ALL} C)# avoid non-ascii characters
427
428if(NOT DEFINED CTEST_TEST_MODEL AND DEFINED ENV{CTEST_TEST_MODEL})
429  set(CTEST_TEST_MODEL $ENV{CTEST_TEST_MODEL})
430endif()
431if(NOT DEFINED CTEST_CONFIGURATION_TYPE AND DEFINED ENV{CTEST_CONFIGURATION_TYPE})
432  set(CTEST_CONFIGURATION_TYPE $ENV{CTEST_CONFIGURATION_TYPE})
433endif()
434
435if(NOT DEFINED CTEST_SITE)
436  if(DEFINED ENV{CTEST_SITE})
437    set(CTEST_SITE $ENV{CTEST_SITE})
438  else()
439    find_program(HOSTNAME_CMD NAMES hostname)
440    execute_process(COMMAND ${HOSTNAME_CMD} OUTPUT_VARIABLE HOSTNAME OUTPUT_STRIP_TRAILING_WHITESPACE)
441    set(CTEST_SITE "${HOSTNAME}")
442  endif()
443endif()
444STRING(REPLACE " " "_" CTEST_SITE "${CTEST_SITE}")
445
446# Name of this build
447if(NOT DEFINED CTEST_BUILD_NAME)
448  #  find_program(UNAME NAMES uname)
449  #  execute_process(COMMAND "${UNAME}" "-s" OUTPUT_VARIABLE osname OUTPUT_STRIP_TRAILING_WHITESPACE)
450  #  execute_process(COMMAND "${UNAME}" "-m" OUTPUT_VARIABLE "cpu" OUTPUT_STRIP_TRAILING_WHITESPACE)
451  #  set(CTEST_BUILD_NAME "${osname}-${cpu} ${CTEST_CMAKE_GENERATOR}-${CTEST_CONFIGURATION_TYPE}-${CNAME}")
452  if(${UPDATE_MODULES})
453    set(smHead "(head)")
454  endif()
455  get_filename_component(cxxnamewe "${CXXNAME}" NAME_WE)
456  set(CTEST_BUILD_NAME "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR} ${CTEST_CMAKE_GENERATOR}-${CTEST_CONFIGURATION_TYPE}-${cxxnamewe}${smHead}")
457endif()
458STRING(REPLACE " " "_" CTEST_BUILD_NAME "${CTEST_BUILD_NAME}")
459
460#Output details
461message("Site: ${CTEST_SITE}")
462message("Build Name: ${CTEST_BUILD_NAME}")
463string(TIMESTAMP TODAY "%Y-%m-%d")
464message("Date: ${TODAY}")
465
466if(NOT CTEST_BUILD_JOBS)
467  include(ProcessorCount)
468  ProcessorCount(NPROC)
469  #message("Number of processors: ${NPROC}")
470  if(${NPROC} EQUAL 0)
471    set(NPROC 1)
472  endif()
473  if(${NPROC} GREATER 40)
474    set(CTEST_BUILD_JOBS 20)
475  else()
476    math(EXPR CTEST_BUILD_JOBS "(1+${NPROC})>>1")
477    #message("CTEST_BUILD_JOBS ${CTEST_BUILD_JOBS}")
478  endif()
479endif()
480
481if(NOT DEFINED CTEST_TEST_JOBS)
482  set(CTEST_TEST_JOBS ${CTEST_BUILD_JOBS})
483endif()
484
485if(${CTEST_CMAKE_GENERATOR} MATCHES "Unix Makefiles"
486    OR "${CTEST_CMAKE_GENERATOR}" MATCHES "Ninja")
487  set(CTEST_BUILD_FLAGS "-j ${CTEST_BUILD_JOBS}")
488  #message("Build flags: ${CTEST_BUILD_FLAGS}")
489endif()
490
491set(ENV{CTEST_USE_LAUNCHERS_DEFAULT} 1)
492
493macro(get_git_status res)
494  if(EXISTS "${CTEST_SOURCE_DIRECTORY}/.git" )
495    #    execute_process(COMMAND ${CTEST_UPDATE_COMMAND} rev-parse --verify HEAD
496    #      WORKING_DIRECTORY ${CTEST_SOURCE_DIRECTORY}
497    #      OUTPUT_STRIP_TRAILING_WHITESPACE
498    #      OUTPUT_VARIABLE gitHash)
499    execute_process(COMMAND ${CTEST_UPDATE_COMMAND} log -1
500      WORKING_DIRECTORY ${CTEST_SOURCE_DIRECTORY}
501      OUTPUT_STRIP_TRAILING_WHITESPACE
502      OUTPUT_VARIABLE commitMessage)
503    execute_process(COMMAND ${CTEST_UPDATE_COMMAND} submodule status
504      WORKING_DIRECTORY ${CTEST_SOURCE_DIRECTORY}
505      OUTPUT_STRIP_TRAILING_WHITESPACE
506      OUTPUT_VARIABLE submoduleHashes)
507    execute_process(COMMAND ${CTEST_UPDATE_COMMAND} submodule summary
508      WORKING_DIRECTORY ${CTEST_SOURCE_DIRECTORY}
509      OUTPUT_STRIP_TRAILING_WHITESPACE
510      OUTPUT_VARIABLE submoduleSummary)
511    set(${res} "${commitMessage}\n\nSubmodule status:\n${submoduleHashes}\n\nSubmodule summary:\n${submoduleSummary}\n")
512  endif()
513endmacro(get_git_status)
514
515macro(update_gismo ug_ucount)
516  # Reset CTestConfig variables
517  if(DEFINED PROJECT_NAME)
518    set(CTEST_PROJECT_NAME ${PROJECT_NAME})
519    if(NOT DEFINED DROP_LOCATION)
520      set(DROP_LOCATION "/submit.php?project=${PROJECT_NAME}")
521    endif()
522  endif()
523  if(DEFINED DROP_LOCATION)
524    set(CTEST_DROP_LOCATION ${DROP_LOCATION})
525  endif()
526  if(DEFINED DROP_SITE)
527    set(CTEST_DROP_SITE ${DROP_SITE})
528  endif()
529  if(DEFINED DROP_METHOD)
530    set(CTEST_DROP_METHOD ${DROP_METHOD})
531  endif()
532  if ("${CMAKE_VERSION}" VERSION_GREATER "3.9.99")
533    set(CTEST_LABELS_FOR_SUBPROJECTS ${LABELS_FOR_SUBPROJECTS}) #labels/subprojects
534  endif()
535
536  set(ug_updlog "0")
537  execute_process(COMMAND ${CTEST_UPDATE_COMMAND} symbolic-ref -q HEAD
538    WORKING_DIRECTORY ${CTEST_SOURCE_DIRECTORY}
539    RESULT_VARIABLE isdetached)
540  if(isdetached EQUAL 0 AND UPDATE_REPO)
541    ctest_update(SOURCE ${CTEST_SOURCE_DIRECTORY} RETURN_VALUE ${ug_ucount})
542    ctest_submit(PARTS Update RETRY_COUNT 3 RETRY_DELAY 3)
543  endif()
544  set(ug_updlog " ${${ug_ucount}} gismo\n")
545
546  if(${UPDATE_MODULES})
547    foreach (submodule ${GISMO_SUBMODULES})
548      execute_process(COMMAND ${CTEST_UPDATE_COMMAND} checkout master
549	WORKING_DIRECTORY ${CTEST_SOURCE_DIRECTORY}/extensions/${submodule})
550      ctest_update(SOURCE ${CTEST_SOURCE_DIRECTORY}/extensions/${submodule} RETURN_VALUE ug_upd_sm)
551      set(ug_updlog "${ug_updlog} ${ug_upd_sm} extensions/${submodule}\n")
552      if (${ug_upd_sm} GREATER 0)
553	math(EXPR ${ug_ucount} "${${ug_ucount}} + ${ug_upd_sm}")
554      endif()
555      if(${ug_upd_sm} LESS 0)
556        message(SEND_ERROR "Git update submodule error")
557      endif()
558    endforeach()
559  endif()
560  get_git_status(gitstatus)
561  file(WRITE ${CTEST_BINARY_DIRECTORY}/gitstatus.txt "Revision:\n${gitstatus}\nUpdates:\n${ug_updlog}")
562endmacro(update_gismo)
563
564macro(run_ctests)
565  set(narg ${ARGC})
566  if (narg GREATER 0)
567    set(${ARGV0} 0)
568  endif()
569
570  # Reset CTestConfig variables
571  if(DEFINED PROJECT_NAME)
572    set(CTEST_PROJECT_NAME ${PROJECT_NAME})
573    if(NOT DEFINED DROP_LOCATION)
574      set(DROP_LOCATION "/submit.php?project=${PROJECT_NAME}")
575    endif()
576  endif()
577  if(DEFINED DROP_LOCATION)
578    set(CTEST_DROP_LOCATION ${DROP_LOCATION})
579  endif()
580  if(DEFINED DROP_SITE)
581    set(CTEST_DROP_SITE ${DROP_SITE})
582  endif()
583  if(DEFINED DROP_METHOD)
584    set(CTEST_DROP_METHOD ${DROP_METHOD})
585  endif()
586  if ("${CMAKE_VERSION}" VERSION_GREATER "3.9.99")
587    set(CTEST_LABELS_FOR_SUBPROJECTS ${LABELS_FOR_SUBPROJECTS}) #labels/subprojects
588  endif()
589
590  message("Configuring")
591  if(DEFINED KEEPCONFIG)
592    ctest_configure(RETURN_VALUE confResult)
593  else()
594    ctest_configure(OPTIONS "${CMAKE_ARGS};${SUBM_ARGS};-DCTEST_USE_LAUNCHERS=${CTEST_USE_LAUNCHERS};-DBUILD_TESTING=ON;-DDART_TESTING_TIMEOUT=${CTEST_TEST_TIMEOUT}"  RETURN_VALUE confResult)
595  endif()
596
597  if(EXISTS ${CTEST_BINARY_DIRECTORY}/gitstatus.txt)
598    set(CTEST_NOTES_FILES ${CTEST_BINARY_DIRECTORY}/gitstatus.txt)
599    #list(APPEND CTEST_NOTES_FILES "file")
600    ctest_submit(PARTS Configure Notes RETRY_COUNT 3 RETRY_DELAY 3)
601  else()
602    ctest_submit(PARTS Configure RETRY_COUNT 3 RETRY_DELAY 3)
603  endif()
604
605  if (NOT confResult EQUAL 0)
606    message(SEND_ERROR "CMake Configuration failed.")
607  endif()
608
609  #"${CMAKE_VERSION}" VERSION_LESS "3.10"
610  if(NOT "x${LABELS_FOR_SUBPROJECTS}" STREQUAL "x")
611
612    foreach(subproject ${LABELS_FOR_SUBPROJECTS})
613      message("Subproject ${subproject}")
614      if ("${CMAKE_VERSION}" VERSION_LESS "3.10")
615        set_property(GLOBAL PROPERTY SubProject ${subproject})
616        set_property(GLOBAL PROPERTY Label ${subproject})
617      endif()
618      ctest_build(TARGET ${subproject} APPEND)
619      ctest_submit(PARTS Build  RETRY_COUNT 3 RETRY_DELAY 3)
620      if (DO_TESTS)
621	ctest_test(INCLUDE_LABEL "${subproject}" PARALLEL_LEVEL ${CTEST_TEST_JOBS} RETURN_VALUE testResult)
622	if (narg GREATER 0 AND NOT testResult EQUAL 0)
623	  set(${ARGV0} -1)
624	endif()
625	ctest_submit(PARTS Test  RETRY_COUNT 3 RETRY_DELAY 3)
626      endif()
627
628      if(DO_COVERAGE)
629        ctest_coverage(BUILD "${CTEST_BINARY_DIRECTORY}" LABELS "${subproject}" APPEND)
630        ctest_submit(PARTS Coverage  RETRY_COUNT 3 RETRY_DELAY 3)
631      endif()
632
633      if(NOT "x${CTEST_MEMORYCHECK_TYPE}" STREQUAL "xNone")
634        ctest_memcheck(INCLUDE_LABEL "${subproject}" APPEND)
635        ctest_submit(PARTS MemCheck  RETRY_COUNT 3 RETRY_DELAY 3)
636      endif()
637
638    endforeach()
639
640  else() # No subprojects
641
642
643    message("Building")
644    if("x${CTEST_CMAKE_GENERATOR}" STREQUAL "xNinja")
645      ctest_build(TARGET UnitTestPP APPEND) # for older versions of ninja
646    endif()
647    ctest_submit(PARTS Build  RETRY_COUNT 3 RETRY_DELAY 3)
648    ctest_build(APPEND)
649    ctest_submit(PARTS Build  RETRY_COUNT 3 RETRY_DELAY 3)
650    message("Building unittests")
651    ctest_build(TARGET unittests APPEND)
652    ctest_submit(PARTS Build  RETRY_COUNT 3 RETRY_DELAY 3)
653    if (DO_TESTS)
654      message("Testing")
655      ctest_test(PARALLEL_LEVEL ${CTEST_TEST_JOBS} RETURN_VALUE testResult)
656      if (narg GREATER 0 AND NOT testResult EQUAL 0)
657	set(${ARGV0} -1)
658      endif()
659    ctest_submit(PARTS Test  RETRY_COUNT 3 RETRY_DELAY 3)
660  endif()
661
662    if(DO_COVERAGE)
663      message("Running Coverage")
664      ctest_coverage(BUILD "${CTEST_BINARY_DIRECTORY}" APPEND)
665      ctest_submit(PARTS Coverage  RETRY_COUNT 3 RETRY_DELAY 3)
666    endif()
667
668    if(NOT "x${CTEST_MEMORYCHECK_TYPE}" STREQUAL "xNone")
669      message("Running Memcheck")
670      ctest_memcheck()
671      ctest_submit(PARTS MemCheck  RETRY_COUNT 3 RETRY_DELAY 3)
672    endif()
673
674  endif()
675endmacro(run_ctests)
676
677file(MAKE_DIRECTORY "${CTEST_BINARY_DIRECTORY}")
678
679if(NOT "${CTEST_TEST_MODEL}" STREQUAL "Continuous")
680
681  ctest_start(${CTEST_TEST_MODEL})
682  if(NOT "${CTEST_UPDATE_COMMAND}" STREQUAL "CTEST_UPDATE_COMMAND-NOTFOUND")
683    if(DEFINED KEEPCONFIG)
684      get_git_status(gitstatus)
685      file(WRITE ${CTEST_BINARY_DIRECTORY}/gitstatus.txt "Status:\n${gitstatus}")
686    else()
687      update_gismo(updcount)
688    endif()
689  endif()
690  run_ctests(res)
691
692  message("CDASH LINK:\nhttps://cdash-ci.inria.fr/index.php?project=${CTEST_PROJECT_NAME}&date=${TODAY}&filtercount=2&showfilters=1&filtercombine=and&field1=buildname&compare1=61&value1=${CTEST_BUILD_NAME}&field2=site&compare2=65&value2=${CTEST_SITE}")
693
694  if(NOT res EQUAL 0)
695    message(SEND_ERROR "Some Tests failed.")
696  endif()
697
698else() #continuous model
699  set(UPDATE_REPO ON)
700  while(${CTEST_ELAPSED_TIME} LESS ${test_runtime})
701    set(START_TIME ${CTEST_ELAPSED_TIME})
702    ctest_start(${CTEST_TEST_MODEL})
703    update_gismo(updcount)
704    if( ${updcount} GREATER 0 )
705      run_ctests()
706    endif()
707    ctest_sleep(${START_TIME} 300 ${CTEST_ELAPSED_TIME})
708  endwhile()
709
710endif(NOT "${CTEST_TEST_MODEL}" STREQUAL "Continuous")
711