Salome HOME
Add test for the compilation commands
[tools/sat.git] / commands / makeinstall.py
1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 #  Copyright (C) 2010-2012  CEA/DEN
4 #
5 #  This library is free software; you can redistribute it and/or
6 #  modify it under the terms of the GNU Lesser General Public
7 #  License as published by the Free Software Foundation; either
8 #  version 2.1 of the License.
9 #
10 #  This library is distributed in the hope that it will be useful,
11 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 #  Lesser General Public License for more details.
14 #
15 #  You should have received a copy of the GNU Lesser General Public
16 #  License along with this library; if not, write to the Free Software
17 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18
19 import os
20
21 import src
22
23 # Define all possible option for the makeinstall command : sat makeinstall <options>
24 parser = src.options.Options()
25 parser.add_option('p', 'products', 'list2', 'products',
26     _('products to configure. This option can be'
27     ' passed several time to configure several products.'))
28
29 def get_products_list(options, cfg, logger):
30     '''method that gives the product list with their informations from 
31        configuration regarding the passed options.
32     
33     :param options Options: The Options instance that stores the commands 
34                             arguments
35     :param cfg Config: The global configuration
36     :param logger Logger: The logger instance to use for the display and logging
37     :return: The list of (product name, product_informations).
38     :rtype: List
39     '''
40     # Get the products to be prepared, regarding the options
41     if options.products is None:
42         # No options, get all products sources
43         products = cfg.APPLICATION.products
44     else:
45         # if option --products, check that all products of the command line
46         # are present in the application.
47         products = options.products
48         for p in products:
49             if p not in cfg.APPLICATION.products:
50                 raise src.SatException(_("Product %(product)s "
51                             "not defined in application %(application)s") %
52                         { 'product': p, 'application': cfg.VARS.application} )
53     
54     # Construct the list of tuple containing 
55     # the products name and their definition
56     products_infos = src.product.get_products_infos(products, cfg)
57     
58     products_infos = [pi for pi in products_infos if not(src.product.product_is_native(pi[1]) or src.product.product_is_fixed(pi[1]))]
59     
60     return products_infos
61
62 def log_step(logger, header, step):
63     logger.write("\r%s%s" % (header, " " * 20), 3)
64     logger.write("\r%s%s" % (header, step), 3)
65     logger.write("\n==== %s \n" % src.printcolors.printcInfo(step), 4)
66     logger.flush()
67
68 def log_res_step(logger, res):
69     if res == 0:
70         logger.write("%s \n" % src.printcolors.printcSuccess("OK"), 4)
71         logger.flush()
72     else:
73         logger.write("%s \n" % src.printcolors.printcError("KO"), 4)
74         logger.flush()
75
76 def makeinstall_all_products(config, products_infos, logger):
77     '''Execute the proper configuration commands 
78        in each product build directory.
79
80     :param config Config: The global configuration
81     :param products_info list: List of 
82                                  (str, Config) => (product_name, product_info)
83     :param logger Logger: The logger instance to use for the display and logging
84     :return: the number of failing commands.
85     :rtype: int
86     '''
87     res = 0
88     for p_name_info in products_infos:
89         res_prod = makeinstall_product(p_name_info, config, logger)
90         if res_prod != 0:
91             res += 1 
92     return res
93
94 def makeinstall_product(p_name_info, config, logger):
95     '''Execute the proper configuration command(s) 
96        in the product build directory.
97     
98     :param p_name_info tuple: (str, Config) => (product_name, product_info)
99     :param config Config: The global configuration
100     :param logger Logger: The logger instance to use for the display 
101                           and logging
102     :return: 1 if it fails, else 0.
103     :rtype: int
104     '''
105     
106     p_name, p_info = p_name_info
107     
108     # Logging
109     logger.write("\n", 4, False)
110     logger.write("################ ", 4)
111     header = _("Make of %s") % src.printcolors.printcLabel(p_name)
112     header += " %s " % ("." * (20 - len(p_name)))
113     logger.write(header, 3)
114     logger.write("\n", 4, False)
115     logger.flush()
116     
117     # Instantiate the class that manages all the construction commands
118     # like cmake, make, make install, make test, environment management, etc...
119     builder = src.compilation.Builder(config, logger, p_info)
120     
121     # Prepare the environment
122     log_step(logger, header, "PREPARE ENV")
123     res_prepare = builder.prepare()
124     log_res_step(logger, res_prepare)
125     
126     # Execute buildconfigure, configure if the product is autotools
127     # Execute cmake if the product is cmake
128     res = 0
129     if not src.product.product_has_script(p_info):
130         log_step(logger, header, "MAKE INSTALL")
131         res_m = builder.install()
132         log_res_step(logger, res_m)
133         res += res_m
134     
135     # Log the result
136     if res > 0:
137         logger.write("\r%s%s" % (header, " " * 20), 3)
138         logger.write("\r" + header + src.printcolors.printcError("KO"))
139         logger.write("==== %(KO)s in make install of %(name)s \n" %
140             { "name" : p_name , "KO" : src.printcolors.printcInfo("ERROR")}, 4)
141         logger.flush()
142     else:
143         logger.write("\r%s%s" % (header, " " * 20), 3)
144         logger.write("\r" + header + src.printcolors.printcSuccess("OK"))
145         logger.write("==== %s \n" % src.printcolors.printcInfo("OK"), 4)
146         logger.write("==== Make install of %(name)s %(OK)s \n" %
147             { "name" : p_name , "OK" : src.printcolors.printcInfo("OK")}, 4)
148         logger.flush()
149     logger.write("\n", 3, False)
150
151     return res
152
153 def description():
154     '''method that is called when salomeTools is called with --help option.
155     
156     :return: The text to display for the makeinstall command description.
157     :rtype: str
158     '''
159     return _("The makeinstall command executes the \"make install\" command in"
160              " the build directory")
161   
162 def run(args, runner, logger):
163     '''method that is called when salomeTools is called with makeinstall parameter.
164     '''
165     
166     # Parse the options
167     (options, args) = parser.parse_args(args)
168
169     # check that the command has been called with an application
170     src.check_config_has_application( runner.cfg )
171
172     # Get the list of products to treat
173     products_infos = get_products_list(options, runner.cfg, logger)
174
175     # Print some informations
176     logger.write(_('Executing the make install command in the build directories of the application %s\n') % 
177                 src.printcolors.printcLabel(runner.cfg.VARS.application), 1)
178     
179     info = [(_("BUILD directory"),
180              os.path.join(runner.cfg.APPLICATION.workdir, 'BUILD'))]
181     src.print_info(logger, info)
182     
183     # Call the function that will loop over all the products and execute
184     # the right command(s)
185     res = makeinstall_all_products(runner.cfg, products_infos, logger)
186     
187     # Print the final state
188     nb_products = len(products_infos)
189     if res == 0:
190         final_status = "OK"
191     else:
192         final_status = "KO"
193    
194     logger.write(_("\nMake install: %(status)s (%(valid_result)d/%(nb_products)d)\n") % \
195         { 'status': src.printcolors.printc(final_status), 
196           'valid_result': nb_products - res,
197           'nb_products': nb_products }, 1)    
198     
199     return res