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