1
2namespace Linux {
3
4    class C extends Farm.RuleSet.SourceRule {
5
6        static function constructor() { Farm.RuleSet.registerSourceHandler( new Linux.C() ); }
7
8        function types() {
9            return [ 'c' ];
10        }
11        function build( object target, string file ) {
12            string objectPath = .buildOutput( target, file );
13            string flags = target.getProperty('C');
14
15            if( Farm.invokeExternalProgram( "gcc $flags -o $objectPath -c $file" ) )
16                return objectPath;
17            return "";
18        }
19        function buildOutput( object target, string file ) {
20            return "${Farm.compiledObjectsDirForTarget(target)}/${(Farm.basename(file) - '.c')}.o";
21        }
22    }
23
24    class CPP extends Farm.RuleSet.SourceRule {
25
26        static function constructor() { Farm.RuleSet.registerSourceHandler( new Linux.CPP() ); }
27
28        function types() {
29            return [ 'cpp', 'cc', 'c++' ];
30        }
31        function build( object target, string file ) {
32            string objectPath = .buildOutput( target, file );
33            string flags = target.getProperty('CPP');
34
35            if( Farm.invokeExternalProgram( "g++ $flags -o $objectPath -c $file" ) )
36                return objectPath;
37            return "";
38        }
39        function buildOutput( object target, string file ) {
40            return "${Farm.compiledObjectsDirForTarget(target)}/${(Farm.basename(file) - '.cpp')}.o";
41        }
42    }
43
44    class SharedLibrary extends Farm.RuleSet.BuildRule {
45
46        static function constructor() { Farm.RuleSet.registerBuildHandler( new Linux.SharedLibrary() ); }
47
48        function type() {
49            return Farm.RuleSet.SharedLibrary;
50        }
51
52        function combinationName( object target ) {
53            return "${Farm.productsDirForTarget(target)}/lib${target.getProperty('name')}.so";
54        }
55
56        function combine( object target, array files ) {
57            string objects = Array.join( files, " " );
58	    string flags = target.getProperty('LD');
59            if( Farm.invokeExternalProgram( "gcc -shared -o ${.combinationName(target)} $flags $objects" ) )
60                return true;
61            return false;
62        }
63    }
64    class ModuleLibrary extends Linux.SharedLibrary {
65
66        static function constructor() { Farm.RuleSet.registerBuildHandler( new Linux.ModuleLibrary() ); }
67
68        function type() {
69            return Farm.RuleSet.ModuleLibrary;
70        }
71
72        function combinationName( object target ) {
73            return "${Farm.productsDirForTarget(target)}/${target.getProperty('name')}.so";
74        }
75    }
76}
77