[anjuta] am: Find target modules and display them in the project tree view



commit 30dd6ea7686cef7b9c2b99ad228e192b94ff1f78
Author: Sébastien Granjoux <seb sfo free fr>
Date:   Wed Nov 24 22:39:58 2010 +0100

    am: Find target modules and display them in the project tree view

 libanjuta/anjuta-project.h         |    2 +-
 plugins/am-project/am-project.c    |  107 +++++++++++++++++++++++++++++++++++-
 plugins/am-project/am-properties.c |   67 ++++++++++++++++++++++
 plugins/am-project/am-properties.h |    3 +-
 4 files changed, 176 insertions(+), 3 deletions(-)
---
diff --git a/libanjuta/anjuta-project.h b/libanjuta/anjuta-project.h
index 5277db0..bd33073 100644
--- a/libanjuta/anjuta-project.h
+++ b/libanjuta/anjuta-project.h
@@ -76,7 +76,7 @@ typedef enum
 	ANJUTA_PROJECT_UNKNOWN = 0,
 	ANJUTA_PROJECT_SHAREDLIB,
 	ANJUTA_PROJECT_STATICLIB,
-	ANJUTA_PROJECT_BINARY,
+	ANJUTA_PROJECT_PROGRAM,
 	ANJUTA_PROJECT_PYTHON,
 	ANJUTA_PROJECT_JAVA,
 	ANJUTA_PROJECT_LISP,
diff --git a/plugins/am-project/am-project.c b/plugins/am-project/am-project.c
index 072d6dc..bb54d02 100644
--- a/plugins/am-project/am-project.c
+++ b/plugins/am-project/am-project.c
@@ -123,7 +123,7 @@ static AmpNodeInfo AmpNodeInformations[] = {
 	"_LIBRARIES",
 	"lib"},
 
-	{{ANJUTA_PROJECT_TARGET | ANJUTA_PROJECT_PRIMARY | ANJUTA_PROJECT_EXECUTABLE | ANJUTA_PROJECT_BINARY,
+	{{ANJUTA_PROJECT_TARGET | ANJUTA_PROJECT_PRIMARY | ANJUTA_PROJECT_PROGRAM | ANJUTA_PROJECT_EXECUTABLE,
 	N_("Program"),
 	"application/x-executable"},
 	AM_TOKEN__PROGRAMS,
@@ -1355,6 +1355,110 @@ project_load_group_properties (AmpProject *project, AnjutaToken *token, AnjutaTo
 	return NULL;
 }
 
+/* Find if pkg-config modules are used in group targets */
+static gboolean
+project_load_group_module (AmpProject *project, AnjutaAmGroupNode *group)
+{
+	AnjutaProjectNode *target;
+	AnjutaProjectProperty *prop;
+	gchar **group_cpp = NULL;
+
+	prop = amp_node_get_property_from_token (ANJUTA_PROJECT_NODE (group), AM_TOKEN__CPPFLAGS);
+	if (prop) group_cpp = g_strsplit_set (prop->value, " \t", 0);
+	
+	/* Check all targets */
+	for (target = anjuta_project_node_first_child (ANJUTA_PROJECT_NODE (group)); target != NULL; target = anjuta_project_node_next_sibling (target))
+	{
+		gint type = anjuta_project_node_get_full_type (target) & (ANJUTA_PROJECT_ID_MASK | ANJUTA_PROJECT_TYPE_MASK);
+		gchar **target_lib = NULL;
+		gchar **target_cpp = NULL;
+
+		prop = NULL;
+		switch (type)
+		{
+		case ANJUTA_PROJECT_TARGET | ANJUTA_PROJECT_PROGRAM:
+			prop = amp_node_get_property_from_token (target, AM_TOKEN_TARGET_LDADD);
+			break;
+		case ANJUTA_PROJECT_TARGET | ANJUTA_PROJECT_STATICLIB:
+		case ANJUTA_PROJECT_TARGET | ANJUTA_PROJECT_SHAREDLIB:
+			prop = amp_node_get_property_from_token (target, AM_TOKEN_TARGET_LIBADD);
+			break;
+		default:
+			break;
+		}
+		if (prop) target_lib = g_strsplit_set (prop->value, " \t", 0);
+
+		/* Check if targets use libraries */
+		if (target_lib != NULL)
+		{
+			AnjutaProjectNode *module;
+
+			prop = amp_node_get_property_from_token (target, AM_TOKEN_TARGET_CPPFLAGS);
+			if (prop) target_cpp = g_strsplit_set (prop->value, " \t", 0);
+						
+			for (module = anjuta_project_node_first_child (ANJUTA_PROJECT_NODE (project)); module != NULL; module = anjuta_project_node_next_sibling (module))
+			{
+				if (anjuta_project_node_get_node_type (module) == ANJUTA_PROJECT_MODULE)
+				{
+					const gchar *name = anjuta_project_node_get_name (module);
+					gchar *lib_flags = g_strconcat ("$(", name, "_LIBS)", NULL);
+					gchar **flags;
+
+					for (flags = target_lib; *flags != NULL; flags++)
+					{
+
+						if (strcmp (*flags, lib_flags) == 0)
+						{
+							gchar *cpp_flags = g_strconcat ("$(", name, "_CFLAGS)", NULL);
+							gchar **cflags;
+							gboolean found = FALSE;
+
+							if (group_cpp != NULL)
+							{
+								for (cflags = group_cpp; *cflags != NULL; cflags++)
+								{
+									if (strcmp (*cflags, cpp_flags) == 0)
+									{
+										found = TRUE;
+										break;
+									}
+								}
+							}
+							if ((target_cpp != NULL) && !found)
+							{
+								for (cflags = target_cpp; *cflags != NULL; cflags++)
+								{
+									if (strcmp (*cflags, cpp_flags) == 0)
+									{
+										found = TRUE;
+										break;
+									}
+								}
+							}
+							if (found)
+							{
+								/* Add new module */
+								AnjutaProjectNode *new_module;
+
+								new_module = project_node_new (project, ANJUTA_PROJECT_MODULE, NULL, name, NULL);
+								anjuta_project_node_append (target, new_module);
+							}
+							g_free (cpp_flags);
+						}
+					}
+					g_free (lib_flags);
+				}
+			}		
+			g_strfreev (target_cpp);
+			g_strfreev (target_lib);
+		}
+	}
+	g_strfreev (group_cpp);
+
+	return TRUE;
+}
+
+
 static AnjutaAmGroupNode* project_load_makefile (AmpProject *project, AnjutaAmGroupNode *group);
 
 static gboolean
@@ -1461,6 +1565,7 @@ project_load_makefile (AmpProject *project, AnjutaAmGroupNode *group)
 	DEBUG_PRINT ("Parse: %s", g_file_get_uri (makefile));
 	tfile = amp_group_set_makefile (group, makefile, G_OBJECT (project));
 
+	project_load_group_module (project, group);
 	
 	return group;
 }
diff --git a/plugins/am-project/am-properties.c b/plugins/am-project/am-properties.c
index 378bfb6..7ec49b2 100644
--- a/plugins/am-project/am-properties.c
+++ b/plugins/am-project/am-properties.c
@@ -93,6 +93,52 @@ static AmpProperty AmpTargetProperties[] = {
 
 static GList* AmpTargetPropertyList = NULL;
 
+static AmpProperty AmpProgramTargetProperties[] = {
+	{{N_("Do not install:"), 						ANJUTA_PROJECT_PROPERTY_BOOLEAN,  	ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS,			3, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	NULL},
+	{{N_("Installation directory:"),			ANJUTA_PROJECT_PROPERTY_STRING,		ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS,			6, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	NULL},
+	{{N_("Linker flags:"),							ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_LDFLAGS,	0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_LDFLAGS"},
+	{{N_("Libraries:"),						ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_LDADD,		0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_LDADD"},
+	{{N_("C preprocessor flags:"),			ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_CPPFLAGS,	0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_CPPFLAGS"},
+	{{N_("C compiler flags:"),					ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_CFLAGS,		0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_CFLAGS"},
+	{{N_("C++ compiler flags:"),			ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_CXXFLAGS,	0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_CXXFLAGS"},
+	{{N_("Java compiler flags:"),				ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_JAVACFLAGS,0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_JAVACFLAGS"},
+	{{N_("Vala compiler flags:"),				ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_VALAFLAGS,0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_VALAFLAGS"},
+	{{N_("Fortan compiler flags:"),			ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_FCFLAGS,	0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_FCFLAGS"},
+	{{N_("Objective C compiler flags:"),	ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_OBJCFLAGS,0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_OBJCFLAGS"},
+	{{N_("Lex/Flex flags:"),						ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_LFLAGS,		0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_LFLAGS"},
+	{{N_("Yacc/Bison flags:"),					ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_YFLAGS,		0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_YFLAGS"},
+	{{N_("Additional dependencies:"),	ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_DEPENDENCIES, 0, 	AM_PROPERTY_IN_MAKEFILE, NULL,	"EXTRA_DIST"},
+	{{N_("Include in distribution:"),			ANJUTA_PROJECT_PROPERTY_BOOLEAN,	ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS, 			2, 	AM_PROPERTY_IN_MAKEFILE, 	NULL,	NULL},
+	{{N_("Build for check only:"),			ANJUTA_PROJECT_PROPERTY_BOOLEAN,	ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS,			4, 	AM_PROPERTY_IN_MAKEFILE, 	NULL,	NULL},
+	{{N_("Do not use prefix:"),				ANJUTA_PROJECT_PROPERTY_BOOLEAN,	ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS, 			1, 	AM_PROPERTY_IN_MAKEFILE, 	NULL,	NULL},
+	{{N_("Keep target path:"),					ANJUTA_PROJECT_PROPERTY_BOOLEAN,	ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS, 			0, 	AM_PROPERTY_IN_MAKEFILE, 	NULL,	NULL},
+	{{NULL,											ANJUTA_PROJECT_PROPERTY_STRING, 		0,																NULL,	NULL}, 	0, 											0,		0,											NULL,	NULL}};
+
+static GList* AmpProgramTargetPropertyList = NULL;
+
+static AmpProperty AmpLibraryTargetProperties[] = {
+	{{N_("Do not install:"), 						ANJUTA_PROJECT_PROPERTY_BOOLEAN,  	ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS,			3, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	NULL},
+	{{N_("Installation directory:"),			ANJUTA_PROJECT_PROPERTY_STRING,		ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS,			6, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	NULL},
+	{{N_("Linker flags:"),							ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_LDFLAGS,	0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_LDFLAGS"},
+	{{N_("Libraries:"),							ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_LIBADD,		0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_LIBADD"},
+	{{N_("C preprocessor flags:"),			ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_CPPFLAGS,	0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_CPPFLAGS"},
+	{{N_("C compiler flags:"),					ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_CFLAGS,		0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_CFLAGS"},
+	{{N_("C++ compiler flags:"),			ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_CXXFLAGS,	0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_CXXFLAGS"},
+	{{N_("Java compiler flags:"),				ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_JAVACFLAGS,0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_JAVACFLAGS"},
+	{{N_("Vala compiler flags:"),				ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_VALAFLAGS,0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_VALAFLAGS"},
+	{{N_("Fortan compiler flags:"),			ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_FCFLAGS,	0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_FCFLAGS"},
+	{{N_("Objective C compiler flags:"),	ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_OBJCFLAGS,0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_OBJCFLAGS"},
+	{{N_("Lex/Flex flags:"),						ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_LFLAGS,		0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_LFLAGS"},
+	{{N_("Yacc/Bison flags:"),					ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_YFLAGS,		0, 	AM_PROPERTY_IN_MAKEFILE,	NULL,	"_YFLAGS"},
+	{{N_("Additional dependencies:"),	ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_WRITE,	NULL,	NULL},	AM_TOKEN_TARGET_DEPENDENCIES, 0, 	AM_PROPERTY_IN_MAKEFILE, NULL,	"EXTRA_DIST"},
+	{{N_("Include in distribution:"),			ANJUTA_PROJECT_PROPERTY_BOOLEAN,	ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS, 			2, 	AM_PROPERTY_IN_MAKEFILE, 	NULL,	NULL},
+	{{N_("Build for check only:"),			ANJUTA_PROJECT_PROPERTY_BOOLEAN,	ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS,			4, 	AM_PROPERTY_IN_MAKEFILE, 	NULL,	NULL},
+	{{N_("Do not use prefix:"),				ANJUTA_PROJECT_PROPERTY_BOOLEAN,	ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS, 			1, 	AM_PROPERTY_IN_MAKEFILE, 	NULL,	NULL},
+	{{N_("Keep target path:"),					ANJUTA_PROJECT_PROPERTY_BOOLEAN,	ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS, 			0, 	AM_PROPERTY_IN_MAKEFILE, 	NULL,	NULL},
+	{{NULL,											ANJUTA_PROJECT_PROPERTY_STRING, 		0,																NULL,	NULL}, 	0, 											0,		0,											NULL,	NULL}};
+
+static GList* AmpLibraryTargetPropertyList = NULL;
+
 static AmpProperty AmpManTargetProperties[] = {
 	{{N_("Additional dependencies:"),	ANJUTA_PROJECT_PROPERTY_LIST, 			ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	0, 									0, 	AM_PROPERTY_IN_MAKEFILE, NULL,	NULL},
 	{{N_("Do not use prefix:"), 				ANJUTA_PROJECT_PROPERTY_BOOLEAN, 	ANJUTA_PROJECT_PROPERTY_READ_ONLY,		NULL,	NULL},	AM_TOKEN__PROGRAMS,	1, 	AM_PROPERTY_IN_MAKEFILE, NULL,	NULL},
@@ -284,7 +330,23 @@ amp_node_property_set (AnjutaProjectNode *node, AnjutaProjectProperty *prop, con
 	return new_prop;
 }
 
+AnjutaProjectProperty *
+amp_node_get_property_from_token (AnjutaProjectNode *node, gint token)
+{
+	GList *item;
+
+	for (item = anjuta_project_node_get_native_properties (node); item != NULL; item = g_list_next (item))
+	{
+		AmpProperty *prop = (AmpProperty *)item->data;
 
+		if (prop->token_type == token)
+		{
+			return anjuta_project_node_get_property (node, (AnjutaProjectProperty *)prop);
+		}
+	}
+
+	return NULL;
+}
 
 /* Get property list
  *---------------------------------------------------------------------------*/
@@ -306,6 +368,11 @@ amp_get_target_property_list (AnjutaProjectNodeType type)
 {
 	switch (type & ANJUTA_PROJECT_ID_MASK)
 	{
+	case ANJUTA_PROJECT_PROGRAM:
+		return amp_create_property_list (&AmpProgramTargetPropertyList, AmpProgramTargetProperties);
+	case ANJUTA_PROJECT_SHAREDLIB:
+	case ANJUTA_PROJECT_STATICLIB:
+		return amp_create_property_list (&AmpLibraryTargetPropertyList, AmpLibraryTargetProperties);
 	case ANJUTA_PROJECT_MAN:
 		return amp_create_property_list (&AmpManTargetPropertyList, AmpManTargetProperties);
 	default:
diff --git a/plugins/am-project/am-properties.h b/plugins/am-project/am-properties.h
index e2721a1..8322bb5 100644
--- a/plugins/am-project/am-properties.h
+++ b/plugins/am-project/am-properties.h
@@ -33,7 +33,8 @@ void amp_property_free (AnjutaProjectProperty *prop);
 
 gboolean amp_node_property_load (AnjutaProjectNode *target, gint token_type, gint position, const gchar *value, AnjutaToken *token);
 gboolean amp_node_property_add (AnjutaProjectNode *node, AnjutaProjectProperty *prop);
-AnjutaProjectProperty * amp_node_property_set (AnjutaProjectNode *node, AnjutaProjectProperty *prop, const gchar* value);
+AnjutaProjectProperty *amp_node_property_set (AnjutaProjectNode *node, AnjutaProjectProperty *prop, const gchar* value);
+AnjutaProjectProperty *amp_node_get_property_from_token (AnjutaProjectNode *node, gint token);
 
 GList* amp_get_project_property_list (void);
 GList* amp_get_group_property_list (void);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]