1 package org.codehaus.mojo.natives.compiler;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 import java.io.File;
28 import java.util.ArrayList;
29 import java.util.List;
30
31 import org.codehaus.mojo.natives.NativeBuildException;
32 import org.codehaus.mojo.natives.NativeSources;
33 import org.codehaus.mojo.natives.SourceDependencyAnalyzer;
34 import org.codehaus.mojo.natives.parser.CParser;
35 import org.codehaus.mojo.natives.parser.Parser;
36 import org.codehaus.mojo.natives.util.CommandLineUtil;
37 import org.codehaus.mojo.natives.util.EnvUtil;
38 import org.codehaus.plexus.logging.AbstractLogEnabled;
39 import org.codehaus.plexus.util.FileUtils;
40 import org.codehaus.plexus.util.cli.Commandline;
41
42 public abstract class AbstractResourceCompiler
43 extends AbstractLogEnabled
44 implements ResourceCompiler
45 {
46
47 protected abstract Commandline getCommandLine( ResourceCompilerConfiguration config, File source )
48 throws NativeBuildException;
49
50 public List compile( ResourceCompilerConfiguration config, NativeSources[] sources )
51 throws NativeBuildException
52 {
53 File[] sourceFiles = NativeSources.getAllSourceFiles( sources );
54
55 config.setIncludePaths( NativeSources.getIncludePaths( sources ) );
56
57 config.setSystemIncludePaths( NativeSources.getSystemIncludePaths( sources ) );
58
59 List compilerOutputFiles = new ArrayList( sourceFiles.length );
60
61 for ( int i = 0; i < sourceFiles.length; ++i )
62 {
63 File src = sourceFiles[i];
64
65 if ( !"rc".equals( FileUtils.getExtension( src.getPath() ) ) )
66 {
67 continue;
68 }
69
70 File outputFile = config.getOutputFile( src );
71
72 compilerOutputFiles.add( outputFile );
73
74 if ( isResourceFileStaled( src, outputFile, config.getIncludePaths() ) )
75 {
76 Commandline cl = getCommandLine( config, src );
77
78 EnvUtil.setupCommandlineEnv( cl, config.getEnvFactory() );
79
80 CommandLineUtil.execute( cl, this.getLogger() );
81 }
82 }
83
84 return compilerOutputFiles;
85
86 }
87
88 private boolean isResourceFileStaled( File src, File dest, File[] includePaths )
89 throws NativeBuildException
90 {
91 Parser parser = new CParser();
92
93 try
94 {
95 if ( !SourceDependencyAnalyzer.isStaled( src, dest, parser, includePaths ) )
96 {
97 this.getLogger().info( src.getPath() + " is up to date." );
98 return false;
99 }
100 }
101 catch ( NativeBuildException ioe )
102 {
103 throw new NativeBuildException( "Error analyzing " + src.getPath() + " dependencies.", ioe );
104 }
105
106 return true;
107 }
108
109 }