1#!/usr/bin/perl 2use strict; 3use warnings; 4use Data::Dumper; 5 6my $target; 7my $hostname = `hostname`; 8my $build; 9my $quiet = 0; 10my (%build_for_host, %source_dir, %build_name, %external_hostname, %local_port_range, %external_ssh_arg); 11sub load_db(); 12sub build_env_scripts($); 13 14load_db(); 15chomp($hostname); 16 17die "No build for this host" unless defined $build_for_host{$hostname}; 18 19$build = $build_for_host{$hostname}; 20die "Usage: run_remote_tests.pl <target>" unless defined $ARGV[0]; 21if ($ARGV[0] eq "-build_scripts") { 22 build_env_scripts($ARGV[1]); 23 exit(0); 24} 25if ($ARGV[0] eq "-q") { 26 shift(@ARGV); 27 $quiet = 1; 28} 29$target = $ARGV[0]; 30die "No build for target \"$target\"" unless defined $source_dir{$target}; 31print "Using build $build on host $hostname\n" unless $quiet; 32opendir(DIR, "$source_dir{$build}"); 33my @files = grep(/\.tsts$/,readdir(DIR)); 34closedir(DIR); 35my $tsts_dir = "$source_dir{$build}"; 36 37if (! @files ) { 38 opendir(DIR, "$source_dir{$build}/.."); 39 @files = grep(/\.tsts$/,readdir(DIR)); 40 closedir(DIR); 41 $tsts_dir = "$source_dir{$build}/.."; 42} 43 44open CTEST_CONFIG, ">$source_dir{$build}/CTestConfig.cmake" or die $1; 45my $dartsubmitinfo = <<'END'; 46SET (CTEST_NIGHTLY_START_TIME "10:00:00 GMT") 47SET (CTEST_START_WITH_EMPTY_BINARY_DIRECTORY FALSE) 48 49SET(CTEST_PROJECT_NAME "Evpath") 50SET(CTEST_NIGHTLY_START_TIME "10:49:51 GMT") 51 52IF(NOT DEFINED CTEST_DROP_METHOD) 53 SET(CTEST_DROP_METHOD "http") 54ENDIF(NOT DEFINED CTEST_DROP_METHOD) 55 56IF(CTEST_DROP_METHOD STREQUAL "http") 57 SET(CTEST_DROP_SITE "evpath.net") 58 SET(CTEST_DROP_LOCATION "/CDash/submit.php?project=Evpath") 59 SET(CTEST_DROP_SITE_CDASH TRUE) 60 SET(CTEST_TRIGGER_SITE "cdash.cercs.gatech.edu") 61ENDIF(CTEST_DROP_METHOD STREQUAL "http") 62END 63print CTEST_CONFIG "$dartsubmitinfo\n"; 64close CTEST_CONFIG; 65 66open CTEST, ">$source_dir{$build}/CTestTestfile.cmake" or die $1; 67 68print CTEST "# \n"; 69print CTEST "# generated from files: "; 70print CTEST join( ', ', @files ); 71print CTEST "\n"; 72print CTEST "# \n"; 73print CTEST "message (\"SSH params are \$ENV{SSH_PARAMS}\")" unless $quiet; 74 75foreach my $file (@files) { 76 open(TSTS, "$tsts_dir/$file") or die("Could not open $tsts_dir/$file."); 77 print CTEST "# \n"; 78 print CTEST "# tests from $file\n"; 79 print CTEST "# \n"; 80 foreach my $line (<TSTS>) { 81 chomp $line; 82 print CTEST "ADD_TEST($line \"$line\" \"-ssh\" \"\$ENV{SSH_PARAMS}\")\n"; 83 } 84} 85 86close CTEST; 87 88open TEST, ">$source_dir{$build}/$target.cmake" or die $1; 89my $TEST_BODY = <<'END'; 90## -- Set hostname 91## -------------------------- 92find_program(HOSTNAME_CMD NAMES hostname) 93exec_program(${HOSTNAME_CMD} ARGS OUTPUT_VARIABLE HOSTNAME) 94set(CTEST_SITE "${HOSTNAME}") 95set(MODEL "Experimental") 96set(CMAKE_C_COMPILER "/usr/bin/gcc") 97SET(CTEST_NIGHTLY_START_TIME "11:56:44 GMT") 98SET (CTEST_START_WITH_EMPTY_BINARY_DIRECTORY FALSE) 99set(CTEST_BINARY_DIRECTORY "${CTEST_SOURCE_DIRECTORY}") 100 101set(CTEST_TIMEOUT "7200") 102set( $ENV{LC_MESSAGES} "en_EN" ) 103ctest_start(${MODEL} TRACK ${MODEL}) 104 105END 106$TEST_BODY .= 'message(" -- Test ${MODEL} - ${CTEST_BUILD_NAME} --") 107' unless $quiet; 108$TEST_BODY .= 'ctest_test( BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res) 109'; 110 111$TEST_BODY .= 'message(" -- Submit ${MODEL} - ${CTEST_BUILD_NAME} --") 112' unless $quiet; 113$TEST_BODY .= "ctest_submit( RETURN_VALUE res)\n"; 114$TEST_BODY .= 'message(" -- Finished ${MODEL} - ${CTEST_BUILD_NAME} --") 115' unless $quiet; 116 117print TEST "set(CTEST_SOURCE_DIRECTORY \"$source_dir{$build}\")\n"; 118print TEST "set(CTEST_BUILD_NAME \"$build_name{$build}-to-$build_name{$target}\")\n"; 119print TEST "SET( ENV{SSH_PARAMS} \"$external_ssh_arg{$target}:$source_dir{$target}\" )\n"; 120if (defined $external_hostname{$build}) { 121 print TEST "SET( ENV{CM_HOSTNAME} \"$external_hostname{$build}\")\n"; 122} 123if (defined $local_port_range{$build}) { 124 print TEST "SET( ENV{CM_PORT_RANGE} \"$local_port_range{$build}\")\n"; 125} 126print TEST $TEST_BODY; 127close TEST; 128 129chdir ("$source_dir{$build}"); 130if ($quiet) { 131 system("ctest -S $target.cmake"); 132} else { 133 system("ctest -V -S $target.cmake"); 134} 135 136sub build_env_scripts($) { 137 my $exe_dir = shift; 138 my $file; 139 print "Building scripts for executable directory $exe_dir\n"; 140 mkdir("$exe_dir/scripts"); 141 chdir ("$exe_dir"); 142 @files = <*>; 143 foreach $file (@files) { 144 if (-x $file && ! -d $file) { 145 print $file . "\n"; 146 open SCRIPT, ">scripts/$file"; 147 print SCRIPT "#!/bin/bash\n"; 148 if (defined $external_hostname{$build}) { 149 print SCRIPT "export CM_HOSTNAME=$external_hostname{$build}\n"; 150 } 151 if (defined $local_port_range{$build}) { 152 print SCRIPT "export CM_PORT_RANGE=$local_port_range{$build}\n"; 153 } 154 print SCRIPT "$exe_dir/$file \"\$\@\"\n"; 155 close SCRIPT; 156 chmod 0755, "scripts/$file" 157 } 158 } 159} 160 161sub load_db() { 162 %build_for_host = ( 163 'jedi080', 'jedi', 164 'chaos', 'chaos', 165 'raspberrypi', 'raspberry', 166 ); 167 $source_dir{"jedi"} = "/users/c/chaos/evpath_tests/rhe6-64"; 168 $source_dir{"chaos"} = "/home/greg/evpath_tests/"; 169 $source_dir{"raspberry"} = "/home/eisen/evpath_tests/scripts"; 170 $build_name{"jedi"} = "Jedi"; 171 $build_name{"chaos"} = "UB18"; 172 $build_name{"raspberry"} = "Pi"; 173 $external_hostname{"raspberry"} = "eisenhauer.dyndns.org"; 174 $local_port_range{"raspberry"} = "62000:62100"; 175 $external_ssh_arg{"jedi"} = "chaos\@jedi080.cc.gatech.edu"; 176 $external_ssh_arg{"chaos"} = "greg\@chaos.cc.gatech.edu"; 177 $external_ssh_arg{"raspberry"} = "eisen\@eisenhauer.dyndns.org:4022"; 178} 179