Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / build / buildman / bin / bmplugins / CompileSolutionPlugIn.py @ 27363

History | View | Annotate | Download (5.19 KB)

1
from bmbase.IPlugIn import IPlugIn
2
from bmbase.PlugInManager import PlugInManager
3
from bmcore.BMUtil import BMUtil
4
import os
5
import sys
6

    
7
class CompileSolutionPlugIn(IPlugIn):
8
        def __init__(self):
9
                IPlugIn.__init__(self)
10
                self._targetType = "Release" # only vs7/vs8 compilers
11
                self._projectPath = ""
12
                self._install = False
13
                self._projectName = ""
14
                self._projectGenerationPath = ""
15
                self._supportedCompilers = dict()
16
                self._supportedCompilers["vs8"]="devenv.exe"
17
                self._supportedCompilers["vs7"]="devenv.exe"
18
                self._supportedCompilers["gcc4"]="make"
19
                self._supportedCompilers["gcc3"]="make"
20
                self._compiler = ""
21
                
22

    
23
        def init(self):
24
                self.addGoal("compile-solution", "Compiles the solution based on Makefiles or VisualStudio for Win/Linux/Mac")
25
                self.addGoalOption("compile-solution", "--project-path", "sets the path of the project.")
26
                self.addGoalOption("compile-solution", "--project-gen-path", "sets the path of the Makefiles/VS build files. Default: ${project-path}/BMCMake")
27
                self.addGoalOption("compile-solution", "--project-name", "sets the name of the project. If not given it uses the name of the project directory.")
28
                self.addGoalOption("compile-solution", "--install", "Executes target install after compilation.")
29
                self.addGoalOption("compile-solution", "--compiler", "Forces the compiler. If not try to determine using current platform\n" +
30
                                                                                                                        "Supported Compilers:\n" + 
31
                                                                                                                        str(self._supportedCompilers))
32
                execute = False
33
                if self._arguments.read("compile-solution"):
34
                        execute = True
35
                if execute:
36
                        args = [""]
37
                        if self._arguments.read("--project-path", args):
38
                                self._projectPath=args[0]
39
                                
40
                        args = [""]
41
                        if self._arguments.read("--project-gen-path", args):
42
                                self._projectGenerationPath=args[0]
43
                
44
                        args = [""]
45
                        if self._arguments.read("--project-name", args):
46
                                self._projectName=args[0]
47

    
48
                        args = [""]
49
                        if self._arguments.read("--compiler", args):
50
                                if args[0] in self._supportedCompilers:
51
                                        self._compiler=args[0]
52

    
53
                        if self._arguments.read("--install"):
54
                                self._install=True
55
                                
56
                        self.setExecute(True)
57
                        
58
        def initFromXML(self, node):
59
                if node.localName=="compile-solution":
60
                        if node.hasAttributes():
61
                                if node.attributes.has_key("project-path"):
62
                                        self._projectPath = node.attributes.get("project-path").value
63
                                if node.attributes.has_key("project-gen-path"):
64
                                        self._projectGenerationPath = node.attributes.get("project-gen-path").value
65
                                if node.attributes.has_key("project-name"):
66
                                        self._projectName = node.attributes.get("project-name").value
67
                                if node.attributes.has_key("compiler"):
68
                                        value = node.attributes.get("compiler").value
69
                                        if args[0] in self._supportedCompilers:
70
                                                self._compiler = value
71
                                 if node.attributes.has_key("install"):
72
                                        value = node.attributes.get("install").value 
73
                                        if value == "True" or value == "true":
74
                                                self._install = True
75
                                                                                
76
        def execute(self):
77
                dmplugin = PlugInManager().getPlugInInstance("DepManPlugIn")
78
                if dmplugin == None:
79
                        self.reportError("DepMan PlugIn not found")
80
                        return False
81
                if self._projectPath=="":
82
                        self.reportError("Missing required project path option")
83
                        return False
84
                        
85
                self._projectPath = os.path.abspath(self._projectPath)
86
                if self._compiler=="":
87
                        self._compiler = dmplugin.getOSCompiler()
88
        
89
                if self._projectName == "":
90
                        self._projectName = os.path.basename(self._projectPath)
91
                        
92
                if self._projectGenerationPath == "":
93
                        self._projectGenerationPath = os.path.join(self._projectPath, "BMCMake")
94
                else:
95
                        self._projectGenerationPath = os.path.abspath(self._projectGenerationPath)
96
                
97
                print "Executing Plugin:" + str(self.__class__)
98
                platform = dmplugin.getOSPlatform()
99
                if platform == "linux" or platform == "mac":
100
                        self.__executeUnix()
101
                else:
102
                        self.__executeVS()        
103
                return True
104

    
105
        def __executeUnix(self):
106
                #make install
107
                print "CPUs Detected:" + str(self.__cpuCount())
108
                cmdCompiler = self._supportedCompilers[self._compiler] + " -j"+str(self.__cpuCount()) 
109
                if self._install:        
110
                        cmdCompiler += " install"
111
                olddir = os.getcwd()
112
                os.chdir(self._projectGenerationPath)
113
                os.system(cmdCompiler)
114
                os.chdir(olddir)        
115

    
116
        def __executeVS(self):
117
                #devenv.exe /build Release /project INSTALL ../CMake/libjosg.sln
118
                cmdCompiler = self._supportedCompilers[self._compiler]
119
                cmdCompiler += " " + self._projectName + ".sln"
120
                cmdCompiler += " /build Release"
121
                if self._install:        
122
                        cmdCompiler += " /project INSTALL"
123
                else:
124
                        cmdCompiler += " /project ALL_BUILD"
125
                olddir = os.getcwd()
126
                os.chdir(self._projectGenerationPath)
127
                os.system(cmdCompiler)
128
                os.chdir(olddir)        
129
                
130
        def __cpuCount(self):
131
            '''
132
            Returns the number of CPUs in the system
133
            '''
134
            if sys.platform == 'win32':
135
                try:
136
                    num = int(os.environ['NUMBER_OF_PROCESSORS'])
137
                except (ValueError, KeyError):
138
                    pass
139
            elif sys.platform == 'darwin':
140
                try:
141
                    num = int(os.popen('sysctl -n hw.ncpu').read())
142
                except ValueError:
143
                    pass
144
            else:
145
                try:
146
                    num = os.sysconf('SC_NPROCESSORS_ONLN')
147
                except (ValueError, OSError, AttributeError):
148
                    pass
149
                
150
            if num >= 1:
151
                return num
152
            return 1
153

    
154

    
155
PlugInManager().registerPlugIn("CompileSolutionPlugIn", CompileSolutionPlugIn())
156

    
157