# Objective-C++
qw( mii ),
);
+my @source_no_preprocess_compile_ada = (
+ # Ada body
+ qw( adb ),
+ # If you add another file, fix use of @source_no_preprocess_compile_ada
+ # below (search for $compile_ada).
+);
my @source_no_preprocess_compile = (
# C
qw( i ),
qw( mi ),
# Fortran
qw( f for ftn f90 f95 f03 f08 ),
- # Ada body
- qw( adb ),
+ # Ada
+ @source_no_preprocess_compile_ada,
);
my @source_no_preprocess_no_compile = (
# Assembly
# FUNCTIONS
+# Only works for single-level arrays with no undef values. Thanks to perlfaq4.
+sub array_equal {
+ my ($first_ref, $second_ref) = @_;
+
+ return 0 if scalar @{$first_ref} != scalar @{$second_ref};
+
+ my $length = scalar @{$first_ref};
+ for (my $i = 0; $i < $length; $i++) {
+ return 0 if $first_ref->[$i] ne $second_ref->[$i];
+ }
+
+ return 1;
+}
+
sub error_flags {
my ($message, $missing_flags_ref, $flag_renames_ref, $line) = @_;
printf '%s (%s)%s %s',
error_color($message, 'red'), $flags, error_color(':', 'yellow'),
$line;
+
+ return;
}
sub error_non_verbose_build {
my ($line) = @_;
error_color('NONVERBOSE BUILD', 'red'),
error_color(':', 'yellow'),
$line;
+
+ return;
}
sub error_invalid_cmake {
my ($version) = @_;
error_color('INVALID CMAKE', 'red'),
error_color(':', 'yellow'),
$version;
+
+ return;
}
sub error_hardening_wrapper {
printf "%s%s %s\n",
error_color('HARDENING WRAPPER', 'red'),
error_color(':', 'yellow'),
'no checks possible, aborting';
+
+ return;
}
sub error_color {
my ($message, $color) = @_;
or not exists $removes{$flag_renames_ref->{$_}})
} @{$flags};
}
+
+ return;
}
sub compile_flag_regexp {
my $harden_bindnow = $option_bindnow; # defaults to 0
my $harden_pie = $option_pie; # defaults to 0
+ # Does this build log use ada? Ada also uses gcc as compiler but uses
+ # different CFLAGS. But only perform ada checks if an ada compiler used
+ # for performance reasons.
+ my $ada = 0;
+
while (my $line = <$fh>) {
# Detect architecture automatically unless overridden. For buildd logs
# only, doesn't use the dpkg-buildpackage header. Necessary to ignore
}
next FILE;
}
+
+ # Ada compiler.
+ if ($line =~ /\bgnat\b/) {
+ $ada = 1;
+ }
}
# We skip over unimportant lines at the beginning of the log to
@ldflags = (@ldflags, @def_ldflags_bindnow);
}
+ # Stores normal CFLAGS when @cflags_ada are temporarily used.
+ my @cflags_backup;
+ # Ada CFLAGS.
+ my @cflags_ada = @cflags;
+ # Ada doesn't support format hardening flags, see #680117 for more
+ # information. Filter them out if ada is used.
+ if ($ada and $harden_format) {
+ @cflags_ada = grep {
+ my $ok = 1;
+ foreach my $flag (@def_cflags_format) {
+ $ok = 0 if $_ eq $flag;
+ }
+ $ok;
+ } @cflags;
+ }
+
# Hack to fix cppflags_fortify_broken() if --ignore-flag
# -D_FORTIFY_SOURCE=2 is used to ignore missing fortification. Only works
# as long as @def_cppflags_fortify contains only one variable.
}
}
+ my $compile_cpp = 0;
+ my $compile_ada = 0;
# Assume CXXFLAGS are required when a C++ file is specified in the
# compiler line.
- my $compile_cpp = 0;
if ($compile
and extension_found(\%extensions_compile_cpp, @extensions)) {
$compile = 0;
$compile_cpp = 1;
+ # Ada needs special CFLAGS, use them if only ada files are compiled.
+ } elsif ($ada
+ and $compile
+ and array_equal(\@extensions,
+ \@source_no_preprocess_compile_ada)) {
+ $compile_ada = 1;
+ @cflags_backup = @cflags;
+ @cflags = @cflags_ada;
}
if ($option_buildd) {
$statistics{link_missing}++;
}
}
+
+ # Restore normal CFLAGS.
+ if ($compile_ada) {
+ @cflags = @cflags_backup;
+ }
}
}