1 package org.codehaus.mojo.natives.linker;
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.io.IOException;
29 import java.util.List;
30
31 import org.codehaus.mojo.natives.NativeBuildException;
32 import org.codehaus.mojo.natives.util.CommandLineUtil;
33 import org.codehaus.mojo.natives.util.EnvUtil;
34 import org.codehaus.plexus.logging.AbstractLogEnabled;
35 import org.codehaus.plexus.util.cli.Commandline;
36
37 public abstract class AbstractLinker
38 extends AbstractLogEnabled
39 implements Linker
40 {
41
42 protected abstract Commandline createLinkerCommandLine( List objectFiles, LinkerConfiguration config )
43 throws NativeBuildException;
44
45 public File link( LinkerConfiguration config, List compilerOutputFiles )
46 throws NativeBuildException, IOException
47 {
48 if ( isStaled( config, compilerOutputFiles ) )
49 {
50
51 Commandline cl = this.createLinkerCommandLine( compilerOutputFiles, config );
52 EnvUtil.setupCommandlineEnv( cl, config.getEnvFactory() );
53 CommandLineUtil.execute( cl, this.getLogger() );
54 }
55
56 return config.getOutputFile();
57 }
58
59 private boolean isStaled( LinkerConfiguration config, List compilerOutputFiles )
60 {
61 if ( !config.isCheckStaleLinkage() )
62 {
63
64 return true;
65 }
66
67 File previousDestination = config.getOutputFile();
68
69 if ( !previousDestination.exists() )
70 {
71 return true;
72 }
73
74 if ( previousDestination.exists() )
75 {
76 for ( int i = 0; i < compilerOutputFiles.size(); ++i )
77 {
78 if ( previousDestination.lastModified() < ( (File) compilerOutputFiles.get( i ) ).lastModified() )
79 {
80 if ( this.getLogger().isDebugEnabled() )
81 {
82 getLogger().debug( "Stale relative to compilerOutputFiles: "
83 + ( (File) compilerOutputFiles.get( i ) ).getAbsolutePath() );
84 }
85
86 return true;
87 }
88 }
89
90 for ( int i = 0; i < config.getExternalLibFileNames().size(); ++i )
91 {
92 File extLib =
93 new File( config.getExternalLibDirectory(), (String) config.getExternalLibFileNames().get( i ) );
94
95 if ( previousDestination.lastModified() < extLib.lastModified() )
96 {
97 if ( this.getLogger().isDebugEnabled() )
98 {
99 getLogger().debug( "Stale relative to extLib: " + extLib.getAbsolutePath() );
100 }
101
102 return true;
103 }
104 }
105 }
106
107 return false;
108 }
109
110 }