// Author : Vadim SANDLER, Open CASCADE SAS (vadim.sandler@opencascade.com)
// Project : SALOME
// Module : Installation Wizard
-// Copyright : 2002-2007 CEA
+// Copyright : 2002-2010 CEA
#include "globals.h"
#include <qradiobutton.h>
#include <qbuttongroup.h>
#include <qregexp.h>
+#include <qdir.h>
#ifdef WNT
#include <iostream.h>
#else
#include <unistd.h>
#include <algo.h>
+#include <sys/utsname.h>
#endif
#ifdef WNT
QString tmpDirName() { return QString( "/INSTALLWORK" ) + QString::number( getpid() ); }
#define TEMPDIRNAME tmpDirName()
+// uncomment next line to redirect all shell output (usually for errors) to /dev/null device
+// #define USE_DEV_NULL
+
+// ================================================================
+/*!
+ * Script
+ * Helper class to generate shell command
+ */
+// ================================================================
+class Script
+{
+public:
+ Script( const QString& cmd = QString::null, const QString& sep = " " ) : mySeparator( sep )
+ {
+ append( cmd );
+ }
+ void append( const QString& cmd )
+ {
+ if ( !cmd.isEmpty() ) myList.append( cmd );
+ }
+ Script& operator<<( const QString& cmd )
+ {
+ append( cmd );
+ return *this;
+ }
+ QString script() const
+ {
+ return myList.join( mySeparator );
+ }
+ void clear()
+ {
+ myList.clear();
+ }
+private:
+ QStringList myList;
+ QString mySeparator;
+};
+
// ================================================================
/*!
* ProcessThread
- * Class for executing systen commands
+ * Class for executing system commands
*/
// ================================================================
static QMutex myMutex(false);
// ================================================================
/*!
- * DefineDependeces [ static ]
- * Defines list of dependancies as string separated by space symbols
+ * getAllProducts [ static ]
+ * Defines list of all products as a string separated by space symbols
*/
// ================================================================
-static QString DefineDependeces(MapProducts& theProductsMap)
+static QString getAllProducts(MapProducts& theProductsMap)
{
- QStringList aProducts;
+ QStringList aModules, aPrereqs;
for ( MapProducts::Iterator mapIter = theProductsMap.begin(); mapIter != theProductsMap.end(); ++mapIter ) {
QCheckListItem* item = mapIter.key();
Dependancies dep = mapIter.data();
- QStringList deps = dep.getDependancies();
- for (int i = 0; i<(int)deps.count(); i++ ) {
- if ( !aProducts.contains( deps[i] ) ) {
- aProducts.append( deps[i] );
- aProducts.append( deps[i] + "_src" );
+ QString curModule = item->text(0);
+ if ( !aModules.contains( curModule ) && !aPrereqs.contains( curModule ) ) {
+ if ( dep.getType() == "component" ) {
+ aModules.append( curModule );
+ aModules.append( curModule + "_src" );
+ }
+ else {
+ aPrereqs.append( curModule );
+ aPrereqs.append( curModule + "_src" );
}
- }
- if ( !aProducts.contains( item->text(0) ) ) {
- aProducts.append( item->text(0) );
- aProducts.append( item->text(0) + "_src" );
}
}
- return aProducts.join(" ");
+ return QStringList(aPrereqs+aModules).join(" ");
}
// ================================================================
QFileInfo fi( aDir.left( start ) );
if ( !fi.exists() ) {
// VSR: Create directory and set permissions to allow other users to remove it
- QString script = "mkdir " + fi.absFilePath();
- script += "; chmod 777 " + fi.absFilePath();
- script += " > /dev/null";
- if ( system( script.latin1() ) )
+ Script script;
+ script << "mkdir" << QUOTE( fi.absFilePath() );
+#ifdef USE_DEV_NULL
+ script << ">& /dev/null";
+#endif
+ script << "&&";
+ script << "chmod 777" << QUOTE( fi.absFilePath() );
+#ifdef USE_DEV_NULL
+ script << ">& /dev/null";
+#endif
+ ___MESSAGE___( "script = " << script.script().latin1() );
+ if ( system( script.script().latin1() ) )
return false;
// VSR: Remember the top of the created directory (to remove it in the end of the installation)
if ( theCreated.isNull() )
}
if ( !QFileInfo( aDir ).exists() ) {
// VSR: Create directory, other users should NOT have possibility to remove it!!!
- QString script = "mkdir " + aDir;
- script += " > /dev/null";
- if ( system( script.latin1() ) )
+ Script script;
+ script << "mkdir" << QUOTE( aDir );
+#ifdef USE_DEV_NULL
+ script << ">& /dev/null";
+#endif
+ ___MESSAGE___( "script = " << script.script().latin1() );
+ if ( system( script.script().latin1() ) )
return false;
// VSR: Remember the top of the created directory (to remove it in the end of the installation)
if ( theCreated.isNull() )
* Creates HTML-wrapped title text
*/
// ================================================================
-QString makeTitle( const QString& text, const QString& separator = " ", bool fl = true )
+static QString makeTitle( const QString& text, const QString& separator = " ", bool fl = true )
{
QStringList words = QStringList::split( separator, text );
if ( fl ) {
.arg( __IW_VERSION_MINOR__ ) \
.arg( __IW_VERSION_PATCH__ ) );
QLabel* copyright = new QLabel( this, "copyright" );
- copyright->setText( "<b>Copyright</b> © 2004-2007 CEA" );
+ copyright->setText( "<b>Copyright</b> © 2007-2011 CEA/DEN" );
QFont font = title->font();
font.setPointSize( (int)( font.pointSize() * 1.8 ) );
title->setFont( font );
QFontMetrics fm( title->font() );
int width = (int)( fm.width( tlt ) * 1.5 );
title->setMinimumWidth( width );
- setMaximumSize( minimumSize() );
+// setMaximumSize( minimumSize() );
}
void mousePressEvent( QMouseEvent* )
{
// ================================================================
SALOME_InstallWizard::SALOME_InstallWizard(const QString& aXmlFileName,
const QString& aTargetDir,
- const QString& aTmpDir)
+ const QString& aTmpDir,
+ const bool aForceSrc,
+ const bool aSingleDir)
: InstallWizard( qApp->desktop(), "SALOME_InstallWizard", false, 0 ),
helpWindow( NULL ),
moreMode( false ),
xmlFileName = aXmlFileName;
myTargetPath = aTargetDir;
myTmpPath = aTmpDir;
+ forceSrc = aForceSrc;
+ singleDir = aSingleDir;
stateChanged = true;
- binPath = QDir::currentDirPath() + "/Products/BINARIES";
- srcPath = QDir::currentDirPath() + "/Products/SOURCES";
+
+ QDir rootDir( rootDirPath() );
+ binPath = rootDir.filePath( "Products/BINARIES" );
+ srcPath = rootDir.filePath( "Products/SOURCES" );
+ oneProdDirName = "PRODUCTS";
- singleBinPlts << "Debian4.0"
- << "Debian3.1"
- << "Mandriva2006.0"
- << "Mandriva2007.0"
- << "Mandriva2008.0"
- << "Mandriva2006.0_64";
- commonPlatform = "Debian3.1";
+ commonPlatform = "Debian 3.1";
//
// get XML filename and current platform
//
// ... get current platform
- curPlatform = currentPlatform();
-// cout << "curOS = " << curPlatform << endl;
-// curPlatform = "";
+ curPlatform = currentPlatform().join(" ");
+ //cout << "curOS = " << curPlatform << endl;
+ refPlatform = "";
// ... check XML and platform definition
getXmlAndPlatform();
addLogo( pixmap( pxLogo ) );
// set defaults
- setVersion( "4.0.0" );
+ setVersion( "6.3.0" );
setCaption( tr( "SALOME %1" ).arg( myVersion ) );
- setCopyright( tr( "Copyright (C) 2007 CEA" ) );
- setLicense( tr( "All rights reserved." ) );
+ setCopyright( tr( "<h5>Copyright © 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE<br></h5>"
+ "<h5>Copyright © 2003-2007 OPEN CASCADE,<br>EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&D,<br>LEG, PRINCIPIA R&D, BUREAU VERITAS</h5>" ));
+ setLicense( tr( "<h5>GNU LGPL</h5>" ) );
___MESSAGE___( "Configuration file : " << xmlFileName.latin1() );
___MESSAGE___( "Target directory : " << myTargetPath.latin1() );
// create instance of class for starting shell script to get available disk space
diskSpaceProc = new QProcess( this, "procDiskSpace" );
- connect( diskSpaceProc, SIGNAL( processExited() ), this, SLOT( updateAvailableSpace() ) );
-
// create instance of class for starting shell install script
shellProcess = new QProcess( this, "shellProcess" );
-
+ // create instance of class for starting shell script to modify SALOME *.la files
+ modifyLaProc = new QProcess( this, "modifyLaProc" );
// create instance of class for starting shell script to check Fortran libraries
checkFLibProc = new QProcess( this, "checkFLibProc" );
- connect(checkFLibProc, SIGNAL( processExited() ), this, SLOT( checkFLibResult() ) );
// create introduction page
setupIntroPage();
connect( this, SIGNAL( helpClicked() ), this, SLOT( helpClicked() ) );
connect( this, SIGNAL( aboutClicked() ), this, SLOT( onAbout() ) );
- // catch signals from launched script
+ // catch signals from launched diskSpaceProc
+ connect( diskSpaceProc, SIGNAL( processExited() ), this, SLOT( updateAvailableSpace() ) );
+ // catch signals from launched shellProcess
connect(shellProcess, SIGNAL( readyReadStdout() ), this, SLOT( readFromStdout() ) );
connect(shellProcess, SIGNAL( readyReadStderr() ), this, SLOT( readFromStderr() ) );
connect(shellProcess, SIGNAL( processExited() ), this, SLOT( productInstalled() ) );
connect(shellProcess, SIGNAL( wroteToStdin() ), this, SLOT( wroteToStdin() ) );
+ // catch signals from launched modifyLaProc
+ connect(modifyLaProc, SIGNAL( readyReadStdout() ), this, SLOT( readFromStdout() ) );
+ connect(modifyLaProc, SIGNAL( readyReadStderr() ), this, SLOT( readFromStderr() ) );
+ connect(modifyLaProc, SIGNAL( processExited() ), this, SLOT( checkModifyLaResult() ) );
+ // catch signals from launched checkFLibProc
+ connect(checkFLibProc, SIGNAL( processExited() ), this, SLOT( checkFLibResult() ) );
// create validation thread
myThread = new ProcessThread( this );
SALOME_InstallWizard::~SALOME_InstallWizard()
{
shellProcess->kill(); // kill it for sure
- QString script = "kill -9 ";
int PID = (int)shellProcess->processIdentifier();
if ( PID > 0 ) {
- script += QString::number( PID );
- script += " > /dev/null";
- ___MESSAGE___( "script: " << script.latin1() );
- if ( system( script.latin1() ) ) {
+ Script script;
+ script << "kill -9" << QString::number( PID );
+#ifdef USE_DEV_NULL
+ script << ">& /dev/null";
+#endif
+ ___MESSAGE___( "script: " << script.script().latin1() );
+ if ( system( script.script().latin1() ) ) {
+ // error
}
}
delete myThread;
QString SALOME_InstallWizard::getBasePlatform()
{
QString aBasePlt = "";
- if ( singleBinPlts.contains(curPlatform) )
+ if ( platformsMap.find( curPlatform ) != platformsMap.end() )
aBasePlt = curPlatform;
else
aBasePlt = commonPlatform;
* Tries to determine the current user's operating system
*/
// ================================================================
-QString SALOME_InstallWizard::currentPlatform()
+QStringList SALOME_InstallWizard::currentPlatform()
{
// file parsing
- QString curOS = "";
+ QString platName, platVersion, platArch;
QString osFileName = "/etc/issue";
if ( QFile::exists( osFileName ) ) {
QFile file( osFileName );
if ( file.open( IO_ReadOnly ) ) {
QTextStream stream( &file );
- QString str = stream.readLine();
+ QStringList lines = QStringList::split( "\n", stream.read() );
file.close();
- // line parsing
- QString pltName = "", platVersion = "", platBit = "";
- QRegExp rx( "(.*)[L|l]inux.*release\\s+([\\d.]*)" );
-// str = "Debian GNU/Linux 3.1 \n \l";
-// str = "Red Hat Enterprise Linux WS release 4 (Nahant)";
-// str = "Mandriva Linux release 2006.0 (Official) for x86_64";
- int pos = rx.search( str );
- if ( pos == -1 ) {// Debian case
- rx = QRegExp( "(.*)GNU/Linux\\s+([\\d.]*)" );
- pos = rx.search( str );
- }
- if ( pos > -1 ) {
- pltName = rx.cap( 1 );
- platVersion = rx.cap( 2 );
- rx = QRegExp( "x86_64" );
- pos = rx.search( str );
- if ( pos > -1 )
- platBit = "_64";
- curOS = pltName + platVersion + platBit;
+ for ( uint i = 0; i < lines.count(); i++ ) {
+ QString str = lines[i];
+ if ( str.isEmpty() ) continue;
+ // parse line
+ QRegExp regvar = QRegExp( "(.*)\\s+[^\\s]*[R|r]elease[^\\s]*\\s+([\\d.]*)" );
+ int pos = regvar.search( str );
+ if ( pos == -1 ) {
+ regvar = QRegExp( "(.*)\\s+[^\\s]*[L|l][I|i][N|n][U|u][X|x][^\\s]*(.*)\\s+([\\d.]*)\\s+" );
+ pos = regvar.search( str );
+ }
+ if ( pos >= 0 ) {
+ QStringList name;
+ for ( int i = 1; i < regvar.numCaptures(); i++ )
+ name.append( regvar.cap( i ) );
+
+ // retrieve platform name
+ platName = QStringList::split( " ", name.join( " " ) ).join( " " );
+ platName = platName.replace( "Linux", "" ).replace( "linux", "" ).replace( "LINUX", "" ).stripWhiteSpace();
+ platName = platName.replace( "Welcome to", "" ).stripWhiteSpace();
+ platName = QStringList::split( " ", platName ).join( " " );
+ // retrieve platform version number
+ platVersion = regvar.cap( regvar.numCaptures() );
+ // retrieve platform
+ utsname uname_data;
+ uname( &uname_data );
+ if ( QString( uname_data.machine ) == "x86_64" )
+ platArch = "64bit";
+ break;
+ }
}
}
}
- // return curOS.remove( " " );
- QString str( " " );
- int index = 0;
- while ( (index = curOS.find( str, index, true)) != -1 )
- curOS.remove( index, str.length() );
- return curOS;
+ QStringList vals;
+ if ( !platName.isEmpty() ) vals.append( platName );
+ if ( !platVersion.isEmpty() ) vals.append( platVersion );
+ if ( !platArch.isEmpty() ) vals.append( platArch );
+ return vals;
}
+
+// ================================================================
+/*!
+ * SALOME_InstallWizard::rootDirPath
+ * Get application root dir
+ */
+// ================================================================
+QString SALOME_InstallWizard::rootDirPath()
+{
+ static QString rootDir;
+ if ( rootDir.isEmpty() ) {
+ QDir appDir( qApp->applicationDirPath() );
+ appDir.cdUp();
+ rootDir = appDir.absPath();
+ }
+ return rootDir;
+}
+
+// ================================================================
+/*!
+ * SALOME_InstallWizard::getPlatformBinPath
+ * Get platform binaries path
+ */
+// ================================================================
+QString SALOME_InstallWizard::getPlatformBinPath( const QString& plt ) const
+{
+ return QDir::cleanDirPath( getBinPath() + "/" + QStringList::split( " ", plt ).join( "_" ) );
+}
+
// ================================================================
/*!
* SALOME_InstallWizard::getXmlMap
* corresponding XML files.
*/
// ================================================================
-MapXmlFiles SALOME_InstallWizard::getXmlMap( const QString& xmlFileName )
+MapXmlFiles SALOME_InstallWizard::getXmlMap( const QString& aXmlFileName )
{
MapXmlFiles xmlMap;
QStringList xmlList;
- if ( xmlFileName )
- xmlList.append( xmlFileName );
+ if ( !aXmlFileName.isEmpty() )
+ xmlList.append( QFileInfo( aXmlFileName ).absFilePath() );
else {
- QDir dir( QDir::currentDirPath() );
- xmlList = dir.entryList( "*.xml", QDir::Files | QDir::Readable );
+ QDir dir( rootDirPath() );
+ QStringList entries = dir.entryList( "*.xml", QDir::Files | QDir::Readable );
+ if ( entries.remove( "config.xml" ) )
+ entries.append( "config.xml" );
+ for ( uint i = 0; i < entries.count(); i++ )
+ xmlList.append( QDir( rootDirPath() ).filePath( entries[i] ) );
}
-// cout << xmlList.join(",") << endl;
// XML files parsing
QFile file;
QDomDocument doc( "xml_doc" );
platforms = elem.attribute( "platforms" ).stripWhiteSpace();
QStringList platList = QStringList::split( ",", platforms );
for ( uint j = 0; j < platList.count(); j++ ) {
- if ( !platList[j].isEmpty() && xmlMap.find( platList[j] ) == xmlMap.end() )
+ QString platform = platList[j].stripWhiteSpace();
+ if ( !platform.isEmpty() && xmlMap.find( platform ) == xmlMap.end() )
xmlMap[ platList[j] ] = xmlList[i];
}
-// if ( !curPlatform.isEmpty() && xmlMap.find( curPlatform ) != xmlMap.end() )
-// return xmlMap;
}
}
}
void SALOME_InstallWizard::getXmlAndPlatform()
{
MapXmlFiles xmlMap;
- if ( xmlFileName.isNull() ) {
+ if ( xmlFileName.isEmpty() ) {
xmlMap = getXmlMap();
if ( !curPlatform.isEmpty() ) {
// try to get XML file for current platform
if ( xmlMap.find( curPlatform ) != xmlMap.end() ) {
- xmlFileName = xmlMap[ getBasePlatform() ];
- QFileInfo fibp( QDir::cleanDirPath( getBinPath() + "/" + getBasePlatform() ) );
+ xmlFileName = xmlMap[ curPlatform ];
+ QFileInfo fibp( getPlatformBinPath( curPlatform ) );
if ( !fibp.isDir() ) {
warnMsg = tr( "Binaries are absent for current platform" );
}
else {
// get all supported platforms
platformsMap = xmlMap;
- warnMsg = tr( "Install Wizard can't define your Linux platform" );
+ warnMsg = tr( "Installation Wizard can't identify target Linux platform" );
}
}
else {
platformsMap.insert( it.key(), it.data(), true );
warnMsg = tr( "The given configuration file doesn't support your Linux platform" );
}
+ else {
+ platformsMap = xmlMap;
+ }
}
else {
// get all supported platforms
MapXmlFiles::Iterator it;
for ( it = xmlMap.begin(); it != xmlMap.end(); ++it )
platformsMap.insert( it.key(), it.data(), true );
- warnMsg = tr( "Install Wizard can't define your Linux platform" );
+ warnMsg = tr( "Installation Wizard can't define your Linux platform" );
}
}
}
progressView = new ProgressView( widget );
progressView->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) );
progressView->setMinimumSize( 100, 10 );
+ // possibility to ignore all errors
+ ignoreErrCBox = new QCheckBox( tr( "Ignore errors" ), widget );
+ setAboutInfo( ignoreErrCBox, tr( "Check this option if you want to proceed installation \nprocess even there will be some errors" ) );
+ ignoreErrCBox->setChecked( false );
+ // product installation status bar
statusLab = new QLabel( widget );
statusLab->setFrameShape( QButtonGroup::LineEditPanel );
setAboutInfo( progressView, tr( "Installation status on the selected products" ) );
// layouting
layout->addRowSpacing( 0, 6 );
- layout->addWidget( resultLab, 1, 0 );
- layout->addWidget( progressView, 2, 0 );
- layout->addWidget( statusLab, 3, 0 );
+ layout->addWidget( resultLab, 1, 0 );
+ layout->addWidget( progressView, 2, 0 );
+ layout->addWidget( ignoreErrCBox, 3, 0 );
+ layout->addWidget( statusLab, 4, 0 );
// layouting
pageLayout->addWidget( splitter, 0, 0 );
// adding page
pageLayout->addLayout( hLayout );
// loading README file
- QString readmeFile = QDir::currentDirPath() + "/README";
+ QString readmeFile = QDir( rootDirPath() ).filePath( "README" );
QString text;
if ( readFile( readmeFile, text ) )
readme->setText( text );
if ( installType == Binaries ) { // 'Binary' installation type
// check binaries directory
QFileInfo fib( QDir::cleanDirPath( getBinPath() ) );
- if ( !fib.exists() ) {
+ if ( !fib.isDir() ) {
QMessageBox::warning( this,
tr( "Warning" ),
tr( "The directory %1 doesn't exist.\n"
}
else {
// Supported platform case
- QString aPlatform = curPlatform;
- if ( curPlatform != getBasePlatform() ) {
- refPlatform = getBasePlatform();
- xmlFileName = platformsMap[ refPlatform ];
- aPlatform = getPlatform();
- }
- QFileInfo fibp( QDir::cleanDirPath( getBinPath() + "/" + aPlatform ) );
+ QFileInfo fibp( getPlatformBinPath( curPlatform ) );
if ( !fibp.isDir() ) {
warnLab->setText( tr( "Binaries are absent for current platform." ) );
this->setAppropriate( platformsPage, true );
// check sources directory
QFileInfo fis( QDir::cleanDirPath( getSrcPath() ) );
- if ( !fis.exists() )
+ if ( !fis.isDir() )
if ( QMessageBox::warning( this,
tr( "Warning" ),
tr( "The directory %1 doesn't exist.\n"
else { // 'Source' or 'Compile' installation type
// check sources directory
QFileInfo fis( QDir::cleanDirPath( getSrcPath() ) );
- if ( !fis.exists() ) {
+ if ( !fis.isDir() ) {
QMessageBox::warning( this,
tr( "Warning" ),
tr( "The directory %1 doesn't exist.\n"
QMessageBox::NoButton );
return false;
}
+ else if ( !QDir( fis.filePath(), "*.tar.gz" ).count() ) {
+ QMessageBox::warning( this,
+ tr( "Warning" ),
+ tr( "The directory %1 doesn't contain source archives.\n" ).arg( fis.absFilePath() ),
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton );
+ return false;
+ }
if ( platformsMap.find( curPlatform ) == platformsMap.end() ) {
QString aMsg = warnMsg + ".";
if ( installType == Compile )
QMessageBox::NoButton );
return false;
}
+ else if ( installType == Binaries ) {
+ QString aPlatform = platBtnGrp->selected()->name();
+ QFileInfo fib( getPlatformBinPath( aPlatform ) );
+ if ( !fib.isDir() ) {
+ QMessageBox::warning( this,
+ tr( "Warning" ),
+ tr( "The directory %1 doesn't exist.\n"
+ "This directory must contains binary archives.\n" ).arg( fib.absFilePath() ),
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton );
+ return false;
+ }
+ else if ( QDir( fib.filePath(), "*.tar.gz" ).count() == 0 ) {
+ QMessageBox::warning( this,
+ tr( "Warning" ),
+ tr( "The directory %1 doesn't contain binary archives.\n" ).arg( fib.absFilePath() ),
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton );
+ return false;
+ }
+ }
}
else if ( aPage == dirPage ) {
return false;
}
QFileInfo fi( QDir::cleanDirPath( targetDir ) );
- if ( !fi.exists() ) {
+ if ( !fi.isDir() ) {
bool toCreate =
QMessageBox::warning( this,
tr( "Warning" ),
return false;
}
// run script that checks available disk space for installing of products // returns 1 in case of error
+ QDir rd( rootDirPath() );
QFileInfo fi( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) );
- QString script = "./config_files/checkSize.sh '";
- script += fi.absFilePath();
- script += "' ";
- script += QString( "%1" ).arg( totSize );
- ___MESSAGE___( "script = " << script.latin1() );
- if ( system( script ) ) {
+ Script script;
+ script << QUOTE( rd.filePath( "config_files/checkSize.sh" ) );
+ script << QUOTE( fi.absFilePath() ) << QString::number( totSize );
+ ___MESSAGE___( "script = " << script.script().latin1() );
+ if ( system( script.script().latin1() ) ) {
QMessageBox::critical( this,
tr( "Out of space" ),
tr( "There is no available disk space for installing of selected products" ),
// run script that check available disk space for temporary files
// returns 1 in case of error
QFileInfo fit( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) );
- QString tscript = "./config_files/checkSize.sh '";
- tscript += fit.absFilePath();
- tscript += "' ";
- tscript += QString( "%1" ).arg( tempSize );
- ___MESSAGE___( "script = " << tscript.latin1() );
- if ( system( tscript ) ) {
+ Script tscript;
+ tscript << QUOTE( rd.filePath( "config_files/checkSize.sh" ) );
+ tscript << QUOTE( fit.absFilePath() ) << QString::number( tempSize );
+ ___MESSAGE___( "script = " << tscript.script().latin1() );
+ if ( system( tscript.script().latin1() ) ) {
QMessageBox::critical( this,
tr( "Out of space" ),
tr( "There is no available disk space for the temporary files" ),
}
// check installation script existence
else {
- QFileInfo fi( QString("./config_files/") + item->text(2) );
+ QDir rd( rootDirPath() );
+ QFileInfo fi( rd.filePath( QString( "config_files/%1" ).arg( item->text(2) ) ) );
if ( !fi.exists() || !fi.isExecutable() ) {
QMessageBox::warning( this,
tr( "Error" ),
- tr( "The script %1 required for %2 doesn't exist or doesn't have execute permissions.").arg("./config_files/" + item->text(2)).arg(item->text(0)),
+ tr( "The script %1 required for %2 doesn't exist or doesn't have execute permissions.").arg(fi.filePath()).arg(item->text(0)),
QMessageBox::Ok,
QMessageBox::NoButton,
QMessageBox::NoButton );
availableSize->setText( diskSpaceProc->readLineStdout() + " KB");
}
// ================================================================
+/*!
+ * SALOME_InstallWizard::runModifyLaFiles
+ * Run the modification of SALOME *.la files
+ */
+// ================================================================
+void SALOME_InstallWizard::runModifyLaFiles()
+{
+ modifyLaProc->clearArguments();
+ // ... update status label
+ statusLab->setText( tr( "Modification of *.la files of SALOME modules..." ) );
+ // set process arguments
+ modifyLaProc->setWorkingDirectory( QDir( rootDirPath() ).filePath( "config_files" ) );
+ modifyLaProc->addArgument( "modifyLaFiles.sh" );
+ modifyLaProc->addArgument( "modify_la_files" );
+ modifyLaProc->addArgument( QDir::cleanDirPath( QFileInfo( targetFolder->text().stripWhiteSpace() ).absFilePath() ) );
+ // ... run script
+ if ( !modifyLaProc->start() )
+ ___MESSAGE___( "Error: process could not start!" );
+}
+// ================================================================
+/*!
+ * SALOME_InstallWizard::checkModifyLaResult
+ * Slot to take result of modification SALOME *.la files
+ */
+// ================================================================
+void SALOME_InstallWizard::checkModifyLaResult()
+{
+ if ( modifyLaProc->normalExit() && modifyLaProc->exitStatus() == 1 )
+ runCheckFLib();
+ else {
+ // abort of the current installation
+ abort();
+ statusLab->setText( tr( "Installation has been aborted" ) );
+ QMessageBox::critical( this,
+ tr( "Error" ),
+ tr( "Modification of *.la SALOME files has not been completed."),
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton );
+ // enable <Next> button
+ setNextEnabled( true );
+ doPostActions( tr( "&Start" ), tr( "Start installation process" ) );
+ connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ // enable <Back> button
+ setBackEnabled( true );
+ }
+}
+// ================================================================
+/*!
+ * SALOME_InstallWizard::runCheckFLib
+ * Run the Fortran and other required libraries checking
+ */
+// ================================================================
+void SALOME_InstallWizard::runCheckFLib()
+{
+ // Check Fortran libraries
+ checkFLibProc->clearArguments();
+ // ... update status label
+ statusLab->setText( tr( "Check Fortran and other required libraries..." ) );
+ // ... search "not found" libraries
+ checkFLibProc->setWorkingDirectory( QDir( rootDirPath() ).filePath( "config_files" ) );
+ checkFLibProc->addArgument( "checkFortran.sh" );
+ checkFLibProc->addArgument( "find_libraries" );
+ checkFLibProc->addArgument( QDir::cleanDirPath( QFileInfo( targetFolder->text().stripWhiteSpace() ).absFilePath() ) );
+ // ... run script
+ if ( !checkFLibProc->start() )
+ ___MESSAGE___( "Error: process could not start!" );
+}
+// ================================================================
/*!
* SALOME_InstallWizard::checkFLibResult
- * Slot to take result of Fortran libraries checking
+ * Slot to take result of Fortran and other required libraries checking
*/
// ================================================================
void SALOME_InstallWizard::checkFLibResult()
{
if ( checkFLibProc->normalExit() && checkFLibProc->exitStatus() == 1 ) {
- QStringList notFoundLibsList;
+ QStringList notFoundLibsList, notFoundOptLibsList;
QString record = "";
+ QStringList prefOptLibs = getOptionalLibs();
+ // create list of strings with all 'not found' libraries
while ( checkFLibProc->canReadLineStdout() ) {
- record = checkFLibProc->readLineStdout();
- if ( !record.isEmpty() && !notFoundLibsList.contains( record ) )
- notFoundLibsList.append( record );
- }
- QMessageBox::warning( this,
- tr( "Warning" ),
- tr( "The following libraries are absent on current system:\n"
- "%1").arg( notFoundLibsList.join( "\n" ) ),
- QMessageBox::Ok,
- QMessageBox::NoButton,
- QMessageBox::NoButton );
+ record = checkFLibProc->readLineStdout().stripWhiteSpace();
+ if ( !record.isEmpty() ) {
+ record = QStringList::split( " ", record )[0];
+ if ( !notFoundLibsList.contains( record ) &&
+ !notFoundOptLibsList.contains( record ) ) {
+ bool isOptional = false;
+ QStringList::Iterator it_opt;
+ for ( it_opt = prefOptLibs.begin(); it_opt != prefOptLibs.end(); ++it_opt )
+ if ( record.startsWith( (*it_opt).stripWhiteSpace(), false ) ) {
+ isOptional = true;
+ break;
+ }
+ isOptional ? notFoundOptLibsList.append( record ) \
+ : notFoundLibsList.append( record );
+ }
+ }
+ }
+ QString msg = tr( "Some libraries are absent!<br><br>" );
+ if ( !notFoundLibsList.isEmpty() ) {
+ msg += tr( "One or several <b>mandatory</b> libraries listed below are not found. SALOME <u>may not work</u> properly.<br>" );
+ msg += notFoundLibsList.join( "<br>" );
+ msg += "<br><br>";
+ }
+ if ( !notFoundOptLibsList.isEmpty() ) {
+ msg += tr( "One or several <b>optional</b> libraries listed below are not found. This <u>does not affect</u> on the correct work of SALOME platform.<br>" );
+ msg += notFoundOptLibsList.join( "<br>" );
+ }
+ if ( !notFoundLibsList.isEmpty() )
+ QMessageBox::warning( this,
+ tr( "Warning" ),
+ msg,
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton );
+ else if ( !notFoundOptLibsList.isEmpty() )
+ QMessageBox::information( this,
+ tr( "Information" ),
+ msg,
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton );
}
// Update GUI and check installation errors
completeInstallation();
QFileInfo fi( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) );
if ( fi.exists() ) {
diskSpaceProc->clearArguments();
- QString script = "./config_files/diskSpace.sh";
- diskSpaceProc->addArgument( script );
+ diskSpaceProc->setWorkingDirectory( QDir( rootDirPath() ).filePath( "config_files" ) );
+ diskSpaceProc->addArgument( "diskSpace.sh" );
diskSpaceProc->addArgument( fi.absFilePath() );
// run script
diskSpaceProc->start();
return;
// get all prerequisites
QStringList dependOn = productsMap[ item ].getDependancies();
- // install MED without GUI case
- if ( installGuiBtn->state() != QButton::On && item->text(0) == "MED" ) {
+ // install SALOME without GUI case
+ if ( installGuiBtn->state() != QButton::On &&
+ woGuiModules.find( item->text(0) ) != woGuiModules.end() &&
+ woGuiModules[item->text(0)] == True ) {
dependOn.remove( "GUI" );
}
// setting prerequisites
itProd.key()->setOn( true );
itProd.key()->setEnabled( false );
}
+ break;
}
}
}
for ( itProd = productsMap.begin(); itProd != productsMap.end(); ++itProd ) {
if ( itProd.data().getType() == productsMap[ item ].getType() ) {
QStringList dependOn = itProd.data().getDependancies();
- // install MED without GUI case
- if ( installGuiBtn->state() != QButton::On &&
- itProd.data().getName() == "MED" &&
- itemName != "KERNEL" ) {
- continue;
- }
for ( int i = 0; i < (int)dependOn.count(); i++ ) {
if ( dependOn[ i ] == itemName ) {
if ( itProd.key()->isOn() ) {
for ( int k = 0; k < (int)prereqsList.count(); k++ ) {
if ( prereqsList[ k ] == itProd1.data().getName() ) {
nbDependents++;
+ break;
}
}
}
itProd1.key()->setOn( false );
}
}
+ break;
}
}
}
progressView->setStatus( prodProc, Processing );
progressView->ensureVisible( prodProc );
- QCheckListItem* item;
+ QCheckListItem* item = 0;
// fill in script parameters
shellProcess->clearArguments();
// ... script name
- shellProcess->setWorkingDirectory( QDir::cleanDirPath( QFileInfo( "./config_files/" ).absFilePath() ) );
+ shellProcess->setWorkingDirectory( QDir( rootDirPath() ).filePath( "config_files" ) );
if ( !extraProducts.contains( prodProc ) ) {
item = findItem( prodProc );
shellProcess->addArgument( item->text(2) );
shellProcess->addArgument( extraProducts[ prodProc ] );
// ... get folder with binaries
- QString binDir = QDir::cleanDirPath( getBinPath() );
QString OS = getPlatform();
- if ( refPlatform.isEmpty() && singleBinPlts.contains(curPlatform) == 0 )
+ if ( refPlatform.isEmpty() && platformsMap.find( curPlatform ) == platformsMap.end() )
OS = commonPlatform;
- binDir += "/" + OS;
+ QString binDir = getPlatformBinPath( OS );
// ... temp folder
QString tmpFolder = QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME;
//if( !tempFolder->isEnabled() )
if ( notInstall.contains( prodProc ) || prodProc == "gcc" ) {
shellProcess->addArgument( "try_preinstalled" );
shellProcess->addArgument( QFileInfo( tmpFolder ).absFilePath() );
- shellProcess->addArgument( QDir::currentDirPath() + "/Products" );
+ shellProcess->addArgument( QDir( rootDirPath() ).filePath( "Products" ) );
statusLab->setText( tr( "Collecting environment for '" ) + prodProc + "'..." );
}
// ... binaries ?
QString tgtFolder = QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() );
shellProcess->addArgument( QFileInfo( tgtFolder ).absFilePath() );
// ... list of all products
- QString depproducts = DefineDependeces(productsMap);
+ QString depproducts = getAllProducts(productsMap);
depproducts.prepend( QStringList( extraProducts.keys() ).join(" ") + " " );
___MESSAGE___( "Dependancies"<< depproducts.latin1() );
shellProcess->addArgument( depproducts );
shellProcess->addArgument( "FALSE" );
// ... binaries directory
shellProcess->addArgument( binDir );
- // ... install MED with GUI or not?
- if ( prodProc == "MED" ) {
- if ( installGuiBtn->state() != QButton::On && prodProc == "MED" )
- shellProcess->addArgument( "FALSE" );
- else
+ // ... install SALOME with GUI or not?
+ if ( woGuiModules.find( prodProc ) != woGuiModules.end() )
+ ( installGuiBtn->state() != QButton::On && woGuiModules[ prodProc ] == True ) ?
+ shellProcess->addArgument( "FALSE" ) :
shellProcess->addArgument( "TRUE" );
- }
// ... single installation directory for SALOME modules, if this option was selected
if ( oneModDirBtn->isChecked() ) {
MapProducts::Iterator mapIter;
for ( mapIter = productsMap.begin(); mapIter != productsMap.end(); ++mapIter )
- if ( mapIter.data().getName() == prodProc && mapIter.data().getType() == "component" )
- shellProcess->addArgument( "SALOME" );
+ if ( mapIter.data().getName() == prodProc && mapIter.data().getType() == "component" ) {
+ shellProcess->addArgument( "TRUE" );
+ break;
+ }
}
// ... single installation directory for prerequisites, if this option was selected
if ( oneProdDirBtn->isChecked() ) {
if ( prodProc == "DebianLibsForSalome" )
- shellProcess->addArgument( "PRODUCTS" );
+ shellProcess->addArgument( oneProdDirName );
else {
MapProducts::Iterator mapIter;
for ( mapIter = productsMap.begin(); mapIter != productsMap.end(); ++mapIter )
- if ( mapIter.data().getName() == prodProc && mapIter.data().getType() == "prerequisite" )
- shellProcess->addArgument( "PRODUCTS" );
+ if ( mapIter.data().getName() == prodProc && mapIter.data().getType() == "prerequisite" ) {
+ shellProcess->addArgument( oneProdDirName );
+ break;
+ }
}
}
}
return;
}
+
+ // else try to find aborted product
+ prodProc = progressView->findStatus( Aborted );
+ if ( !prodProc.isNull() )
+ return; // installation has been aborted
+
___MESSAGE___( "All products have been installed successfully" );
// all products are installed successfully
MapProducts::Iterator mapIter;
___MESSAGE___( "starting pick-up environment" );
- QString depproducts = QUOTE( DefineDependeces(productsMap).prepend( QStringList( extraProducts.keys() ).join(" ") + " " ) );
+ QString depproducts = QUOTE( getAllProducts(productsMap).prepend( QStringList( extraProducts.keys() ).join(" ") + " " ) );
for ( mapIter = productsMap.begin(); mapIter != productsMap.end(); ++mapIter ) {
QCheckListItem* item = mapIter.key();
Dependancies dep = mapIter.data();
if ( item->isOn() && dep.pickUpEnvironment() ) {
statusLab->setText( tr( "Pick-up products environment for " ) + dep.getName().latin1() + "..." );
___MESSAGE___( "... for " << dep.getName().latin1() );
- QString script;
- script += "cd " + QUOTE( QFileInfo( QDir::cleanDirPath( "./config_files/" ) ).absFilePath() ) + "; ";
- script += item->text(2) + " ";
- script += "pickup_env ";
- script += QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() ) + " ";
- script += QUOTE( QFileInfo( QDir::cleanDirPath( QDir::currentDirPath() + "/Products" ) ).absFilePath() ) + " ";
- script += QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() ) + " ";
- script += depproducts + " ";
- script += item->text(0) + " ";
- script += QUOTE( prodSequence.join( " " ) );
- ___MESSAGE___( "... --> " << script.latin1() );
- if ( system( script.latin1() ) ) {
+ QDir rd( rootDirPath() );
+ Script script;
+ script << "cd" << QUOTE( rd.filePath( "config_files" ) ) << ";";
+ script << item->text(2) << "pickup_env";
+ script << QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() );
+ script << QUOTE( QFileInfo( QDir::cleanDirPath( QDir( rootDirPath() ).filePath( "Products" ) ) ).absFilePath() );
+ script << QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() );
+ script << depproducts << item->text(0) << QUOTE( prodSequence.join( " " ) );
+ ___MESSAGE___( "... --> " << script.script().latin1() );
+ if ( system( script.script().latin1() ) ) {
___MESSAGE___( "ERROR" );
}
}
}
-
+
if ( installType == Binaries ) {
- // Check Fortran libraries
- // ... update status label
- statusLab->setText( tr( "Check Fortran libraries..." ) );
- // ... search "not found" libraries
- checkFLibProc->setWorkingDirectory( QDir::cleanDirPath( QFileInfo( "./config_files/" ).absFilePath() ) );
- checkFLibProc->addArgument( "checkFortran.sh" );
- checkFLibProc->addArgument( "find_libraries" );
- checkFLibProc->addArgument( QDir::cleanDirPath( QFileInfo( targetFolder->text().stripWhiteSpace() ).absFilePath() ) );
- // ... run script
- if ( !checkFLibProc->start() ) {
- ___MESSAGE___( "Error: process could not start!" );
- }
+ if ( oneModDirBtn->isChecked() )
+ runModifyLaFiles();
+ else
+ runCheckFLib();
}
- else
+ else {
// Update GUI and check installation errors
completeInstallation();
+ }
}
// ================================================================
statusLab->setText( tr( "Installation completed" ) );
// <Next> button
setNextEnabled( true );
- nextButton()->setText( tr( "&Next >" ) );
- setAboutInfo( nextButton(), tr( "Move to the next step of the installation procedure" ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Next >" ), tr( "Move to the next step of the installation procedure" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
// <Back> button
setBackEnabled( true );
if ( hasErrors ) {
if ( QMessageBox::warning( this,
tr( "Warning" ),
- tr( "There were some errors and/or warnings during the installation.\n"
+ tr( "There were some errors during the installation.\n"
"Do you want to save the installation log?" ),
tr( "&Save" ),
tr( "&Cancel" ),
}
else {
QString itemName = itProd.data().getName();
- if ( itemName != "KERNEL" && itemName != "MED" &&
- itemName != "SAMPLES" && itemName != "DOCUMENTATION" ) {
+ if ( woGuiModules.find( itemName ) == woGuiModules.end() ||
+ woGuiModules[ itemName ] == False ) {
itProd.key()->setOn( false );
itProd.key()->setEnabled( false );
}
ButtonList::Iterator it;
for ( it = buttons.begin(); it != buttons.end(); ++it ) {
if ( (*it).button() && (*it).button() == btn ) {
- QString script;
- script += "( cd " + QUOTE( QFileInfo( QDir::cleanDirPath( "./config_files/" ) ).absFilePath() ) + "; ";
- script += + (*it).script();
- script += " execute ";
- script += QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() ) + " ";
- script += QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() ) + " ";
- script += " > /dev/null )";
- ___MESSAGE___( "script: " << script.latin1() );
- if ( (*it).script().isEmpty() || system( script.latin1() ) ) {
+ QDir rd( rootDirPath() );
+ Script script;
+ script << "cd" << QUOTE( rd.filePath( "config_files" ) ) << ";";
+ script << (*it).script() << "execute";
+ script << QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() );
+ script << QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() );
+#ifdef USE_DEV_NULL
+ script << ">& /dev/null";
+#endif
+ ___MESSAGE___( "script: " << script.script().latin1() );
+ if ( (*it).script().isEmpty() || system( script.script().latin1() ) ) {
QMessageBox::warning( this,
tr( "Error" ),
tr( "Can't perform action!"),
myWC.wakeAll();
while ( myThread->running() );
// first remove temporary files
- QString script = "cd ./config_files/; remove_tmp.sh '";
- script += tempFolder->text().stripWhiteSpace() + TEMPDIRNAME;
- script += "' ";
- script += QUOTE(DefineDependeces(productsMap));
- script += " > /dev/null";
- ___MESSAGE___( "script = " << script.latin1() );
- if ( system( script.latin1() ) ) {
+ QDir rd( rootDirPath() );
+ Script script;
+ script << "cd" << QUOTE( rd.filePath( "config_files" ) ) << ";";
+ script << "remove_tmp.sh" << QUOTE( tempFolder->text().stripWhiteSpace() + TEMPDIRNAME );
+ script << QUOTE( getAllProducts( productsMap ) );
+#ifdef USE_DEV_NULL
+ script << ">& /dev/null";
+#endif
+ ___MESSAGE___( "script = " << script.script().latin1() );
+ if ( system( script.script().latin1() ) ) {
+ // error
}
// then try to remove created temporary directory
//script = "rm -rf " + QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME;
if ( rmDir && !tmpCreated.isNull() ) {
- script = "rm -rf " + tmpCreated;
- script += " > /dev/null";
- if ( system( script.latin1() ) ) {
+ script.clear();
+ script << "rm -rf" << QUOTE( tmpCreated );
+#ifdef USE_DEV_NULL
+ script << ">& /dev/null";
+#endif
+ if ( system( script.script().latin1() ) ) {
+ // error
}
- ___MESSAGE___( "script = " << script.latin1() );
+ ___MESSAGE___( "script = " << script.script().latin1() );
}
}
// ================================================================
// ================================================================
void SALOME_InstallWizard::pageChanged( const QString & mytitle)
{
- nextButton()->setText( tr( "&Next >" ) );
- setAboutInfo( nextButton(), tr( "Move to the next step of the installation procedure" ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Next >" ), tr( "Move to the next step of the installation procedure" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
cancelButton()->disconnect();
connect( cancelButton(), SIGNAL( clicked()), this, SLOT( reject() ) );
if ( aPage == typePage ) {
// installation type page
if ( buttonGrp->id( buttonGrp->selected() ) == -1 )
- binBtn->animateClick(); // set default installation type
+ // set default installation type
+ forceSrc ? srcCompileBtn->animateClick() : binBtn->animateClick();
+ else
+ buttonGrp->selected()->animateClick();
}
else if ( aPage == platformsPage ) {
// installation platforms page
QString plat = it.key();
QRadioButton* rb = ( (QRadioButton*) platBtnGrp->child( plat ) );
if ( installType == Binaries ) {
- QFileInfo fib( QDir::cleanDirPath( getBinPath() + "/" + plat ) );
- rb->setEnabled( fib.exists() );
+ QFileInfo fib( getPlatformBinPath( plat ) );
+ rb->setEnabled( true/*fib.isDir()*/ );
if ( platBtnGrp->id( platBtnGrp->selected() ) == -1 && plat == getBasePlatform() )
rb->animateClick();
}
- else {
- QFileInfo fis( QDir::cleanDirPath( getSrcPath() ) );
- rb->setEnabled( fis.exists() );
- }
- rb->setChecked( rb->isChecked() && rb->isEnabled() );
+// rb->setChecked( rb->isChecked() && rb->isEnabled() );
+ if ( rb->isChecked() && rb->isEnabled() )
+ rb->animateClick();
}
setNextEnabled( platformsPage, platBtnGrp->id( platBtnGrp->selected() ) != -1 );
}
if ( tempFolder->text().isEmpty() )
parser->setTempDir( tempFolder );
parser->readXmlFile( xmlFileName );
+ // create a map of SALOME modules names, that can support installation without GUI mode
+ if ( woGuiModules.isEmpty() ) {
+ MapProducts::Iterator mapIter;
+ for ( mapIter = productsMap.begin(); mapIter != productsMap.end(); mapIter++ ) {
+ Dependancies dep = mapIter.data();
+ if ( dep.getType() == "component" && dep.supportWoGuiMode() != NotDefined )
+ woGuiModules[ dep.getName() ] = dep.supportWoGuiMode();
+ }
+ }
+
// update required size for each product
updateSizeColumn();
// take into account command line parameters
}
// add extra products to install list
extraProducts.clear();
- extraProducts.insert( "gcc", "gcc-common.sh" );
+ //extraProducts.insert( "gcc", "gcc-common.sh" );
if ( refPlatform == commonPlatform && installType == Binaries )
extraProducts.insert( "DebianLibsForSalome", "DEBIANFORSALOME-3.1.sh" );
}
passedParams->clear();
passedParams->setEnabled( false );
QFont f = parametersLab->font(); f.setBold( false ); parametersLab->setFont( f );
- nextButton()->setText( tr( "&Start" ) );
- setAboutInfo( nextButton(), tr( "Start installation process" ) );
- // reconnect Next button - to use it as Start button
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Start" ), tr( "Start installation process" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
setNextEnabled( true );
// reconnect Cancel button to terminate process
ButtonList::Iterator it;
for ( it = buttons.begin(); it != buttons.end(); ++it ) {
if ( (*it).button() ) {
- QString script;
- script += "( cd " + QUOTE( QFileInfo( QDir::cleanDirPath( "./config_files/" ) ).absFilePath() ) + "; ";
- script += + (*it).script();
- script += " check_enabled ";
- script += QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() ) + " ";
- script += QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() ) + " ";
- script += " > /dev/null )";
- ___MESSAGE___( "script: " << script.latin1() );
- (*it).button()->setEnabled( !(*it).script().isEmpty() && !system( script.latin1() ) );
+ QDir rd( rootDirPath() );
+ Script script;
+ script << "cd" << QUOTE( rd.filePath( "config_files" ) ) << ";";
+ script << (*it).script() << "check_enabled";
+ script << QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() );
+ script << QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() );
+#ifdef USE_DEV_NULL
+ script << ">& /dev/null";
+#endif
+ ___MESSAGE___( "script: " << script.script().latin1() );
+ (*it).button()->setEnabled( !(*it).script().isEmpty() && !system( script.script().latin1() ) );
}
}
finishButton()->setEnabled( true );
installType = InstallationType( rbIndex );
// management of the <Remove source and tmp files> check-box
removeSrcBtn->setEnabled( installType == Compile );
- oneModDirBtn->setEnabled( installType == Binaries || installType == Compile );
+ oneModDirBtn->setEnabled( installType == Binaries /*|| installType == Compile*/ );
oneProdDirBtn->setEnabled( installType == Binaries || installType == Compile );
+ refPlatform = "";
+ xmlFileName = getXmlFile( curPlatform );
}
else if ( aPage == platformsPage ) {
refPlatform = platBtnGrp->find( rbIndex )->name();
- xmlFileName = platformsMap[ refPlatform ];
-// cout << xmlFileName << endl;
+ xmlFileName = getXmlFile( refPlatform );
setNextEnabled( platformsPage, true );
}
if ( prevType != installType ||
( indexOf( platformsPage ) != -1 ? prevPlat != getPlatform() : false ) ) {
stateChanged = true;
- oneModDirBtn->setChecked( false );
+ oneModDirBtn->setChecked( installType == Binaries && singleDir );
oneProdDirBtn->setChecked( false );
}
}
if ( nextButton()->text() == tr( "&Stop" ) ) {
statusLab->setText( tr( "Aborting installation..." ) );
shellProcess->kill();
+ modifyLaProc->kill();
while( shellProcess->isRunning() );
statusLab->setText( tr( "Installation has been aborted by user" ) );
return;
installInfo->setFinished( false );
passedParams->clear();
passedParams->setEnabled( false );
+ // disable 'Ignore errors' checkbox during installation process
+ ignoreErrCBox->setEnabled( false );
QFont f = parametersLab->font(); f.setBold( false ); parametersLab->setFont( f );
// update status label
item = (QCheckListItem*)( item->nextSibling() );
}
// if something at all is selected
- if ( (int)toInstall.count() > 1 ) {
+ if ( (int)toInstall.count() > 0 ) {
if ( installType == Compile ) {
// update status label
statusLab->setText( tr( "Check Fortran compiler..." ) );
// check Fortran compiler.
- QString script = "./config_files/checkFortran.sh find_compilers";
- script += " " + QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() );
- ___MESSAGE___( "script = " << script.latin1() );
- if ( system( script ) ) {
+ QDir rd( rootDirPath() );
+ Script script;
+ script << QUOTE( rd.filePath( "config_files/checkFortran.sh" ) ) << "find_compilers";
+ script << QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() );
+ ___MESSAGE___( "script = " << script.script().latin1() );
+ if ( system( script.script().latin1() ) ) {
QMessageBox::critical( this,
tr( "Error" ),
tr( "Fortran compiler was not found at current system!\n"
statusLab->setText( tr( "Installation has been aborted" ) );
// enable <Next> button
setNextEnabled( true );
- nextButton()->setText( tr( "&Start" ) );
- setAboutInfo( nextButton(), tr( "Start installation process" ) );
- // reconnect Next button - to use it as Start button
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Start" ), tr( "Start installation process" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
// enable <Back> button
setBackEnabled( true );
// create a backup of 'env_build.csh', 'env_build.sh', 'env_products.csh', 'env_products.sh'
// ( backup of 'salome.csh' and 'salome.sh' is made if pick-up environment is called )
- QString script = "./config_files/backupEnv.sh ";
- script += QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() );
- ___MESSAGE___( "script = " << script.latin1() );
- if ( system( script ) ) {
+ QDir rd( rootDirPath() );
+ Script script;
+ script << QUOTE( rd.filePath( "config_files/backupEnv.sh" ) );
+ script << QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() );
+ ___MESSAGE___( "script = " << script.script().latin1() );
+ if ( system( script.script().latin1() ) ) {
if ( QMessageBox::warning( this,
tr( "Warning" ),
tr( "Backup environment files have not been created.\n"
// installation aborted
abort();
statusLab->setText( tr( "Installation has been aborted by user" ) );
- // enable <Next> button
+ // update <Next> button
setNextEnabled( true );
- nextButton()->setText( tr( "&Start" ) );
- setAboutInfo( nextButton(), tr( "Start installation process" ) );
- // reconnect Next button - to use it as Start button
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Start" ), tr( "Start installation process" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
// enable <Back> button
setBackEnabled( true );
installInfo->setFinished( true );
// enable <Next> button
setNextEnabled( true );
- nextButton()->setText( tr( "&Start" ) );
- setAboutInfo( nextButton(), tr( "Start installation process" ) );
- // reconnect Next button - to use it as Start button
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Start" ), tr( "Start installation process" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
- //nextButton()->setText( tr( "&Next >" ) );
- //setAboutInfo( nextButton(), tr( "Move to the next step of the installation procedure" ) );
- //disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- //disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ //doPostActions( tr( "&Next >" ), tr( "Move to the next step of the installation procedure" ) );
//connect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
// enable <Back> button
setBackEnabled( true );
void SALOME_InstallWizard::onCancel()
{
shellProcess->kill();
+ modifyLaProc->kill();
+ checkFLibProc->kill();
reject();
}
// ================================================================
void SALOME_InstallWizard::readFromStdout( )
{
___MESSAGE___( "Something was sent to stdout" );
- while ( shellProcess->canReadLineStdout() ) {
- installInfo->append( QString( shellProcess->readLineStdout() ) );
+ QProcess* theProcess = ( QProcess* )sender();
+ while ( theProcess->canReadLineStdout() ) {
+ installInfo->append( QString( theProcess->readLineStdout() ) );
installInfo->scrollToBottom();
}
- QString str( shellProcess->readStdout() );
+ QString str( theProcess->readStdout() );
if ( !str.isEmpty() ) {
installInfo->append( str );
installInfo->scrollToBottom();
void SALOME_InstallWizard::readFromStderr( )
{
___MESSAGE___( "Something was sent to stderr" );
- while ( shellProcess->canReadLineStderr() ) {
- installInfo->append( OUTLINE_TEXT( QString( shellProcess->readLineStderr() ) ) );
+ QProcess* theProcess = ( QProcess* )sender();
+ while ( theProcess->canReadLineStderr() ) {
+ installInfo->append( OUTLINE_TEXT( QString( theProcess->readLineStderr() ) ) );
installInfo->scrollToBottom();
hasErrors = true;
}
- QString str( shellProcess->readStderr() );
+ QString str( theProcess->readStderr() );
if ( !str.isEmpty() ) {
installInfo->append( OUTLINE_TEXT( str ) );
installInfo->scrollToBottom();
hasErrors = true;
}
+
+ // stop or proceed installation process
+ manageInstProc();
+
// VSR: 10/11/05 - disable answer mode ==>
// passedParams->setEnabled( true );
// passedParams->setFocus();
// VSR: 10/11/05 - disable answer mode <==
}
// ================================================================
+/*!
+ * SALOME_InstallWizard::manageInstProc
+ * QProcess slot: -->stop installation if there is an error in stderr
+ */
+// ================================================================
+void SALOME_InstallWizard::manageInstProc()
+{
+ if ( !hasErrors || ignoreErrCBox->isChecked() )
+ return; //proceed installation process
+
+ // abort the current installation
+ statusLab->setText( tr( "Aborting installation..." ) );
+ abort();
+ statusLab->setText( tr( "Installation has been aborted because some errors" ) );
+ if ( QMessageBox::critical( this,
+ tr( "Error" ),
+ tr( "Installation process has been stopped, because an error occured \n"
+ "during an installation of the current product!\n"
+ "Please see the installation progress view for more details about the error.\n\n"
+ "Do you want to save the installation log?" ),
+ tr( "&Save" ),
+ tr( "&Cancel" ),
+ QString::null,
+ 0,
+ 1 ) == 0 )
+ saveLog();
+ // enable <Next> button
+ setNextEnabled( true );
+ doPostActions( tr( "&Start" ), tr( "Start installation process" ) );
+ connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ // enable <Back> button
+ setBackEnabled( true );
+ installInfo->setFinished( true );
+}
+// ================================================================
/*!
* SALOME_InstallWizard::setDependancies
* Sets dependancies for the product item
productsMap[item] = dep;
}
// ================================================================
+/*!
+ * SALOME_InstallWizard::doPostActions
+ * Executes some actions after finish of installation process (successful or not)
+ */
+// ================================================================
+void SALOME_InstallWizard::doPostActions( const QString& btnText,
+ const QString& btnAboutInfo )
+{
+ // update <Next> button
+ nextButton()->setText( btnText );
+ setAboutInfo( nextButton(), btnAboutInfo );
+ // reconnect Next button - to use it as Start button
+ disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
+ disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ // enable 'Ignore errors' checkbox
+ ignoreErrCBox->setEnabled( true );
+}
+// ================================================================
/*!
* SALOME_InstallWizard::addFinishButton
* Add button for the <Finish> page.