From: maynardj Date: Fri Feb 25 11:50:18 2011 -0600 Subject: Use qt3Support to allow building with either qt3 or qt4 Git-Repo: git://oprofile.git.sourceforge.net/gitroot/oprofile/oprofile Git-Commit: 7e4a107edca55f01dc62d2351c85264a3bc97fd3 References: request by Ismail Dönme, rferencing redhat BZ#683923 Signed-Off-by: Tony Jones Signed-off-by: Gert Wollny Acked-by: Maynard Johnson Description: This patch makes changes to oprofile gui files to use qt3Support to facilitate building with either qt3 or qt4. The configure script now has a new option: --enable-gui=[qt3|qt4|yes|no]. If not given or set to yes, the gui build defaults to qt3, which is the same as what it has done in the past. --- configure.in | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++-- doc/oprofile.xml | 4 +-- gui/Makefile.am | 5 +-- gui/oprof_start.cpp | 64 ++++++++++++++++++++++++++++++------------------ gui/oprof_start.h | 14 +++++++--- gui/ui/Makefile.am | 2 - 6 files changed, 121 insertions(+), 36 deletions(-) --- a/configure.in +++ b/configure.in @@ -18,6 +18,7 @@ AM_CONFIG_HEADER(config.h) AC_CHECK_DECLS([basename], [], [], [[#include ]]) AC_PROG_RANLIB AC_PROG_LIBTOOL +PKG_PROG_PKG_CONFIG dnl for the man page DATE="`date '+%a %d %B %Y'`" @@ -131,7 +132,61 @@ ORIG_X_SAVE_LIBS="$LIBS" LIBS="$X_PRE_LIBS $LIBS $X_LIBS -lX11 $X_EXTRA_LIBS" X_LIBS="$LIBS" AC_SUBST(X_LIBS) -QT_DO_IT_ALL + +AC_ARG_ENABLE(gui,[ --enable-gui compile with gui component (qt3|qt4|yes|no), + if not given or set to yes, gui defaults to qt3],, enable_gui=qt3) + +if test "x$enable_gui" = "xqt3" || test "x$enable_gui" = "xyes"; then + QT_VERSION=3 + QT_DO_IT_ALL + QT_LIBS="$QT_LIB $QT_LDFLAGS" + QT_CFLAGS="$QT_INCLUDES" +fi + +if test "x$enable_gui" = "xqt4"; then + QT_VERSION=4 + PKG_CHECK_MODULES(QT, Qt3Support QtGui QtCore ,,[ + echo "You requested QT4 but its build files are not available. Exiting now." + exit + ]) + MOC=$(pkg-config --variable=moc_location QtCore) + UIC=$(pkg-config --variable=uic_location QtCore)3 + QT_VERSION=$(pkg-config --modversion QtCore) + +dnl following are some sanity tests and workarounds for buggy QtCore.pc files + if test "x$MOC" = "x"; then + echo "WARNING: Your QtCore.pc file is buggy, it doesn't provide the variable 'moc_location'" + echo "WARNING: I will try to find it in your PATH ..." + AC_CHECK_PROG(MOC, moc, moc) + if test "x$MOC" = "x"; then + echo "WARNING: You can fix this by adding the location of moc to your path." + echo "WARNING: Exiting now." + exit + fi + fi + + if test "x$UIC" = "x3"; then + echo "WARNING: Your QtCore.pc file is buggy, it doesn't provide the variable 'uic_location'" + echo "WARNING: I will try to find it in your PATH ..." + AC_CHECK_PROG(UIChelp, uic3, uic3) + if test "x$UIChelp" = "x"; then + echo "WARNING: You can fix this by adding the location of uic3 to your path." + echo "WARNING: Exiting now." + exit + else + UIC="$UIChelp" + fi + fi + + flags_has_qt3support=$(echo $QT_CFLAGS | grep QT3_SUPPORT) + if test "x$flags_has_qt3support" = "x" ; then + echo "WARNING: Your Qt3Support package is buggy; it dosn't include the 'QT3_SUPPORT' flag" + echo "WARNING: adding it manually" + QT_CFLAGS="$QT_CFLAGS -DQT3_SUPPORT" + fi +fi +AM_CONDITIONAL(have_qt, test -n "$QT_LIBS") + LIBS="$ORIG_X_SAVE_LIBS" dnl enable pch for c++ @@ -155,7 +210,6 @@ AC_SUBST(POPT_LIBS) # do NOT put tests here, they will fail in the case X is not installed ! -AM_CONDITIONAL(have_qt, test -n "$QT_LIB") AX_CFLAGS_OPTION(OP_CFLAGS,[-W]) AX_CXXFLAGS_OPTION(OP_CXXFLAGS,[-W]) @@ -268,6 +322,16 @@ AC_OUTPUT(Makefile \ AX_COPY_IF_CHANGE(doc/xsl/catalog-1.xml, doc/xsl/catalog.xml) +if test "x$enable_gui" = "xno" ; then + echo "No GUI will be built as it was explicitly disabled." +else + if test -z "$QT_LIBS"; then + echo "Warning: QT version $QT_VERSION was requested but not found. No GUI will be built." + else + echo "Building GUI with QT $QT_VERSION" + fi +fi + if test -z "$QT_LIB"; then echo "Warning: a working Qt not found; no GUI will be built" fi --- a/doc/oprofile.xml +++ b/doc/oprofile.xml @@ -190,8 +190,8 @@ For information on how to use OProfile's OProfile GUI - The use of the GUI to start the profiler requires the Qt 2 library. Qt 3 should - also work. + The use of the GUI to start the profiler requires the Qt library. + Either Qt 3 or Qt 4 should work. --- a/gui/Makefile.am +++ b/gui/Makefile.am @@ -14,7 +14,7 @@ EXTRA_DIST = $(dist_sources) if have_qt AM_CPPFLAGS = \ - @QT_INCLUDES@ \ + @QT_CFLAGS@ \ -I ${top_srcdir}/libop \ -I ${top_srcdir}/libutil++ \ -I ${top_srcdir}/libutil @@ -30,8 +30,7 @@ oprof_start_LDADD = \ ../libop/libop.a \ ../libutil/libutil.a \ ui/liboprof_start.a \ - @QT_LDFLAGS@ \ - @QT_LIB@ \ + @QT_LIBS@ \ @X_LIBS@ oprof_start.moc.cpp: ${top_srcdir}/gui/oprof_start.h --- a/gui/oprof_start.cpp +++ b/gui/oprof_start.cpp @@ -20,21 +20,37 @@ #include #include +#if QT3_SUPPORT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#else #include -#include -#include -#include -#include -#include #include #include #include #include #include #include +#include +#include +#include +#include +#include #include +#define Q3ListView QListView +#endif -#include "config.h" #include "oprof_start.h" #include "op_config.h" #include "op_config_24.h" @@ -268,10 +284,10 @@ void oprof_start::fill_events() namespace { /// find the first item with the given text in column 0 or return NULL -QListViewItem * findItem(QListView * view, char const * name) +Q3ListViewItem * findItem(Q3ListView * view, char const * name) { // Qt 2.3.1 does not have QListView::findItem() - QListViewItem * item = view->firstChild(); + Q3ListViewItem * item = view->firstChild(); while (item && strcmp(item->text(0).latin1(), name)) item = item->nextSibling(); @@ -292,7 +308,7 @@ void oprof_start::setup_default_event() event_cfgs[descr.name].user_ring_count = 1; event_cfgs[descr.name].os_ring_count = 1; - QListViewItem * item = findItem(events_list, descr.name); + Q3ListViewItem * item = findItem(events_list, descr.name); if (item) item->setSelected(true); } @@ -349,7 +365,7 @@ void oprof_start::read_set_events() event_cfgs[ev_name].os_ring_count = 1; } - QListViewItem * item = findItem(events_list, ev_name.c_str()); + Q3ListViewItem * item = findItem(events_list, ev_name.c_str()); if (item) item->setSelected(true); } @@ -436,7 +452,7 @@ void oprof_start::fill_events_listbox() for (vector::reverse_iterator cit = v_events.rbegin(); cit != v_events.rend(); ++cit) { - new QListViewItem(events_list, cit->name.c_str()); + new Q3ListViewItem(events_list, cit->name.c_str()); } setUpdatesEnabled(true); @@ -467,7 +483,7 @@ void oprof_start::display_event(op_event } -bool oprof_start::is_selectable_event(QListViewItem * item) +bool oprof_start::is_selectable_event(Q3ListViewItem * item) { if (item->isSelected()) return true; @@ -486,7 +502,7 @@ bool oprof_start::is_selectable_event(QL void oprof_start::draw_event_list() { - QListViewItem * cur; + Q3ListViewItem * cur; for (cur = events_list->firstChild(); cur; cur = cur->nextSibling()) { if (is_selectable_event(cur)) cur->setPixmap(0, *green_pixmap); @@ -500,7 +516,7 @@ bool oprof_start::alloc_selected_events( { vector events; - set::const_iterator it; + set::const_iterator it; for (it = selected_events.begin(); it != selected_events.end(); ++it) events.push_back(find_event_by_name((*it)->text(0).latin1(),0,0)); @@ -520,24 +536,24 @@ void oprof_start::event_selected() // (de)selected item so we record a set of selected items and diff // it in the appropriate way with the previous list of selected items. - set current_selection; - QListViewItem * cur; + set current_selection; + Q3ListViewItem * cur; for (cur = events_list->firstChild(); cur; cur = cur->nextSibling()) { if (cur->isSelected()) current_selection.insert(cur); } // First remove the deselected item. - vector new_deselected; + vector new_deselected; set_difference(selected_events.begin(), selected_events.end(), current_selection.begin(), current_selection.end(), back_inserter(new_deselected)); - vector::const_iterator it; + vector::const_iterator it; for (it = new_deselected.begin(); it != new_deselected.end(); ++it) selected_events.erase(*it); // Now try to add the newly selected item if enough HW resource exists - vector new_selected; + vector new_selected; set_difference(current_selection.begin(), current_selection.end(), selected_events.begin(), selected_events.end(), back_inserter(new_selected)); @@ -558,7 +574,7 @@ void oprof_start::event_selected() } -void oprof_start::event_over(QListViewItem * item) +void oprof_start::event_over(Q3ListViewItem * item) { op_event_descr const & descr = locate_event(item->text(0).latin1()); @@ -566,10 +582,10 @@ void oprof_start::event_over(QListViewIt if (!is_selectable_event(item)) { help_str += " conflicts with:"; - set::const_iterator it; + set::const_iterator it; for (it = selected_events.begin(); it != selected_events.end(); ) { - QListViewItem * temp = *it; + Q3ListViewItem * temp = *it; selected_events.erase(it++); if (is_selectable_event(item)) { help_str += " "; @@ -844,7 +860,7 @@ void oprof_start::on_start_profiler() bool one_enable = false; - QListViewItem * cur; + Q3ListViewItem * cur; for (cur = events_list->firstChild(); cur; cur = cur->nextSibling()) { if (!cur->isSelected()) continue; @@ -946,7 +962,7 @@ bool oprof_start::save_config() vector tmpargs; tmpargs.push_back("--setup"); - QListViewItem * cur; + Q3ListViewItem * cur; for (cur = events_list->firstChild(); cur; cur = cur->nextSibling()) { if (!cur->isSelected()) continue; --- a/gui/oprof_start.h +++ b/gui/oprof_start.h @@ -16,11 +16,17 @@ #include #include +#include "config.h" + #include "ui/oprof_start.base.h" #include "oprof_start_config.h" #include "op_events.h" +#ifndef QT3_SUPPORT +#define Q3ListViewItem QListViewItem +#endif + class QIntValidator; class QListViewItem; class QTimerEvent; @@ -62,7 +68,7 @@ protected slots: /// events selection change void event_selected(); /// the mouse is over an event - void event_over(QListViewItem *); + void event_over(Q3ListViewItem *); /// state of separate_kernel_cb changed void on_separate_kernel_cb_changed(int); /// reset sample files @@ -121,7 +127,7 @@ private: void draw_event_list(); /// return true if item is selectable or already selected - bool is_selectable_event(QListViewItem * item); + bool is_selectable_event(Q3ListViewItem * item); /// try to alloc counters for the selected_events bool alloc_selected_events() const; @@ -139,8 +145,8 @@ private: /// The currently selected events. We must track this because /// with multiple selection listbox QT doesn't allow to know /// what is the last selected item. events_selected() update it - std::set selected_events; - QListViewItem * current_event; + std::set selected_events; + Q3ListViewItem * current_event; /// current config config_setting config; --- a/gui/ui/Makefile.am +++ b/gui/ui/Makefile.am @@ -2,7 +2,7 @@ EXTRA_DIST = oprof_start.base.ui if have_qt -AM_CPPFLAGS = @QT_INCLUDES@ +AM_CPPFLAGS = @QT_CFLAGS@ AM_CXXFLAGS = @OP_CXXFLAGS@