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