Merge topic 'cmake-gui-osx-install-command-line'

e462ef74 Help: Add notes for topic 'cmake-gui-osx-install-command-line'
8ea2db26 cmake-gui: Replace command-line install dialog with information box
438ce4a0 cmake-gui: Add --install option to add command-line tools on OS X
41477d5c cmake-gui: Drop undocumented and unused --mac-install option
This commit is contained in:
Brad King 2015-05-21 09:03:50 -04:00 committed by CMake Topic Stage
commit 2c54622ff5
7 changed files with 109 additions and 263 deletions

View File

@ -0,0 +1,10 @@
cmake-gui-osx-install-command-line
----------------------------------
* On OS X the :manual:`cmake-gui(1)` no longer has the
``Install For Command Line Use`` menu item. Instead there
is a ``How to Install For Command Line Use`` menu item
that shows an informational dialog box explaining how to
make the command line tools available. For example::
/Applications/CMake.app/Contents/bin/cmake-gui --install

View File

@ -99,15 +99,12 @@ set(SRCS
QCMakeCacheView.h
QCMakeWidgets.cxx
QCMakeWidgets.h
QMacInstallDialog.cxx
QMacInstallDialog.h
)
QT4_WRAP_UI(UI_SRCS
CMakeSetupDialog.ui
Compilers.ui
CrossCompiler.ui
AddCacheEntry.ui
MacInstallDialog.ui
)
QT4_WRAP_CPP(MOC_SRCS
AddCacheEntry.h
@ -117,7 +114,6 @@ QT4_WRAP_CPP(MOC_SRCS
QCMake.h
QCMakeCacheView.h
QCMakeWidgets.h
QMacInstallDialog.h
)
QT4_ADD_RESOURCES(RC_SRCS CMakeSetup.qrc)

View File

@ -15,11 +15,11 @@
#include <QTranslator>
#include <QLocale>
#include <QTextCodec>
#include "QMacInstallDialog.h"
#include "CMakeSetupDialog.h"
#include "cmDocumentation.h"
#include "cmake.h"
#include "cmVersion.h"
#include "cmAlgorithms.h"
#include <cmsys/CommandLineArguments.hxx>
#include <cmsys/SystemTools.hxx>
#include <cmsys/Encoding.hxx>
@ -48,6 +48,10 @@ static const char * cmDocumentationOptions[][2] =
{0,0}
};
#if defined(Q_OS_MAC)
static int cmOSXInstall(std::string dir);
#endif
int main(int argc, char** argv)
{
cmsys::Encoding::CommandLineArguments encoding_args =
@ -79,6 +83,17 @@ int main(int argc, char** argv)
return (doc.PrintRequestedDocumentation(std::cout)? 0:1);
}
#if defined(Q_OS_MAC)
if (argc2 == 2 && strcmp(argv2[1], "--install") == 0)
{
return cmOSXInstall("/usr/bin");
}
if (argc2 == 2 && cmHasLiteralPrefix(argv2[1], "--install="))
{
return cmOSXInstall(argv2[1]+10);
}
#endif
QApplication app(argc, argv);
#if defined(CMAKE_ENCODING_UTF8)
@ -93,16 +108,6 @@ int main(int argc, char** argv)
QApplication::removeLibraryPath(p);
}
// if arg for install
for(int i =0; i < argc2; i++)
{
if(strcmp(argv2[i], "--mac-install") == 0)
{
QMacInstallDialog setupdialog(0);
setupdialog.exec();
return 0;
}
}
// tell the cmake library where cmake is
QDir cmExecDir(QApplication::applicationDirPath());
#if defined(Q_OS_MAC)
@ -189,3 +194,54 @@ int main(int argc, char** argv)
return app.exec();
}
#if defined(Q_OS_MAC)
# include <errno.h>
# include <string.h>
# include <sys/stat.h>
# include <unistd.h>
static bool cmOSXInstall(std::string const& dir, std::string const& tool)
{
if (tool.empty())
{
return true;
}
std::string link = dir + cmSystemTools::GetFilenameName(tool);
struct stat st;
if (lstat(link.c_str(), &st) == 0 && S_ISLNK(st.st_mode))
{
char buf[4096];
ssize_t s = readlink(link.c_str(), buf, sizeof(buf)-1);
if (s >= 0 && std::string(buf, s) == tool)
{
std::cerr << "Exists: '" << link << "' -> '" << tool << "'\n";
return true;
}
}
if (symlink(tool.c_str(), link.c_str()) == 0)
{
std::cerr << "Linked: '" << link << "' -> '" << tool << "'\n";
return true;
}
else
{
int err = errno;
std::cerr << "Failed: '" << link << "' -> '" << tool << "': "
<< strerror(err) << "\n";
return false;
}
}
static int cmOSXInstall(std::string dir)
{
if (!cmHasLiteralSuffix(dir, "/"))
{
dir += "/";
}
return (
cmOSXInstall(dir, cmSystemTools::GetCMakeCommand()) &&
cmOSXInstall(dir, cmSystemTools::GetCTestCommand()) &&
cmOSXInstall(dir, cmSystemTools::GetCPackCommand()) &&
cmOSXInstall(dir, cmSystemTools::GetCMakeGUICommand()) &&
cmOSXInstall(dir, cmSystemTools::GetCMakeCursesCommand())
) ? 0 : 1;
}
#endif

View File

@ -27,7 +27,6 @@
#include <QUrl>
#include <QShortcut>
#include <QKeySequence>
#include <QMacInstallDialog.h>
#include <QInputDialog>
#include "QCMake.h"
@ -121,7 +120,7 @@ CMakeSetupDialog::CMakeSetupDialog()
this, SLOT(showUserChanges()));
#if defined(Q_WS_MAC) || defined(Q_OS_MAC)
this->InstallForCommandLineAction
= ToolsMenu->addAction(tr("&Install For Command Line Use"));
= ToolsMenu->addAction(tr("&How to Install For Command Line Use"));
QObject::connect(this->InstallForCommandLineAction, SIGNAL(triggered(bool)),
this, SLOT(doInstallForCommandLine()));
#endif
@ -420,8 +419,37 @@ bool CMakeSetupDialog::doConfigureInternal()
void CMakeSetupDialog::doInstallForCommandLine()
{
QMacInstallDialog setupdialog(0);
setupdialog.exec();
QString title = tr("How to Install For Command Line Use");
QString msg = tr(
"One may add CMake to the PATH:\n"
"\n"
" PATH=\"%1\":\"$PATH\"\n"
"\n"
"Or, to install symlinks to '/usr/bin', run:\n"
"\n"
" sudo \"%2\" --install\n"
"\n"
"Or, to install symlinks to another directory, run:\n"
"\n"
" sudo \"%3\" --install=/path/to/bin\n"
);
msg = msg.arg(cmSystemTools::GetFilenamePath(
cmSystemTools::GetCMakeCommand()).c_str());
msg = msg.arg(cmSystemTools::GetCMakeGUICommand().c_str());
msg = msg.arg(cmSystemTools::GetCMakeGUICommand().c_str());
QDialog dialog;
dialog.setWindowTitle(title);
QVBoxLayout* l = new QVBoxLayout(&dialog);
QLabel* lab = new QLabel(&dialog);
l->addWidget(lab);
lab->setText(msg);
lab->setWordWrap(false);
QDialogButtonBox* btns = new QDialogButtonBox(QDialogButtonBox::Ok,
Qt::Horizontal, &dialog);
QObject::connect(btns, SIGNAL(accepted()), &dialog, SLOT(accept()));
l->addWidget(btns);
dialog.exec();
}
bool CMakeSetupDialog::doGenerateInternal()

View File

@ -1,103 +0,0 @@
<ui version="4.0" >
<class>Dialog</class>
<widget class="QDialog" name="Dialog" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>470</width>
<height>159</height>
</rect>
</property>
<property name="windowTitle" >
<string>Install Command Line Tools</string>
</property>
<layout class="QGridLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item row="3" column="1" >
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" >
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0" colspan="3" >
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" >
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="skipInstallButton" >
<property name="text" >
<string>Skip Install Command Line </string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="doInstallButton" >
<property name="text" >
<string>Install Command Line Links</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="2" >
<widget class="QPushButton" name="choosePathButton" >
<property name="text" >
<string>Choose...</string>
</property>
</widget>
</item>
<item row="0" column="0" >
<widget class="QLabel" name="label" >
<property name="text" >
<string>Install Folder:</string>
</property>
</widget>
</item>
<item row="0" column="1" >
<widget class="QLineEdit" name="InstallPrefix" />
</item>
<item row="1" column="0" colspan="3" >
<widget class="QLabel" name="label_2" >
<property name="text" >
<string>This will create symbolic links to the command line tools of cmake into the specified install folder.</string>
</property>
<property name="wordWrap" >
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -1,121 +0,0 @@
#include "QMacInstallDialog.h"
#include <QMessageBox>
#include "cmSystemTools.h"
#include <iostream>
#include <QFileDialog>
#include "ui_MacInstallDialog.h"
class QMacInstallDialog::QMacInstallDialogInternals : public Ui::Dialog
{
public:
};
QMacInstallDialog::QMacInstallDialog(QWidget*w)
:QDialog(w)
{
this->Internals = new QMacInstallDialogInternals;
this->Internals->setupUi(this);
QObject::connect(this->Internals->choosePathButton, SIGNAL(clicked(bool)),
this, SLOT(ShowBrowser()));
QObject::connect(this->Internals->skipInstallButton, SIGNAL(clicked(bool)),
this, SLOT(SkipInstall()));
QObject::connect(this->Internals->doInstallButton, SIGNAL(clicked(bool)),
this, SLOT(DoInstall()));
this->Internals->InstallPrefix->setText("/usr/bin/");
}
QMacInstallDialog::~QMacInstallDialog()
{
delete this->Internals;
}
void QMacInstallDialog::DoInstall()
{
QDir installDir(this->Internals->InstallPrefix->text());
QString installTo = installDir.path();
if(!cmSystemTools::FileExists(installTo.toLocal8Bit().data()))
{
QString message = tr("Build install does not exist, "
"should I create it?\n\n"
"Directory: ");
message += installDir.path();
QString title = tr("Create Directory");
QMessageBox::StandardButton btn;
btn = QMessageBox::information(this, title, message,
QMessageBox::Yes | QMessageBox::No);
if(btn == QMessageBox::Yes)
{
cmSystemTools::MakeDirectory(installTo.toLocal8Bit().data());
}
}
QDir cmExecDir(QApplication::applicationDirPath());
cmExecDir.cd("../bin");
QFileInfoList list = cmExecDir.entryInfoList();
for (int i = 0; i < list.size(); ++i)
{
QFileInfo fileInfo = list.at(i);
QString filename = fileInfo.fileName();
if(filename.size() && filename[0] == '.')
{
continue;
}
QString file = fileInfo.absoluteFilePath();
QString newName = installTo;
newName += "/";
newName += filename;
// Remove the old files
if(cmSystemTools::FileExists(newName.toLocal8Bit().data()))
{
std::cout << "rm [" << newName.toLocal8Bit().data() << "]\n";
if(!cmSystemTools::RemoveFile(newName.toLocal8Bit().data()))
{
QString message = tr("Failed to remove file "
"installation may be incomplete: ");
message += newName;
QString title = tr("Error Removing file");
QMessageBox::StandardButton btn =
QMessageBox::critical(this, title, message,
QMessageBox::Ok|QMessageBox::Abort);
if(btn == QMessageBox::Abort)
{
return;
}
}
}
std::cout << "ln -s [" << file.toLocal8Bit().data() << "] [";
std::cout << newName.toLocal8Bit().data() << "]\n";
if(!cmSystemTools::CreateSymlink(file.toLocal8Bit().data(),
newName.toLocal8Bit().data()))
{
QString message = tr("Failed create symlink "
"installation may be incomplete: ");
message += newName;
QString title = tr("Error Creating Symlink");
QMessageBox::StandardButton btn =
QMessageBox::critical(this, title, message,
QMessageBox::Ok|QMessageBox::Abort);
if(btn == QMessageBox::Abort)
{
return;
}
}
}
this->done(0);
}
void QMacInstallDialog::SkipInstall()
{
this->done(0);
}
void QMacInstallDialog::ShowBrowser()
{
QString dir = QFileDialog::getExistingDirectory(this,
tr("Enter Install Prefix"), this->Internals->InstallPrefix->text());
if(!dir.isEmpty())
{
this->Internals->InstallPrefix->setText(dir);
}
}

View File

@ -1,20 +0,0 @@
#ifndef QMacInstallDialog_h
#define QMacInstallDialog_h
#include <QDialog>
class QMacInstallDialog : public QDialog
{
Q_OBJECT;
public:
QMacInstallDialog(QWidget*w);
~QMacInstallDialog();
private slots:
void ShowBrowser();
void SkipInstall();
void DoInstall();
private:
class QMacInstallDialogInternals;
QMacInstallDialogInternals* Internals;
};
#endif