--- automake.in | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 85 insertions(+), 1 deletions(-)
diff --git a/automake.in b/automake.in index bab8c42..415d883 100755 --- a/automake.in +++ b/automake.in @@ -809,7 +809,7 @@ register_language ('name' => 'header', # No output. 'output_extensions' => sub { return () }, # Nothing to do. - '_finish' => sub { }); + '_finish' => \&lang_header_finish); # Vala register_language ('name' => 'vala', @@ -2265,6 +2265,38 @@ sub handle_source_transform ($$$$%) else { @keys = map { '$(' . $_ . $one_file . '_OBJECTS)' } @keys; + # handle target_QTSOURCES variable: + my $var = set_seen $one_file . '_QTSOURCES'; + if ($var) + { + my @mocobjects = (); + foreach my $file ($var->value_as_list_recursive) + { + # FIXME: instead of .h use something more general + # (e.g. the extension list from the language 'header') + if ($file =~ s/\.h$//) + { + # add %.h files as %.o to target_QTOBJECTS + push @mocobjects, 'moc_' . $file . '.$(OBJEXT)' ; + # also add moc resulting source file to mostlyclean + $compile_clean_files{"moc_$file.cpp"} = MOSTLY_CLEAN; + } + else + { + $file =~ s/\.[^.]+$//; + # also add moc resulting source file to mostlyclean + $compile_clean_files{"$file.moc"} = MOSTLY_CLEAN; + } + } + # if there were .h files, then add target_QTOBJECTS to + # target_OBJECTS + if (@mocobjects) + { + my $where = $var->rdef (TRUE)->location; + define_pretty_variable ($one_file . '_QTOBJECTS', TRUE, $where, @mocobjects); + push @keys, '$(' . $one_file . '_QTOBJECTS)' if $var; + } + } define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @keys); } @@ -5930,6 +5962,58 @@ sub lang_c_finish } } +sub lang_header_finish_target ($$) +{ + my ($self, $name) = @_; + + my $derived = canonicalize ($name); + + # handle target_QTSOURCES variable: create rules for each source + # in the form of + # moc_foo.cpp: foo.h + # $(MOC) -o $@ $< + # for headers and + # foo.moc: foo.cpp + # $(MOC) -o $@ $< + # for non-header files. + my $var = var ($derived . '_QTSOURCES'); + if ($var) + { + # FIXME: subdir-objects handling + foreach my $file ($var->value_as_list_recursive) + { + # FIXME: instead of .h use something more general + # (e.g. the extension list from the language 'header') + if ($file =~ s/\.h$//) + { + $output_rules .= "moc_$file.cpp: \$(srcdir)/$file.h\n". + "\t\$(MOC) -o \$\@ \$<\n"; + } + else + { + my $origname = $file; + $file =~ s/\.[^.]+$//; + $output_rules .= "$file.moc: \$(srcdir)/$origname\n". + "\t\$(MOC) -o \$\@ \$<\n"; + } + } + } +} + +sub lang_header_finish +{ + my ($self) = @_; + foreach my $prog (keys %known_programs) + { + lang_header_finish_target ($self, $prog); + } + + while (my ($name) = each %known_libraries) + { + lang_header_finish_target ($self, $name); + } +} + sub lang_vala_finish_target ($$) { my ($self, $name) = @_; -- 1.6.3.3