Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Marco Bubke
flatpak-qt-creator
Commits
36a10aa2
Commit
36a10aa2
authored
Nov 02, 2010
by
hjk
Browse files
qtpromaker: add the ability to create a .pro for a binary's sources using gdb
parent
95c155b5
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/tools/qtpromaker/main.cpp
View file @
36a10aa2
...
...
@@ -5,6 +5,8 @@
#include
<QDirIterator>
#include
<QFile>
#include
<QSet>
#include
<QMap>
#include
<QProcess>
#include
<QTextStream>
#include
<QVector>
...
...
@@ -15,7 +17,7 @@
// Put everything into a single project.
static
int
targetDepth
=
0
;
static
bool
forceOverWrite
=
false
;
static
QString
subProjectSeparator
=
"
@
"
;
static
QString
subProjectSeparator
=
"
_
"
;
// FIXME: Make file classes configurable on the command line.
static
const
char
*
defaultExtensions
[]
=
...
...
@@ -53,7 +55,7 @@ public:
void
addFile
(
const
QFileInfo
&
fi
)
{
m_files
.
insert
(
fi
.
filePath
());
m_files
.
insert
(
fi
.
filePath
()
,
Dummy
()
);
}
bool
handleFile
(
const
QFileInfo
&
fi
,
const
QByteArray
&
preparedSuffix
)
...
...
@@ -69,15 +71,20 @@ public:
if
(
m_files
.
isEmpty
())
return
;
ts
<<
'\n'
<<
m_varName
<<
" *="
;
foreach
(
QString
s
,
m_files
)
ts
<<
"
\\\n
"
<<
s
;
Files
::
ConstIterator
it
=
m_files
.
begin
();
Files
::
ConstIterator
end
=
m_files
.
end
();
for
(
;
it
!=
end
;
++
it
)
ts
<<
"
\\\n
"
<<
it
.
key
();
ts
<<
"
\n
"
;
}
private:
struct
Dummy
{};
typedef
QMap
<
QString
,
Dummy
>
Files
;
QByteArray
m_suffixes
;
QString
m_varName
;
QSet
<
QString
>
m_files
;
Files
m_files
;
};
class
ProMaker
;
...
...
@@ -100,10 +107,12 @@ public:
Extensions
extensions
()
const
{
return
m_extensions
;
}
private:
void
handleDir
(
const
QDir
&
dir
);
void
handleItem
(
const
QString
&
item
);
void
handleDir
(
const
QString
&
item
);
void
handleBinary
(
const
QString
&
item
);
ProMaker
*
m_master
;
Q
List
<
QDir
>
m_dir
s
;
Q
StringList
m_item
s
;
QVector
<
FileClass
>
m_fileClasses
;
Extensions
m_extensions
;
QString
m_outputFileName
;
...
...
@@ -127,7 +136,7 @@ private:
void
Project
::
setPaths
(
const
QStringList
&
paths
)
{
foreach
(
const
QString
&
path
,
paths
)
m_
dir
s
.
append
(
path
);
m_
item
s
.
append
(
path
);
}
void
Project
::
setExtensions
(
const
Extensions
&
extensions
)
...
...
@@ -141,13 +150,73 @@ void Project::setExtensions(const Extensions &extensions)
void
Project
::
createFileLists
()
{
for
(
int
i
=
0
;
i
!=
m_dirs
.
size
();
++
i
)
handleDir
(
m_dirs
.
at
(
i
));
for
(
int
i
=
0
;
i
!=
m_items
.
size
();
++
i
)
handleItem
(
m_items
.
at
(
i
));
}
void
Project
::
handleItem
(
const
QString
&
item
)
{
QFileInfo
fi
(
item
);
if
(
fi
.
isDir
())
handleDir
(
item
);
else
handleBinary
(
item
);
}
void
Project
::
handleBinary
(
const
QString
&
item
)
{
QStringList
args
;
args
.
append
(
"--batch-silent"
);
args
.
append
(
"--nx"
);
args
.
append
(
"--quiet"
);
args
.
append
(
"-i"
);
args
.
append
(
"mi"
);
args
.
append
(
"--se="
+
item
);
args
.
append
(
"-ex"
);
args
.
append
(
"interpreter-exec mi -file-list-exec-source-files"
);
args
.
append
(
"-ex"
);
args
.
append
(
"quit"
);
QProcess
proc
;
proc
.
start
(
"gdb"
,
args
);
if
(
!
proc
.
waitForStarted
())
{
qDebug
()
<<
"COULD NOT START"
;
return
;
}
if
(
!
proc
.
waitForFinished
())
{
qDebug
()
<<
"COULD NOT FINISH"
;
return
;
}
QByteArray
ba
=
proc
.
readAllStandardOutput
();
if
(
ba
.
isEmpty
())
{
qDebug
()
<<
"NO OUTPUT"
;
return
;
}
QString
input
=
QString
::
fromLatin1
(
ba
,
ba
.
size
());
// ^done,files=[{file="<<C++-namespaces>>",{file=...,fullname=}
// "}] (gdb)
int
first
=
input
.
indexOf
(
'{'
);
input
=
input
.
mid
(
first
,
input
.
lastIndexOf
(
'}'
)
-
first
);
foreach
(
QString
item
,
input
.
split
(
"},{"
))
{
//qDebug() << "ITEM: " << item;
int
full
=
item
.
indexOf
(
",fullname=
\"
"
);
if
(
full
!=
-
1
)
item
=
item
.
mid
(
full
+
11
);
else
item
=
item
.
mid
(
6
);
item
.
chop
(
1
);
//qDebug() << "ITEM: " << item;
QFileInfo
fi
(
item
);
const
QByteArray
ext
=
FileClass
::
prepareSuffix
(
fi
.
suffix
().
toUtf8
());
for
(
int
i
=
m_fileClasses
.
size
();
--
i
>=
0
;
)
{
if
(
m_fileClasses
[
i
].
handleFile
(
fi
,
ext
))
break
;
}
}
}
void
Project
::
handleDir
(
const
Q
Dir
&
dir
)
void
Project
::
handleDir
(
const
Q
String
&
item
)
{
QDirIterator
it
(
dir
.
path
()
);
QDirIterator
it
(
item
);
while
(
it
.
hasNext
())
{
it
.
next
();
const
QFileInfo
fi
=
it
.
fileInfo
();
...
...
@@ -166,7 +235,7 @@ void Project::handleDir(const QDir &dir)
child
->
setExtensions
(
extensions
());
m_subdirs
.
append
(
subName
);
}
else
{
m_
dir
s
.
append
(
fi
.
filePath
());
m_
item
s
.
append
(
fi
.
filePath
());
}
}
else
{
const
QByteArray
ext
=
FileClass
::
prepareSuffix
(
fi
.
suffix
().
toUtf8
());
...
...
@@ -213,7 +282,7 @@ void Project::writeProFile()
foreach
(
const
FileClass
&
fc
,
m_fileClasses
)
fc
.
writeProBlock
(
ts
);
ts
<<
"
\n
PATHS *="
;
foreach
(
const
QDir
&
dir
,
m_
dir
s
)
foreach
(
const
QDir
&
dir
,
m_
item
s
)
ts
<<
"
\\\n
"
<<
dir
.
path
();
ts
<<
"
\n\n
DEPENDPATH *= $$PATHS
\n
"
;
ts
<<
"
\n
INCLUDEPATH *= $$PATHS
\n
"
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment