Code::Blocks
User forums => General (but related to Code::Blocks) => Topic started by: gege2061 on November 09, 2006, 10:47:53 am
-
Hi,
First, excuse me for my (very) bad English :(
I developed a GTK+ template for C::B, it work with RC1 but with last Nightly builds (07 November) it does not appear in New Projects dialog box :(
Here files based on the Qt template :
share/CodeBlocks/templates/gtk.cbp
<?xml version="1.0"?>
<!DOCTYPE CodeBlocks_project_file>
<CodeBlocks_project_file>
<FileVersion major="1" minor="1"/>
<Project>
<Option title="GTK+ application"/>
<Option makefile="Makefile"/>
<Build>
<Target title="default">
<Option type="0"/>
<Option parameters=""/>
<Option includeInTargetAll="1"/>
<Option projectCompilerOptionsRelation="3"/>
<Option projectLinkerOptionsRelation="3"/>
<Option projectIncludeDirsRelation="3"/>
<Option projectLibDirsRelation="3"/>
<Compiler>
<Add option="-mno-cygwin"/>
<Add option="-mms-bitfields"/>
<Add directory="C:\Program Files\CodeBlocks\include\gtk-2.0"/>
<Add directory="C:\Program Files\CodeBlocks\lib\gtk-2.0\include"/>
<Add directory="C:\Program Files\CodeBlocks\include\atk-1.0"/>
<Add directory="C:\Program Files\CodeBlocks\include\pango-1.0"/>
<Add directory="C:\Program Files\CodeBlocks\include\glib-2.0"/>
<Add directory="C:\Program Files\CodeBlocks\include\glib-2.0\glib"/>
<Add directory="C:\Program Files\CodeBlocks\lib\glib-2.0"/>
<Add directory="C:\Program Files\CodeBlocks\lib\glib-2.0\include"/>
<Add directory="C:\Program Files\CodeBlocks\include\cairo"/>
</Compiler>
<Linker>
<Add option="-limm32"/>
<Add option="-lshell32"/>
<Add option="-lole32"/>
<Add option="-luuid"/>
<Add library="C:\Program Files\CodeBlocks\lib\glib-2.0.lib"/>
<Add library="C:\Program Files\CodeBlocks\lib\pangocairo-1.0.lib"/>
<Add library="C:\Program Files\CodeBlocks\lib\pangowin32-1.0.lib"/>
<Add library="C:\Program Files\CodeBlocks\lib\libatk-1.0.dll.a"/>
<Add library="C:\Program Files\CodeBlocks\lib\gdk_pixbuf-2.0.lib"/>
<Add library="C:\Program Files\CodeBlocks\lib\gdk-win32-2.0.lib"/>
<Add library="C:\Program Files\CodeBlocks\lib\pango-1.0.lib"/>
<Add library="C:\Program Files\CodeBlocks\lib\gmodule-2.0.lib"/>
<Add library="C:\Program Files\CodeBlocks\lib\gobject-2.0.lib"/>
<Add library="C:\Program Files\CodeBlocks\lib\gthread-2.0.lib"/>
<Add library="C:\Program Files\CodeBlocks\lib\gtk-win32-2.0.lib"/>
<Add library="C:\Program Files\CodeBlocks\lib\cairo.lib"/>
<Add library="C:\Program Files\CodeBlocks\lib\pangoft2-1.0.lib"/>
</Linker>
</Target>
</Build>
</Project>
</CodeBlocks_project_file>
share/CodeBlocks/templates/gtk.template
<?xml version="1.0"?>
<!DOCTYPE CodeBlocks_template_file>
<CodeBlocks_template_file>
<Template name="GTKapp" title="GTK Application" category="GUI" bitmap="gtklogo.png">
<FileSet name="s" title="Default">
<File source="gtk-main.c" destination="main.c"/>
</FileSet>
<Option name="GTK Application">
<Project file="gtk.cbp"/>
</Option>
</Template>
</CodeBlocks_template_file>
share/CodeBlocks/templates/gtk.template
#include <stdlib.h>
#include <gtk/gtk.h>
static void helloWorld (GtkWidget *wid, GtkWidget *win)
{
GtkWidget *dialog = NULL;
dialog = gtk_message_dialog_new (GTK_WINDOW (win), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "Hello World!");
gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
int main (int argc, char *argv[])
{
GtkWidget *button = NULL;
GtkWidget *win = NULL;
GtkWidget *vbox = NULL;
/* Initialize GTK+ */
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
gtk_init (&argc, &argv);
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
/* Create the main window */
win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width (GTK_CONTAINER (win), 8);
gtk_window_set_title (GTK_WINDOW (win), "Hello World");
gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
gtk_widget_realize (win);
g_signal_connect (win, "destroy", gtk_main_quit, NULL);
/* Create a vertical box with buttons */
vbox = gtk_vbox_new (TRUE, 6);
gtk_container_add (GTK_CONTAINER (win), vbox);
button = gtk_button_new_from_stock (GTK_STOCK_DIALOG_INFO);
g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (helloWorld), (gpointer) win);
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
g_signal_connect (button, "clicked", gtk_main_quit, NULL);
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
/* Enter the main loop */
gtk_widget_show_all (win);
gtk_main ();
return 0;
}
Where is mistake ?
Thanks ;)
[attachment deleted by admin]
-
The nightly builds use wizards now, I am not sure if templates still work.
-
The nightly builds use wizards now, I am not sure if templates still work.
Ok, I thought that it was optional.
I just forgot to complete share/CodeBlocks/templates/wizard/config.script file
Now, GTK project appears in the window but an error occurs.
I work that and I will post the result, if that interests you ;)
-
Now, GTK project appears in the window but an error occurs.
What error?
And BTW: If you want to, you can create a new wizard that is compatible to the new scripted wizard plugin. It should be quite easy - you can take e.g. the GLUT wizard as template.
With regards, Morten.
-
[...]you can create a new wizard that is compatible to the new scripted wizard plugin. [...]
Done that in SVN. ;-)
-
What error?
And BTW: If you want to, you can create a new wizard that is compatible to the new scripted wizard plugin. It should be quite easy - you can take e.g. the GLUT wizard as template.
With regards, Morten.
Indeed, it's very easy :D
Done that in SVN. ;-)
Ok, I test it under Windows and Linux and commit ;)
-
Done that in SVN. ;-)
ok you created the template !
Here I that I made (run under Windows and Linux) :
////////////////////////////////////////////////////////////////////////////////
//
// GTK project wizard
//
////////////////////////////////////////////////////////////////////////////////
// globals
GtkPathDefault <- _T("$(#gtk)");
GtkPathDefaultInc <- _T("$(#gtk.include)");
GtkPathDefaultLib <- _T("$(#gtk.lib)");
GtkPath <- _T("");
function BeginWizard()
{
local intro_msg = _T("Welcome to the new GTK project wizard!\n" +
"This wizard will guide you to create a new GTK project\n" +
"using the GTK cross-platform GUI toolkit\n\n" +
"When you're ready to proceed, please click \"Next\"...");
local gtkpath_msg = _T("Please select the location of GTK on your computer.\n" +
"This is the top-level folder where GTK was installed.\n" +
"To help you, this folder must contain the subfolders\n" +
"\"include\" and \"lib\".");
Wizard.AddInfoPage(_T("GtkIntro"), intro_msg);
Wizard.AddProjectPathPage();
Wizard.AddGenericSelectPathPage(_T("GtkPath"), gtkpath_msg, _T("GTK's location:"), GtkPathDefault);
Wizard.AddCompilerPage(_T(""), _T("gcc*"), true, true);
}
////////////////////////////////////////////////////////////////////////////////
// Gtk's path page
////////////////////////////////////////////////////////////////////////////////
function OnLeave_GtkPath(fwd)
{
if (fwd)
{
local dir = Wizard.GetTextControlValue(_T("txtFolder")); // txtFolder is the text control in GenericSelectPathPage
local dir_nomacro = VerifyDirectory(dir);
if (dir_nomacro.IsEmpty())
return false;
// verify include dependencies
local dir_nomacro_inc = GetCompilerIncludeDir(dir, GtkPathDefault, GtkPathDefaultInc);
if (dir_nomacro_inc.IsEmpty())
return false;
if (!VerifyFile(dir_nomacro_inc + wxFILE_SEP_PATH + _T("gtk-2.0") + wxFILE_SEP_PATH +_T("gtk"), _T("gtk.h"), _T("GTK's include")))
return false;
// verify library dependencies
local dir_nomacro_lib = GetCompilerLibDir(dir, GtkPathDefault, GtkPathDefaultLib);
if (dir_nomacro_lib.IsEmpty())
return false;
if (!VerifyLibFile(dir_nomacro_lib, _T("gtk-win32-2.0"), _T("GTK's")))
return false;
GtkPath = dir; // Remember the original selection.
local is_macro = _T("");
// try to resolve the include directory as macro
is_macro = GetCompilerIncludeMacro(dir, GtkPathDefault, GtkPathDefaultInc);
if (is_macro.IsEmpty())
{
// not possible -> use the real inc path we had computed instead
GtkPathDefaultInc = dir_nomacro_inc;
}
// try to resolve the library directory as macro
is_macro = GetCompilerLibMacro(dir, GtkPathDefault, GtkPathDefaultLib);
if (is_macro.IsEmpty())
{
// not possible -> use the real lib path we had computed instead
GtkPathDefaultLib = dir_nomacro_lib;
}
}
return true;
}
// return the files this project contains
function GetFilesDir()
{
return _T("gtk/files");
}
// setup the already created project
function SetupProject(project)
{
project.AddIncludeDir(GtkPathDefaultInc);
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("gtk-2.0"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("cairo"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("gdk"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("glib-2.0"));
// Notice GtkPathDefault*Lib* at some positions. This is correct as of 2.8.20
project.AddIncludeDir(GtkPathDefaultLib + wxFILE_SEP_PATH + _T("glib-2.0") + wxFILE_SEP_PATH + _T("include"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("pango-1.0"));
project.AddIncludeDir(GtkPathDefaultLib + wxFILE_SEP_PATH + _T("gtk-2.0") + wxFILE_SEP_PATH + _T("include"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("atk-1.0"));
project.AddLibDir(GtkPathDefaultLib);
// add link libraries
project.AddLinkLib(_T("gtk-win32-2.0"));
project.AddLinkLib(_T("gobject-2.0"));
project.AddLinkLib(_T("glib-2.0"));
// Notice: there are more libs required as the app gets more complex, e.g.:
// pangocairo-1.0.lib, pangocairo-1.0.lib, libatk-1.0.dll.a,
// gdk_pixbuf-2.0.lib, gdk-win32-2.0.lib, pango-1.0.lib,
// gmodule-2.0.lib, gthread-2.0.lib, cairo.lib,
// pangoft2-1.0.lib (...)
// enable compiler warnings (project-wide)
WarningsOn(project, Wizard.GetCompilerID());
project.AddCompilerOption(_T("-mms-bitfields"));
// Debug
local target = project.GetBuildTarget(Wizard.GetDebugName());
if (!IsNull(target))
{
target.SetTargetType(ttConsoleOnly); // ttConsoleOnly: console for debugging
target.SetOutputFilename(Wizard.GetDebugOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE);
// enable generation of debugging symbols for target
DebugSymbolsOn(target, Wizard.GetCompilerID());
}
// Release
target = project.GetBuildTarget(Wizard.GetReleaseName());
if (!IsNull(target))
{
target.SetTargetType(ttExecutable); // ttExecutable: no console
target.SetOutputFilename(Wizard.GetReleaseOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE);
// enable optimizations for target
OptimizationsOn(target, Wizard.GetCompilerID());
}
return true;
}
Thank you for your exelent work ;)
-
Here I that I made (run under Windows and Linux) :
[...]
Mmmmh... I don't see a difference to the one that is in SVN? Am I missing something? Did you say you've adopted it to work under Linux?!
Thank you for your exelent work ;)
You're welcome! :-) Still: It's untested under Linux and older/newer version of GTK. There are modifications required to accomplish that.
With regards, Morten.
-
Sorry, it was not the good file :(
////////////////////////////////////////////////////////////////////////////////
//
// GTK+ project wizard
//
////////////////////////////////////////////////////////////////////////////////
// globals
GtkPathDefault <- _T("$(#gtk)");
GtkPathDefaultInc <- _T("$(#gtk.include)");
GtkPathDefaultLib <- _T("$(#gtk.lib)");
GtkPath <- _T("");
function BeginWizard()
{
local intro_msg = _T("Welcome to the new GTK+ project wizard!\n\n" +
"This wizard will guide you to create a new project\n" +
"using the GTK+.\n\n" +
"When you're ready to proceed, please click \"Next\"...");
local gtkpath_descr = _T("Please select the location of GTK+ on your computer.\n" +
"This is the top-level folder where GTK+ was installed (unpacked).\n" +
"To help you, this folder must contain the subfolders\n" +
"\"include\" and \"lib\".");
Wizard.AddInfoPage(_T("GtkIntro"), intro_msg);
Wizard.AddProjectPathPage();
Wizard.AddGenericSelectPathPage(_T("GtkPath"), gtkpath_descr, _T("Please select GTK+'s location:"), GtkPathDefault);
Wizard.AddCompilerPage(_T(""), _T("*"), true, true);
}
////////////////////////////////////////////////////////////////////////////////
// GTK+'s path page
////////////////////////////////////////////////////////////////////////////////
function OnLeave_GtkPath(fwd)
{
if (fwd)
{
local dir = Wizard.GetTextControlValue(_T("txtFolder")); // txtFolder is the text control in GenericSelectPathPage
local dir_nomacro = VerifyDirectory(dir);
if (dir_nomacro.IsEmpty())
return false;
// verify include dependencies
local dir_nomacro_inc = GetCompilerIncludeDir(dir, GtkPathDefault, GtkPathDefaultInc);
if (dir_nomacro_inc.IsEmpty())
return false;
if (!VerifyFile(dir_nomacro_inc + wxFILE_SEP_PATH + _T("gtk-2.0") + wxFILE_SEP_PATH + _T("gtk"), _T("gtk.h"), _T("GTK+'s include"))) return false;
// verify library dependencies
local dir_nomacro_lib = GetCompilerLibDir(dir, GtkPathDefault, GtkPathDefaultLib);
if (dir_nomacro_lib.IsEmpty())
return false;
if (PLATFORM == PLATFORM_MSW)
{
if (!VerifyLibFile(dir_nomacro_lib, _T("libgtk-win32-2.0.dll"), _T("GTK+'s"))) return false;
}
else
{
if (!VerifyLibFile(dir_nomacro_lib, _T("libgtk-x11-2.0.la"), _T("GTK+'s"))) return false;
}
GtkPath = dir; // Remember the original selection.
local is_macro = _T("");
// try to resolve the include directory as macro
is_macro = GetCompilerIncludeMacro(dir, GtkPathDefault, GtkPathDefaultInc);
if (is_macro.IsEmpty())
{
// not possible -> use the real inc path we had computed instead
GtkPathDefaultInc = dir_nomacro_inc;
}
// try to resolve the library directory as macro
is_macro = GetCompilerLibMacro(dir, GtkPathDefault, GtkPathDefaultLib);
if (is_macro.IsEmpty())
{
// not possible -> use the real lib path we had computed instead
GtkPathDefaultLib = dir_nomacro_lib;
}
}
return true;
}
// return the files this project contains
function GetFilesDir()
{
return _T("gtk/files");
}
// setup the already created project
function SetupProject(project)
{
// set project options
project.AddIncludeDir(GtkPathDefaultInc);
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("gtk-2.0"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("atk-1.0"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("cairo"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("pango-1.0"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("glib-2.0"));
project.AddIncludeDir(GtkPathDefaultLib + wxFILE_SEP_PATH + _T("gtk-2.0") + wxFILE_SEP_PATH + _T("include"));
project.AddIncludeDir(GtkPathDefaultLib + wxFILE_SEP_PATH + _T("glib-2.0") + wxFILE_SEP_PATH + _T("include"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("glib-2.0") + wxFILE_SEP_PATH + _T("glib"));
project.AddIncludeDir(GtkPathDefaultLib + wxFILE_SEP_PATH + _T("glib-2.0"));
project.AddLibDir(GtkPathDefaultLib);
// add link libraries
if (PLATFORM == PLATFORM_MSW)
{
project.AddLinkLib(_T("glib-2.0"));
project.AddLinkLib(_T("pangocairo-1.0"));
project.AddLinkLib(_T("pangowin32-1.0"));
project.AddLinkLib(_T("libatk-1.0"));
project.AddLinkLib(_T("gdk_pixbuf-2.0"));
project.AddLinkLib(_T("gdk-win32-2.0"));
project.AddLinkLib(_T("pango-1.0"));
project.AddLinkLib(_T("gmodule-2.0"));
project.AddLinkLib(_T("gobject-2.0"));
project.AddLinkLib(_T("gthread-2.0"));
project.AddLinkLib(_T("gtk-win32-2.0"));
project.AddLinkLib(_T("cairo"));
project.AddLinkLib(_T("pangoft2-1.0"));
project.AddCompilerOption(_T("-mno-cygwin"));
project.AddCompilerOption(_T("-mms-bitfields"));
project.AddLinkerOption(_T("-limm32"));
project.AddLinkerOption(_T("-lshell32"));
project.AddLinkerOption(_T("-lole32"));
project.AddLinkerOption(_T("-luuid"));
}
else
{
project.AddLinkLib(_T("gtk-x11-2.0"));
project.AddLinkLib(_T("gdk-x11-2.0"));
project.AddLinkLib(_T("atk-1.0"));
project.AddLinkLib(_T("gdk_pixbuf-2.0"));
project.AddLinkLib(_T("m"));
project.AddLinkLib(_T("pangocairo-1.0"));
project.AddLinkLib(_T("pango-1.0"));
project.AddLinkLib(_T("cairo"));
project.AddLinkLib(_T("gobject-2.0"));
project.AddLinkLib(_T("gmodule-2.0"));
project.AddLinkLib(_T("dl"));
project.AddLinkLib(_T("glib-2.0"));
}
// enable compiler warnings (project-wide)
WarningsOn(project, Wizard.GetCompilerID());
// Debug
local target = project.GetBuildTarget(Wizard.GetDebugName());
if (!IsNull(target))
{
target.SetTargetType(ttConsoleOnly); // ttConsoleOnly: console for debugging
target.SetOutputFilename(Wizard.GetDebugOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE);
target.SetWorkingDir(GtkPath + _T("/bin"));
// enable generation of debugging symbols for target
DebugSymbolsOn(target, Wizard.GetCompilerID());
}
// Release
target = project.GetBuildTarget(Wizard.GetReleaseName());
if (!IsNull(target))
{
target.SetTargetType(ttExecutable); // ttExecutable: no console
target.SetOutputFilename(Wizard.GetReleaseOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE);
target.SetWorkingDir(GtkPath + _T("/bin"));
// enable optimizations for target
OptimizationsOn(target, Wizard.GetCompilerID());
}
return true;
}
-
Sorry, it was not the good file :( [...]
Ok - seen this and thanks a lot.
Unfortunately I kind of disagree with some changes:
1.) You basically link against all libs that are in the SDK. This is not required at all and is not a good way to start. I wonder why you've added e.g. all the additional libs to the MS Windows platform - the application compiled and linked just fine before. Maybe I'm missing something here, but why do you do that?
2.) Another issue I found is that you add "-mno-cygwin" on MS windows. This is only required if you use Cygwin which is not natively supported by C::B (although it works). I would prefer not using this switch to avoid incompatibilities and confusions.
I am going to incorporate your deliveries anyway (removing what I think is not necessary) but would welcome comments on that. In addition: If you want to do me a favor, you could tell me the minimum set of libraries required on Linux.
With regards, Morten.
-
1.) You basically link against all libs that are in the SDK. This is not required at all and is not a good way to start. I wonder why you've added e.g. all the additional libs to the MS Windows platform - the application compiled and linked just fine before. Maybe I'm missing something here, but why do you do that?
Is that enough to compile the small example but for greater applications the other libraries can be necessary (it east can be possible to give the choice to the user during the creation of the project?)
2.) Another issue I found is that you add "-mno-cygwin" on MS windows. This is only required if you use Cygwin which is not natively supported by C::B (although it works). I would prefer not using this switch to avoid incompatibilities and confusions.
I use mingw but that seems useless.
In addition: If you want to do me a favor, you could tell me the minimum set of libraries required on Linux.
Yes, I will look at that this evening ;)
-
Is that enough to compile the small example but for greater applications the other libraries can be necessary [...]
That's exactly what I mean. They *can*, but don't need to be necessarily. I know, there is this top-bottom approach "just include all it'll always work". But I'm more into the bottom-top "Include only what's required". The reason for this is that you have to think about during development. This will lead automatically into a lot more knowledge and trust in your application in the end. It is *good* to know the dependencies of the applications you are developing in detail. And in the end it is as simple as that:
1.) Look at the linker errors for symbols not resolved
2.) look at the libs for the symbols they export (e.g. using the symbol table plugin)
3.) Add the libs to your project.
I know that there are a lot people out that believe like you do but still: I prefer the minimal set of libs and just hope you understand.
With regards, Morten.
-
In addition: If you want to do me a favor, you could tell me the minimum set of libraries required on Linux.
project.AddLinkLib(_T("gtk-x11-2.0"));
:roll:
The complete file :
////////////////////////////////////////////////////////////////////////////////
//
// GTK project wizard
//
////////////////////////////////////////////////////////////////////////////////
// globals
GtkPathDefault <- _T("$(#gtk)");
GtkPathDefaultInc <- _T("$(#gtk.include)");
GtkPathDefaultLib <- _T("$(#gtk.lib)");
GtkPath <- _T("");
function BeginWizard()
{
local intro_msg = _T("Welcome to the new GTK project wizard!\n" +
"This wizard will guide you to create a new GTK project\n" +
"using the GTK cross-platform GUI toolkit\n\n" +
"When you're ready to proceed, please click \"Next\"...");
local gtkpath_msg = _T("Please select the location of GTK on your computer.\n" +
"This is the top-level folder where GTK was installed.\n" +
"To help you, this folder must contain the subfolders\n" +
"\"include\" and \"lib\".");
Wizard.AddInfoPage(_T("GtkIntro"), intro_msg);
Wizard.AddProjectPathPage();
Wizard.AddGenericSelectPathPage(_T("GtkPath"), gtkpath_msg, _T("GTK's location:"), GtkPathDefault);
Wizard.AddCompilerPage(_T(""), _T("gcc*"), true, true);
}
////////////////////////////////////////////////////////////////////////////////
// Gtk's path page
////////////////////////////////////////////////////////////////////////////////
function OnLeave_GtkPath(fwd)
{
if (fwd)
{
local dir = Wizard.GetTextControlValue(_T("txtFolder")); // txtFolder is the text control in GenericSelectPathPage
local dir_nomacro = VerifyDirectory(dir);
if (dir_nomacro.IsEmpty())
return false;
// verify include dependencies
local dir_nomacro_inc = GetCompilerIncludeDir(dir, GtkPathDefault, GtkPathDefaultInc);
if (dir_nomacro_inc.IsEmpty())
return false;
if (!VerifyFile(dir_nomacro_inc + wxFILE_SEP_PATH + _T("gtk-2.0") + wxFILE_SEP_PATH +_T("gtk"), _T("gtk.h"), _T("GTK's include")))
return false;
// verify library dependencies
local dir_nomacro_lib = GetCompilerLibDir(dir, GtkPathDefault, GtkPathDefaultLib);
if (dir_nomacro_lib.IsEmpty())
return false;
if (!VerifyLibFile(dir_nomacro_lib, _T("gtk-win32-2.0"), _T("GTK's")))
return false;
GtkPath = dir; // Remember the original selection.
local is_macro = _T("");
// try to resolve the include directory as macro
is_macro = GetCompilerIncludeMacro(dir, GtkPathDefault, GtkPathDefaultInc);
if (is_macro.IsEmpty())
{
// not possible -> use the real inc path we had computed instead
GtkPathDefaultInc = dir_nomacro_inc;
}
// try to resolve the library directory as macro
is_macro = GetCompilerLibMacro(dir, GtkPathDefault, GtkPathDefaultLib);
if (is_macro.IsEmpty())
{
// not possible -> use the real lib path we had computed instead
GtkPathDefaultLib = dir_nomacro_lib;
}
}
return true;
}
// return the files this project contains
function GetFilesDir()
{
return _T("gtk/files");
}
// setup the already created project
function SetupProject(project)
{
project.AddIncludeDir(GtkPathDefaultInc);
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("gtk-2.0"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("cairo"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("gdk"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("glib-2.0"));
// Notice GtkPathDefault*Lib* at some positions. This is correct as of 2.8.20
project.AddIncludeDir(GtkPathDefaultLib + wxFILE_SEP_PATH + _T("glib-2.0") + wxFILE_SEP_PATH + _T("include"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("pango-1.0"));
project.AddIncludeDir(GtkPathDefaultLib + wxFILE_SEP_PATH + _T("gtk-2.0") + wxFILE_SEP_PATH + _T("include"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("atk-1.0"));
project.AddLibDir(GtkPathDefaultLib);
if (PLATFORM == PLATFORM_MSW)
{
// add link libraries
project.AddLinkLib(_T("gtk-win32-2.0"));
project.AddLinkLib(_T("gobject-2.0"));
project.AddLinkLib(_T("glib-2.0"));
// Notice: there are more libs required as the app gets more complex, e.g.:
// pangocairo-1.0.lib, pangocairo-1.0.lib, libatk-1.0.dll.a,
// gdk_pixbuf-2.0.lib, gdk-win32-2.0.lib, pango-1.0.lib,
// gmodule-2.0.lib, gthread-2.0.lib, cairo.lib,
// pangoft2-1.0.lib (...)
}
else
{
project.AddLinkLib(_T("gtk-x11-2.0"));
}
// enable compiler warnings (project-wide)
WarningsOn(project, Wizard.GetCompilerID());
project.AddCompilerOption(_T("-mms-bitfields"));
// Debug
local target = project.GetBuildTarget(Wizard.GetDebugName());
if (!IsNull(target))
{
target.SetTargetType(ttConsoleOnly); // ttConsoleOnly: console for debugging
target.SetOutputFilename(Wizard.GetDebugOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE);
// enable generation of debugging symbols for target
DebugSymbolsOn(target, Wizard.GetCompilerID());
}
// Release
target = project.GetBuildTarget(Wizard.GetReleaseName());
if (!IsNull(target))
{
target.SetTargetType(ttExecutable); // ttExecutable: no console
target.SetOutputFilename(Wizard.GetReleaseOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE);
// enable optimizations for target
OptimizationsOn(target, Wizard.GetCompilerID());
}
return true;
}
;)
-
Hello,
I make up this topic, I corrected a problem in the path verification on Linux. Can you activate GTK+ project for Linux ?
////////////////////////////////////////////////////////////////////////////////
//
// GTK project wizard
//
////////////////////////////////////////////////////////////////////////////////
// globals
GtkPathDefault <- _T("$(#gtk)");
GtkPathDefaultInc <- _T("$(#gtk.include)");
GtkPathDefaultLib <- _T("$(#gtk.lib)");
GtkPath <- _T("");
function BeginWizard()
{
local intro_msg = _T("Welcome to the new GTK project wizard!\n" +
"This wizard will guide you to create a new GTK project\n" +
"using the GTK cross-platform GUI toolkit\n\n" +
"When you're ready to proceed, please click \"Next\"...");
local gtkpath_msg = _T("Please select the location of GTK on your computer.\n" +
"This is the top-level folder where GTK was installed.\n" +
"To help you, this folder must contain the subfolders\n" +
"\"include\" and \"lib\".");
Wizard.AddInfoPage(_T("GtkIntro"), intro_msg);
Wizard.AddProjectPathPage();
Wizard.AddGenericSelectPathPage(_T("GtkPath"), gtkpath_msg, _T("GTK's location:"), GtkPathDefault);
Wizard.AddCompilerPage(_T(""), _T("gcc*"), true, true);
}
////////////////////////////////////////////////////////////////////////////////
// Gtk's path page
////////////////////////////////////////////////////////////////////////////////
function OnLeave_GtkPath(fwd)
{
if (fwd)
{
local dir = Wizard.GetTextControlValue(_T("txtFolder")); // txtFolder is the text control in GenericSelectPathPage
local dir_nomacro = VerifyDirectory(dir);
if (dir_nomacro.IsEmpty())
return false;
// verify include dependencies
local dir_nomacro_inc = GetCompilerIncludeDir(dir, GtkPathDefault, GtkPathDefaultInc);
if (dir_nomacro_inc.IsEmpty())
return false;
if (!VerifyFile(dir_nomacro_inc + wxFILE_SEP_PATH + _T("gtk-2.0") + wxFILE_SEP_PATH +_T("gtk"), _T("gtk.h"), _T("GTK's include")))
return false;
// verify library dependencies
local dir_nomacro_lib = GetCompilerLibDir(dir, GtkPathDefault, GtkPathDefaultLib);
if (dir_nomacro_lib.IsEmpty())
return false;
if (PLATFORM == PLATFORM_MSW)
{
if (!VerifyLibFile(dir_nomacro_lib, _T("gtk-win32-2.0"), _T("GTK's")))
return false;
}
else
{
if (!VerifyLibFile(dir_nomacro_lib, _T("gtk-x11-2.0"), _T("GTK's")))
return false;
}
GtkPath = dir; // Remember the original selection.
local is_macro = _T("");
// try to resolve the include directory as macro
is_macro = GetCompilerIncludeMacro(dir, GtkPathDefault, GtkPathDefaultInc);
if (is_macro.IsEmpty())
{
// not possible -> use the real inc path we had computed instead
GtkPathDefaultInc = dir_nomacro_inc;
}
// try to resolve the library directory as macro
is_macro = GetCompilerLibMacro(dir, GtkPathDefault, GtkPathDefaultLib);
if (is_macro.IsEmpty())
{
// not possible -> use the real lib path we had computed instead
GtkPathDefaultLib = dir_nomacro_lib;
}
}
return true;
}
// return the files this project contains
function GetFilesDir()
{
return _T("gtk/files");
}
// setup the already created project
function SetupProject(project)
{
project.AddIncludeDir(GtkPathDefaultInc);
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("gtk-2.0"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("cairo"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("gdk"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("glib-2.0"));
// Notice GtkPathDefault*Lib* at some positions. This is correct as of 2.8.20
project.AddIncludeDir(GtkPathDefaultLib + wxFILE_SEP_PATH + _T("glib-2.0") + wxFILE_SEP_PATH + _T("include"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("pango-1.0"));
project.AddIncludeDir(GtkPathDefaultLib + wxFILE_SEP_PATH + _T("gtk-2.0") + wxFILE_SEP_PATH + _T("include"));
project.AddIncludeDir(GtkPathDefaultInc + wxFILE_SEP_PATH + _T("atk-1.0"));
project.AddLibDir(GtkPathDefaultLib);
if (PLATFORM == PLATFORM_MSW)
{
// add link libraries
project.AddLinkLib(_T("gtk-win32-2.0"));
project.AddLinkLib(_T("gobject-2.0"));
project.AddLinkLib(_T("glib-2.0"));
// Notice: there are more libs required as the app gets more complex, e.g.:
// pangocairo-1.0.lib, pangocairo-1.0.lib, libatk-1.0.dll.a,
// gdk_pixbuf-2.0.lib, gdk-win32-2.0.lib, pango-1.0.lib,
// gmodule-2.0.lib, gthread-2.0.lib, cairo.lib,
// pangoft2-1.0.lib (...)
}
else
{
project.AddLinkLib(_T("gtk-x11-2.0"));
}
// enable compiler warnings (project-wide)
WarningsOn(project, Wizard.GetCompilerID());
project.AddCompilerOption(_T("-mms-bitfields"));
// Debug
local target = project.GetBuildTarget(Wizard.GetDebugName());
if (!IsNull(target))
{
target.SetTargetType(ttConsoleOnly); // ttConsoleOnly: console for debugging
target.SetOutputFilename(Wizard.GetDebugOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE);
// enable generation of debugging symbols for target
DebugSymbolsOn(target, Wizard.GetCompilerID());
}
// Release
target = project.GetBuildTarget(Wizard.GetReleaseName());
if (!IsNull(target))
{
target.SetTargetType(ttExecutable); // ttExecutable: no console
target.SetOutputFilename(Wizard.GetReleaseOutputDir() + Wizard.GetProjectName() + DOT_EXT_EXECUTABLE);
// enable optimizations for target
OptimizationsOn(target, Wizard.GetCompilerID());
}
return true;
}