recipe blacklisted information
PATCH v2 1/1 recipe blacklisted information
Display blacklisted information for recipes on Layerindex, in the recipe details, as well as the recipe search page, and layer page tables. This information is pulled from the PNBLACKLIST variable. Includes a hover text containing the reason for blacklist labels.
Changes to Django and Layerindex files:
- models.py, update.py
- migration file
- templates and static content (stylesheet)
[YOCTO #7855]
--- .../0010_auto__add_field_recipe_blacklisted.py | 197 +++++++++++++++++++++ layerindex/models.py | 1 + layerindex/static/css/additional.css | 19 +- layerindex/update.py | 1 + templates/layerindex/detail.html | 3 +- templates/layerindex/recipedetail.html | 13 +- templates/layerindex/recipes.html | 3 +- 7 files changed, 232 insertions(+), 5 deletions(-) create mode 100644 layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py
layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +197 -0
@@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Recipe.blacklisted' + db.add_column('layerindex_recipe', 'blacklisted', + self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Recipe.blacklisted' + db.delete_column('layerindex_recipe', 'blacklisted') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'layerindex.bbappend': { + 'Meta': {'object_name': 'BBAppend'}, + 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'filepath': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']"}) + }, + 'layerindex.bbclass': { + 'Meta': {'object_name': 'BBClass'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'layerindex.branch': { + 'Meta': {'object_name': 'Branch'}, + 'bitbake_branch': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'sort_priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank': 'True'}) + }, + 'layerindex.classicrecipe': { + 'Meta': {'object_name': 'ClassicRecipe', '_ormbases': ['layerindex.Recipe']}, + 'classic_category': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'cover_comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'cover_layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'cover_pn': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'cover_status': ('django.db.models.fields.CharField', [], {'default': "'U'", 'max_length': '1'}), + 'cover_verified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'recipe_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['layerindex.Recipe']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'layerindex.layerbranch': { + 'Meta': {'object_name': 'LayerBranch'}, + 'actual_branch': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}), + 'branch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.Branch']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerItem']"}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'vcs_last_commit': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'vcs_last_fetch': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'vcs_last_rev': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}), + 'vcs_subdir': ('django.db.models.fields.CharField', [], {'max_length': '40', 'blank': 'True'}) + }, + 'layerindex.layerdependency': { + 'Meta': {'object_name': 'LayerDependency'}, + 'dependency': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dependents_set'", 'to': "orm['layerindex.LayerItem']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dependencies_set'", 'to': "orm['layerindex.LayerBranch']"}) + }, + 'layerindex.layeritem': { + 'Meta': {'object_name': 'LayerItem'}, + 'classic': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'index_preference': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'layer_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'mailing_list_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'N'", 'max_length': '1'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'usage_url': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'vcs_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'vcs_web_file_base_url': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'vcs_web_tree_base_url': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'vcs_web_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}) + }, + 'layerindex.layermaintainer': { + 'Meta': {'object_name': 'LayerMaintainer'}, + 'email': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'responsibility': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'A'", 'max_length': '1'}) + }, + 'layerindex.layernote': { + 'Meta': {'object_name': 'LayerNote'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerItem']"}), + 'text': ('django.db.models.fields.TextField', [], {}) + }, + 'layerindex.machine': { + 'Meta': {'object_name': 'Machine'}, + 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + 'layerindex.recipe': { + 'Meta': {'object_name': 'Recipe'}, + 'bbclassextend': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'blacklisted': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'bugtracker': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'filepath': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inherits': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']"}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'pn': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'provides': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'pv': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'section': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + 'layerindex.recipechange': { + 'Meta': {'object_name': 'RecipeChange'}, + 'bugtracker': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'changeset': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.RecipeChangeset']"}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['layerindex.Recipe']"}), + 'section': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'summary': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}) + }, + 'layerindex.recipechangeset': { + 'Meta': {'object_name': 'RecipeChangeset'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'layerindex.recipefiledependency': { + 'Meta': {'object_name': 'RecipeFileDependency'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['layerindex.LayerBranch']"}), + 'path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.Recipe']"}) + } + } + + complete_apps = ['layerindex']
layerindex/models.py +1 -0
@@ -244,6 +244,7 @@ class Recipe(models.Model): bbclassextend = models.CharField(max_length=100, blank=True) inherits = models.CharField(max_length=255, blank=True) updated = models.DateTimeField(auto_now = True) + blacklisted = models.CharField(max_length=255, blank=True) def vcs_web_url(self): url = self.layerbranch.file_url(os.path.join(self.filepath, self.filename))
layerindex/static/css/additional.css +17 -2
@@ -200,14 +200,29 @@ padding: 8px; margin-left: 8px; } -.icon-hdd { +.label-inverse, .icon-hdd { margin-left: 6px; } -.icon-hdd:hover { +.label-inverse:hover, .icon-hdd:hover { cursor: pointer; } +.label-inverse:hover { + background-color: #999; +} + ul.unstyled { margin-bottom: 0; } + +blockquote.span7.warn { + border-color: #c09853; + margin-bottom: 0; + margin-left: 0; + min-height: 0; +} + +.valign-middle { + vertical-align: middle; +}
layerindex/update.py +1 -0
@@ -69,6 +69,7 @@ def update_recipe_file(data, path, recipe, layerdir_start, repodir): gr = set(data.getVar("__inherit_cache", True) or []) lr = set(envdata.getVar("__inherit_cache", True) or []) recipe.inherits = ' '.join(sorted({split_recipe_fn(r)[0] for r in lr if r not in gr})) + recipe.blacklisted = envdata.getVarFlag('PNBLACKLIST', recipe.pn, True) or "" recipe.save() # Get file dependencies within this layer
templates/layerindex/detail.html +2 -1
@@ -198,7 +198,7 @@ <tbody> {% for recipe in layerbranch.sorted_recipes %} <tr> - <td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}</td> + <td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}{% if recipe.blacklisted %}<span class="label label-inverse" title="{{ recipe.blacklisted }}">blacklisted</span>{% endif %}</td> <td>{{ recipe.pv }}</td> <td class="span8">{{ recipe.short_desc }}</td> </tr>
@@ -323,6 +323,7 @@ }) $('.icon-hdd').tooltip({title:"Inherits image"}); + $('.label-inverse').tooltip(); }); }); </script>
templates/layerindex/recipedetail.html +12 -1
@@ -30,9 +30,20 @@ <div class="row-fluid"> <div class="page-header"> - <h1>{{ recipe.name }} {{ recipe.pv }}</h1> + <h1>{{ recipe.name }} {{ recipe.pv }} {% if recipe.blacklisted %} <span class="label label-inverse valign-middle">blacklisted</span> {% endif %}</h1> </div> + {% if recipe.blacklisted %} + <div class="alert"> + <div class="row-fluid"> + <p>This recipe is <strong>blacklisted</strong> by the <a href="{% url layer_item recipe.layerbranch.branch.name recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a> layer. The reason provided is:</p> + <blockquote class="span7 warn"> + <p>{{ recipe.blacklisted }}</p> + </blockquote> + </div> + </div> + {% endif %} + <table class="table table-striped table-bordered"> <tbody> <tr>
templates/layerindex/recipes.html +2 -1
@@ -52,7 +52,7 @@ <tbody> {% for recipe in recipe_list %} <tr {% if recipe.preferred_count > 0 %}class="muted"{% endif %}> - <td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}</td> + <td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}{% if recipe.blacklisted %}<span class="label label-inverse" title="{{ recipe.blacklisted }}">blacklisted</span>{% endif %}</td> <td>{{ recipe.pv }}</td> <td>{{ recipe.short_desc }}</td> <td><a href="{% url layer_item url_branch recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a></td>
@@ -84,6 +84,7 @@ firstfield.focus() $('.icon-hdd').tooltip({title:"Inherits image"}); + $('.label-inverse').tooltip(); }); </script> {% endblock %}
Signature · 1 line
1.8.4.5
Hi Alex,
Quoted 440 lines · On Mon, 30 Nov 2015 16:03:05 Alex Franco wrote:
Display blacklisted information for recipes on Layerindex, in the recipe details, as well as the recipe search page, and layer page tables. This information is pulled from the PNBLACKLIST variable. Includes a hover text containing the reason for blacklist labels.
Changes to Django and Layerindex files:
-models.py,update.py
- migration file
- templates and static content (stylesheet)[YOCTO #7855]
Signed-off-by Alex Franco <[email protected]>--- .../0010_auto__add_field_recipe_blacklisted.py | 197 +++++++++++++++++++++ layerindex/models.py | 1 + layerindex/static/css/additional.css | 19 +- layerindex/update.py | 1 + templates/layerindex/detail.html | 3 +- templates/layerindex/recipedetail.html | 13 +- templates/layerindex/recipes.html | 3 +- 7 files changed, 232 insertions(+), 5 deletions(-) create mode 100644
layerindex/migrations/0010_auto__add_field_recipe_blacklisted.pydiff --git
a/layerindex/migrations/0010_auto__add_field_recipe_blacklisted.pyb/layerindex/migrations/0010_auto__add_field_recipe_blacklisted.pynew file mode 100644
index 0000000..e1bb12clayerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +13
-0@@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Recipe.blacklisted' + db.add_column('layerindex_recipe', 'blacklisted', +self.gf('django.db.models.fields.CharField')(default='', max_length=255,
blank=True), + keep_default=False)layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +11
-0+ + + def backwards(self, orm): + # Deleting field 'Recipe.blacklisted' + db.delete_column('layerindex_recipe', 'blacklisted') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key':'True'}), + 'name': ('django.db.models.fields.CharField', [],
{'unique': 'True', 'max_length': '80'}), + 'permissions':
('django.db.models.fields.related.ManyToManyField', [], {'to':
"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) +
},layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +2
-0+ 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label','
content_type__model', 'codename')", 'unique_together': "(('content_type',
'codename'),)", 'object_name': 'Permission'}, + 'codename':
('django.db.models.fields.CharField', [], {'max_length': '100'}), +
'content_type': ('django.db.models.fields.related.ForeignKey', [],
{'to': "orm['contenttypes.ContentType']"}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +'name': ('django.db.models.fields.CharField', [], {'max_length':'50'}) + },
layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [],{'default': 'datetime.datetime.now'}), + 'email':
('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank':
'True'}), + 'first_name': ('django.db.models.fields.CharField',
[], {'max_length': '30', 'blank': 'True'}), + 'groups':
('django.db.models.fields.related.ManyToManyField', [], {'to':
"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), +
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [],
{'default': 'True'}), + 'is_staff':
('django.db.models.fields.BooleanField', [], {'default': 'False'}), +'is_superuser': ('django.db.models.fields.BooleanField', [],{'default': 'False'}), + '
last_login':
('django.db.models.fields.DateTimeField', [], {'default':
'datetime.datetime.now'}), + 'last_name':
('django.db.models.fields.CharField', [], {'max_length': '30', 'blank':
'True'}), + 'password': ('django.db.models.fields.CharField',
[], {'max_length': '128'}), + 'user_permissions':
('django.db.models.fields.related.ManyToManyField', [], {'to':
"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), +'username': ('django.db.models.fields.CharField', [], {'unique':'True', '
max_length': '30'}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +2
-0+ 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together':"(('
app_label', 'model'),)", 'object_name': 'ContentType', 'db_table':
"'django_content_type'"}, + 'app_label':
('django.db.models.fields.CharField', [], {'max_length': '100'}), +
'id': ('django.db.models.fields.AutoField', [], {'primary_key':
'True'}), + 'model': ('django.db.models.fields.CharField', [],
{'max_length': '100'}), + 'name':
('django.db.models.fields.CharField', [], {'max_length': '100'}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.bbappend': { + 'Meta': {'object_name': 'BBAppend'}, + 'filename': ('django.db.models.fields.CharField', [],{'
max_length': '255'}), + 'filepath':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'id': ('django.db.models.fields.AutoField', [],
{'primary_key': 'True'}), + 'layerbranch':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.LayerBranch']"}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.bbclass': { + 'Meta': {'object_name': 'BBClass'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key':'True'}), + 'layerbranch':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.LayerBranch']"}), + 'name':
('django.db.models.fields.CharField', [], {'max_length': '100'}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.branch': { + 'Meta': {'object_name': 'Branch'}, + 'bitbake_branch': ('django.db.models.fields.CharField', [],{'
max_length': '50'}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +'name': ('django.db.models.fields.CharField', [], {'max_length':'50'}), + '
short_description':
('django.db.models.fields.CharField', [], {'max_length': '50', 'blank':
'True'}), + 'sort_priority':
('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank':
'True'}), + 'updated': ('django.db.models.fields.DateTimeField',
[], {'default': 'datetime.datetime.now', 'auto_now': 'True', 'blank':
'True'}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +2
-0+ 'layerindex.classicrecipe': { + 'Meta': {'object_name': 'ClassicRecipe', '_ormbases':['layerindex.Recipe']}, + '
classic_category':
('django.db.models.fields.CharField', [], {'max_length': '100', 'blank':
'True'}), + 'cover_comment':
('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'cover_layerbranch': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['layerindex.LayerBranch']", 'null': 'True', 'on_delete':
'models.SET_NULL', 'blank': 'True'}), + 'cover_pn':
('django.db.models.fields.CharField', [], {'max_length': '100', 'blank':
'True'}), + 'cover_status':
('django.db.models.fields.CharField', [], {'default': "'U'", 'max_length':
'1'}), + 'cover_verified':
('django.db.models.fields.BooleanField', [], {'default': 'False'}), +'recipe_ptr': ('django.db.models.fields.related.OneToOneField', [],{'to': "orm['layerindex.Recipe']", 'unique': 'True', '
primary_key':
'True'}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.layerbranch': { + 'Meta': {'object_name': 'LayerBranch'}, + 'actual_branch': ('django.db.models.fields.CharField', [],{'
max_length': '80', 'blank': 'True'}), + 'branch':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.Branch']"}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +'layer': ('django.db.models.fields.related.ForeignKey', [], {'to':"orm['layerindex.LayerItem']"}), + 'updated':
('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank':
'True'}), + 'vcs_last_commit':
('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank':
'True'}), + 'vcs_last_fetch':
('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank':
'True'}), + 'vcs_last_rev':
('django.db.models.fields.CharField', [], {'max_length': '80', 'blank':
'True'}), + 'vcs_subdir': ('django.db.models.fields.CharField',
[], {'max_length': '40', 'blank': 'True'}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.layerdependency': { + 'Meta': {'object_name': 'LayerDependency'}, + 'dependency': ('django.db.models.fields.related.ForeignKey',[], {'
related_name': "'dependents_set'", 'to':
"orm['layerindex.LayerItem']"}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +'layerbranch': ('django.db.models.fields.related.ForeignKey', [],{'
related_name': "'dependencies_set'", 'to':
"orm['layerindex.LayerBranch']"}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.layeritem': { + 'Meta': {'object_name': 'LayerItem'}, + 'classic': ('django.db.models.fields.BooleanField', [],{'default': 'False'}), + 'description':
('django.db.models.fields.TextField', [], {}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +'index_preference': ('django.db.models.fields.IntegerField', [],{'default': '0'}), + '
layer_type':
('django.db.models.fields.CharField', [], {'max_length': '1'}), +
'mailing_list_url': ('django.db.models.fields.URLField', [],
{'max_length': '200', 'blank': 'True'}), + 'name':
('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length':
'40'}), + 'status': ('django.db.models.fields.CharField', [],
{'default': "'N'", 'max_length': '1'}), + 'summary':
('django.db.models.fields.CharField', [], {'max_length': '200'}), +
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now':
'True', 'blank': 'True'}), + 'usage_url':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'vcs_url': ('django.db.models.fields.CharField', [],
{'max_length': '255'}), + 'vcs_web_file_base_url':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'vcs_web_tree_base_url':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'vcs_web_url': ('django.db.models.fields.URLField',
[], {'max_length': '200', 'blank': 'True'}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.layermaintainer': { + 'Meta': {'object_name': 'LayerMaintainer'}, + 'email': ('django.db.models.fields.CharField', [],{'
max_length': '255'}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +'layerbranch': ('django.db.models.fields.related.ForeignKey', [],{'to': "orm['layerindex.LayerBranch']"}), + 'name':
('django.db.models.fields.CharField', [], {'max_length': '255'}), +
'responsibility': ('django.db.models.fields.CharField', [],
{'max_length': '200', 'blank': 'True'}), + 'status':
('django.db.models.fields.CharField', [], {'default': "'A'", 'max_length':
'1'}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.layernote': { + 'Meta': {'object_name': 'LayerNote'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key':'True'}), + 'layer':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.LayerItem']"}), + 'text':
('django.db.models.fields.TextField', [], {}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.machine': { + 'Meta': {'object_name': 'Machine'}, + 'description': ('django.db.models.fields.CharField', [],{'
max_length': '255'}), + 'id':
('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +'layerbranch': ('django.db.models.fields.related.ForeignKey', [],{'to': "orm['layerindex.LayerBranch']"}), + 'name':
('django.db.models.fields.CharField', [], {'max_length': '255'}), +
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now':
'True', 'blank': 'True'}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.recipe': { + 'Meta': {'object_name': 'Recipe'}, + 'bbclassextend': ('django.db.models.fields.CharField', [],{'
max_length': '100', 'blank': 'True'}), + 'blacklisted':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'bugtracker': ('django.db.models.fields.URLField',
[], {'max_length': '200', 'blank': 'True'}), + 'description':
('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'filename': ('django.db.models.fields.CharField', [], {'max_length':
'255'}), + 'filepath': ('django.db.models.fields.CharField', [],
{'max_length': '255', 'blank': 'True'}), + 'homepage':
('django.db.models.fields.URLField', [], {'max_length': '200', 'blank':
'True'}), + 'id': ('django.db.models.fields.AutoField', [],
{'primary_key': 'True'}), + 'inherits':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'layerbranch':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.LayerBranch']"}), + 'license':
('django.db.models.fields.CharField', [], {'max_length': '100', 'blank':
'True'}), + 'pn': ('django.db.models.fields.CharField', [],
{'max_length': '100', 'blank': 'True'}), + 'provides':
('django.db.models.fields.CharField', [], {'max_length': '255', 'blank':
'True'}), + 'pv': ('django.db.models.fields.CharField', [],
{'max_length': '100', 'blank': 'True'}), + 'section':
('django.db.models.fields.CharField', [], {'max_length': '100', 'blank':
'True'}), + 'summary': ('django.db.models.fields.CharField', [],
{'max_length': '200', 'blank': 'True'}), + 'updated':
('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank':
'True'}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.recipechange': { + 'Meta': {'object_name': 'RecipeChange'}, + 'bugtracker': ('django.db.models.fields.URLField', [],{'
max_length': '200', 'blank': 'True'}), + 'changeset':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.RecipeChangeset']"}), + 'description':
('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200',
'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField',
[], {'primary_key': 'True'}), + 'license':
('django.db.models.fields.CharField', [], {'max_length': '100', 'blank':
'True'}), + 'recipe':
('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'",
'to': "orm['layerindex.Recipe']"}), + 'section':
('django.db.models.fields.CharField', [], {'max_length': '100', 'blank':
'True'}), + 'summary': ('django.db.models.fields.CharField', [],
{'max_length': '100', 'blank': 'True'}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.recipechangeset': { + 'Meta': {'object_name': 'RecipeChangeset'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key':'True'}), + 'name': ('django.db.models.fields.CharField', [],
{'max_length': '255'}), + 'user':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['auth.User']"}) + },layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ 'layerindex.recipefiledependency': { + 'Meta': {'object_name': 'RecipeFileDependency'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key':'True'}), + 'layerbranch':
('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'",
'to': "orm['layerindex.LayerBranch']"}), + 'path':
('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index':
'True'}), + 'recipe':
('django.db.models.fields.related.ForeignKey', [], {'to':
"orm['layerindex.Recipe']"}) + }layerindex/migrations/0010_auto__add_field_recipe_blacklisted.py new file +3
-0+ } + + complete_apps = ['layerindex']layerindex/models.py +1
-0@@ -244,6 +244,7 @@ class Recipe(models.Model): bbclassextend = models.CharField(max_length=100, blank=True) inherits = models.CharField(max_length=255, blank=True) updated = models.DateTimeField(auto_now = True) + blacklisted = models.CharField(max_length=255, blank=True) def vcs_web_url(self): url = self.layerbranch.file_url(os.path.join(self.filepath,self.filename)) diff --git a/layerindex/static/css/additional.css b/layerindex/static/css/additional.css index f76582c..e6cf526 100644
layerindex/static/css/additional.css +17
-2@@ -200,14 +200,29 @@ padding: 8px; margin-left: 8px; } -.icon-hdd { +.label-inverse, .icon-hdd { margin-left: 6px; } -.icon-hdd:hover { +.label-inverse:hover, .icon-hdd:hover { cursor: pointer; } +.label-inverse:hover { + background-color: #999; +} + ul.unstyled { margin-bottom: 0; } + +blockquote.span7.warn { + border-color: #c09853; + margin-bottom: 0; + margin-left: 0; + min-height: 0; +} + +.valign-middle { + vertical-align: middle; +}layerindex/update.py +0
-0@@ -69,6 +69,7 @@ def update_recipe_file(data, path, recipe, layerdir_start, repodir): gr = set(data.getVar("__inherit_cache", True) or []) lr = set(envdata.getVar("__inherit_cache", True) or []) recipe.inherits = ' '.join(sorted({split_recipe_fn(r)[0] for r inlr if r not in gr})) + recipe.blacklisted =
envdata.getVarFlag('PNBLACKLIST', recipe.pn, True)or ""recipe.save()# Get file dependencies within this layer
(quoted diff) +0
-0b/templates/layerindex/detail.html index 8a734ff..feb2c6c 100644
templates/layerindex/detail.html +0
-1@@ -198,7 +198,7 @@ <tbody> {% for recipe in layerbranch.sorted_recipes %} <tr> - <td><a href="{% url recipe recipe.id%}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}</td> +
<td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}{% if recipe.blacklisted %}<span class="label label-inverse" title="{{ recipe.blacklisted }}">blacklisted</span>{% endif %}</td> <td>{{ recipe.pv }}</td><td class="span8">{{ recipe.short_desc }}</td> </tr>templates/layerindex/detail.html +1
-0@@ -323,6 +323,7 @@ }) $('.icon-hdd').tooltip({title:"Inherits image"}); + $('.label-inverse').tooltip(); }); }); </script>(quoted diff) +0
-0b/templates/layerindex/recipedetail.html index 3b8c79b..7dbb362 100644
templates/layerindex/recipedetail.html +1
-1@@ -30,9 +30,20 @@ <div class="row-fluid"> <div class="page-header"> - <h1>{{ recipe.name }} {{ recipe.pv }}</h1> + <h1>{{ recipe.name }} {{ recipe.pv }} {% ifrecipe.blacklisted %} <span class="label label-inverse valign-middle">blacklisted</span> {% endif %}</h1> </div>
templates/layerindex/recipedetail.html +4
-0+ {% if recipe.blacklisted %} + <div class="alert"> + <div class="row-fluid"> + <p>This recipe is <strong>blacklisted</strong> bythe <a href="{% url
layer_itemrecipe.layerbranch.branch.name recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a>
layer. The reason provided is:</p> + <blockquote
class="span7 warn">templates/layerindex/recipedetail.html +6
-0+ <p>{{ recipe.blacklisted }}</p> + </blockquote> + </div> + </div> + {% endif %} + <table class="table table-striped table-bordered"> <tbody> <tr>(quoted diff) +0
-0b/templates/layerindex/recipes.html index 322d7c6..c2141a4 100644
templates/layerindex/recipes.html +0
-0@@ -52,7 +52,7 @@ <tbody> {% for recipe in recipe_list %} <tr {% if recipe.preferred_count > 0%}class="muted"{% endif %}> - <td><a
href="{% url recipe recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}</td> +<td><a href="{% url recipe recipe.id %}">{{recipe.name }}</a>{% if 'image' in recipe.inherits.split %}<i class="icon-hdd"></i>{% endif %}{% if recipe.blacklisted %}<span class="label label-inverse" title="{{ recipe.blacklisted }}">blacklisted</span>{% endif %}</td> <td>{{ recipe.pv }}</td>
<td>{{ recipe.short_desc }}</td> <td><a href="{% urllayer_itemurl_branch
recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a></td> @@ -84,6 +84,7 @@
Quoted 7 lines
firstfield.focus() $('.icon-hdd').tooltip({title:"Inherits image"}); + $('.label-inverse').tooltip(); });</script>
{% endblock %}
This looks great, thanks.
Another thing that just occurred to me though - apologies for not raising it earlier - for the benefit of newer users it may be useful to explain implications of the blacklisting. What I'd suggest is we put a line after the reason on the recipe detail page saying "This means that the recipe will not be buildable until the PNBLACKLIST value is cleared and the issue that caused it to be added has been fixed or worked around." (Just on the recipe detail page - not in the popup.)
Does that sound OK?
Cheers,
Paul
Signature · 2 lines
Paul Eggleton Intel Open Source Technology Centre
strange QA issue - how to ignore automatic so dependency
I'm trying to include binary JDK into my linux image.
just unpacking jdk-...tar.gz into recipe image and packing it into RPM (I'm using RPM as base of my distribution).
after adding
INSANE_SKIP_${PN} = "file-rdeps ldflags dev-so build-deps" into recipe I've got no errors or warning while building recipe itself, RPM is created and it contains some dynamic libraries dependencies....
but I've got error building rootfs with this recipe:
....(skipped)...
Updating cache... ######################################## [100%]
Computing transaction...error: Can't install tps-jdk-7u60+linux+arm+vfp+hflt-r0@cortexa8hf_vfp_neon: no package provides libXrender.so.1
I can't include libXrender.so.1 into my image, I can't remove libraries from JDK.
Is there any way to ignore this dependency?
something like RPM_LDD_IGNORE_CHECK="libX*"
Re: strange QA issue - how to ignore automatic so dependency
Quoted 14 lines · Dvorkin Dmitry
I'm trying to include binary JDK into my linux image.
just unpacking jdk-...tar.gz into recipe image and packing it into RPM (I'm using RPM as base of my distribution).after adding
INSANE_SKIP_${PN} = "file-rdeps ldflags dev-so build-deps" into recipe I've got no errors or warning while building recipe itself, RPM is created and it contains some dynamic libraries dependencies....but I've got error building rootfs with this recipe:
Quoted 8 lines
....(skipped)...
Updating cache... ######################################## [100%]Computing transaction...error: Can't install tps-jdk-7u60+linux+arm+vfp+hflt-r0@cortexa8hf_vfp_neon: no package provides libXrender.so.1
I can't include libXrender.so.1 into my image, I can't remove libraries from JDK.
Is there any way to ignore this dependency?
No, and if you ignored it then this binary won’t function as expected on the system. So you should find out providers of missing rdeps and add them to your image via depends
Quoted 8 lines
something like RPM_LDD_IGNORE_CHECK="libX*"
--
_______________________________________________
yocto mailing list
[email protected]
https://lists.yoctoproject.org/listinfo/yocto
Re: strange QA issue - how to ignore automatic so dependency
I know. But
it really does not require to have libX* in the system to successfully run JDK+our software We're using simple tar xvzf jdk-...tar.gz in all of our embedded systems, so I know what I'm talking about, sorry. This feature blocks my efforts to have a well-designed system with Poky/Yocto... :(
Quoted 31 lines · Khem Raj
Quoted 13 lines · Dvorkin Dmitry
I'm trying to include binary JDK into my linux image.
just unpacking jdk-...tar.gz into recipe image and packing it into RPM (I'm using RPM as base of my distribution).after adding
INSANE_SKIP_${PN} = "file-rdeps ldflags dev-so build-deps" into recipe I've got no errors or warning while building recipe itself, RPM is created and it contains some dynamic libraries dependencies....but I've got error building rootfs with this recipe:
Quoted 8 lines
....(skipped)...
Updating cache... ######################################## [100%]Computing transaction...error: Can't install tps-jdk-7u60+linux+arm+vfp+hflt-r0@cortexa8hf_vfp_neon: no package provides libXrender.so.1
I can't include libXrender.so.1 into my image, I can't remove libraries from JDK.
Is there any way to ignore this dependency?
No, and if you ignored it then this binary won’t function as expected on the system. So you should find out providers of missing rdeps and add them to your image via depends
Quoted 7 lines
something like RPM_LDD_IGNORE_CHECK="libX*"
--
_______________________________________________
yocto mailing list
[email protected]
https://lists.yoctoproject.org/listinfo/yocto
Re: strange QA issue - how to ignore automatic so dependency
Quoted 6 lines · Dvorkin Dmitry
I know. But
it really does not require to have libX* in the system to successfully run JDK+our software We're using simple tar xvzf jdk-...tar.gz in all of our embedded systems, so I know what I'm talking about, sorry.
you are walking muddy water, I will caution you before I hand a chainsaw to you as I suggest something as below. you can use patchelf or something like that on these binaries and remove the dependencies after unpacking them run the .so in question via patchelf --remove-needed <deplib-to-remove>
and that will make shlibs code in OE not flag them
Quoted 1 line
This feature blocks my efforts to have a well-designed system with Poky/Yocto... :(
Well designed would mean to adhere to prerequisites as needed by prebuilt software you are using
Quoted 35 lines · Khem Raj
Quoted 31 lines
Quoted 13 lines · Dvorkin Dmitry
I'm trying to include binary JDK into my linux image.
just unpacking jdk-...tar.gz into recipe image and packing it into RPM (I'm using RPM as base of my distribution).after adding
INSANE_SKIP_${PN} = "file-rdeps ldflags dev-so build-deps" into recipe I've got no errors or warning while building recipe itself, RPM is created and it contains some dynamic libraries dependencies....but I've got error building rootfs with this recipe:
Quoted 8 lines
....(skipped)...
Updating cache... ######################################## [100%]Computing transaction...error: Can't install tps-jdk-7u60+linux+arm+vfp+hflt-r0@cortexa8hf_vfp_neon: no package provides libXrender.so.1
I can't include libXrender.so.1 into my image, I can't remove libraries from JDK.
Is there any way to ignore this dependency?
No, and if you ignored it then this binary won’t function as expected on the system. So you should find out providers of missing rdeps and add them to your image via depends
Quoted 7 lines
something like RPM_LDD_IGNORE_CHECK="libX*"
--
_______________________________________________
yocto mailing list
[email protected]
https://lists.yoctoproject.org/listinfo/yocto
Re: strange QA issue - how to ignore automatic so dependency
Quoted 6 lines · Khem Raj
Quoted 5 lines · Dvorkin Dmitry
I know. But
it really does not require to have libX* in the system to successfully run JDK+our software We're using simple tar xvzf jdk-...tar.gz in all of our embedded systems, so I know what I'm talking about, sorry.you are walking muddy water, I will caution you before I hand a chainsaw to you as I suggest something as below.
I see. Thank you!
Quoted 40 lines
you can use patchelf or something like that on these binaries and remove the dependencies after unpacking them run the .so in question via patchelf --remove-needed <deplib-to-remove>
and that will make shlibs code in OE not flag themQuoted 1 line
This feature blocks my efforts to have a well-designed system with Poky/Yocto... :(
Well designed would mean to adhere to prerequisites as needed by prebuilt software you are using
Quoted 33 lines · Khem Raj
Quoted 31 lines
Quoted 13 lines · Dvorkin Dmitry
I'm trying to include binary JDK into my linux image.
just unpacking jdk-...tar.gz into recipe image and packing it into RPM (I'm using RPM as base of my distribution).after adding
INSANE_SKIP_${PN} = "file-rdeps ldflags dev-so build-deps" into recipe I've got no errors or warning while building recipe itself, RPM is created and it contains some dynamic libraries dependencies....but I've got error building rootfs with this recipe:
Quoted 8 lines
....(skipped)...
Updating cache... ######################################## [100%]Computing transaction...error: Can't install tps-jdk-7u60+linux+arm+vfp+hflt-r0@cortexa8hf_vfp_neon: no package provides libXrender.so.1
I can't include libXrender.so.1 into my image, I can't remove libraries from JDK.
Is there any way to ignore this dependency?
No, and if you ignored it then this binary won’t function as expected on the system. So you should find out providers of missing rdeps and add them to your image via depends
Quoted 7 lines
something like RPM_LDD_IGNORE_CHECK="libX*"
--
_______________________________________________
yocto mailing list
[email protected]
https://lists.yoctoproject.org/listinfo/yocto
Quoted 39 lines · Paul Eggleton
Hi Alex,
Quoted 24 lines · On Mon, 30 Nov 2015 16:03:05 Alex Franco wrote:
Display blacklisted information for recipes on Layerindex, in the recipe details, as well as the recipe search page, and layer page tables. This information is pulled from the PNBLACKLIST variable. Includes a hover text containing the reason for blacklist labels.
Changes to Django and Layerindex files:
-models.py,update.py
- migration file
- templates and static content (stylesheet)[YOCTO #7855]
Signed-off-by Alex Franco <[email protected]>--- .../0010_auto__add_field_recipe_blacklisted.py | 197 +++++++++++++++++++++ layerindex/models.py | 1 + layerindex/static/css/additional.css | 19 +- layerindex/update.py | 1 + templates/layerindex/detail.html | 3 +- templates/layerindex/recipedetail.html | 13 +- templates/layerindex/recipes.html | 3 +- 7 files changed, 232 insertions(+), 5 deletions(-) create mode 100644Quoted 2 lines
layerindex/migrations/0010_auto__add_field_recipe_blacklisted.pyThis looks great, thanks.
Another thing that just occurred to me though - apologies for not raising it earlier - for the benefit of newer users it may be useful to explain implications of the blacklisting. What I'd suggest is we put a line after the reason on the recipe detail page saying "This means that the recipe will not be buildable until the PNBLACKLIST value is cleared and the issue that caused it to be added has been fixed or worked around." (Just on the recipe detail page - not in the popup.)
Quoted 1 line
Does that sound OK?
Maybe some more information how to clear PNBLACKLIST (people often don't know that they can just set it to empty value in their bbappend or even distro/local config).
Signature · 1 line
Martin 'JaMa' Jansa jabber: [email protected]
Quoted 14 lines · On 01/12/2015 09:40, "[email protected] on behalf of Martin…
Quoted 5 lines
Another thing that just occurred to me though - apologies for not raising it
earlier - for the benefit of newer users it may be useful to explain implications of the blacklisting. What I'd suggest is we put a line after theQuoted 8 lines
reason on the recipe detail page saying "This means that the recipe will not
be buildable until the PNBLACKLIST value is cleared and the issue that caused
it to be added has been fixed or worked around." (Just on the recipe detail
page - not in the popup.)
Does that sound OK?
Quoted 3 lines
Maybe some more information how to clear PNBLACKLIST (people often don't know that they can just set it to empty value in their bbappend or even distro/local config).
I think explaining what blacklisting means, its implications and how to clear it is an excellent idea, but it seems there is quite a lot to say, and the layer index itself might not be the best place to show it all. So what about adding all this to the documentation, then link to it from the layer index? The recipe details page would then look like the attached image.
Alex, sorry for nitpicking: using the .label-inverse class means that the label in the h1 of the recipe details page also hovers. Only labels with a tooltip should hover, so maybe we should go back to the extra class, or just qualify the hover styles so that they only apply to .label-inverse inside tables (td > .label-inverse:hover). Apologies: I should have picked this up before you submitted the patch.
Cheers
Belén
Quoted 3 lines
Signature · 2 lines
-- Martin 'JaMa' Jansa jabber: [email protected]
Quoted 24 lines · Belen
Quoted 14 lines · On 01/12/2015 09:40, "[email protected] on behalf of Martin…
Quoted 5 lines
Another thing that just occurred to me though - apologies for not raising it
earlier - for the benefit of newer users it may be useful to explain implications of the blacklisting. What I'd suggest is we put a line after theQuoted 8 lines
reason on the recipe detail page saying "This means that the recipe will not
be buildable until the PNBLACKLIST value is cleared and the issue that caused
it to be added has been fixed or worked around." (Just on the recipe detail
page - not in the popup.)
Does that sound OK?Quoted 3 lines
Maybe some more information how to clear PNBLACKLIST (people often don't know that they can just set it to empty value in their bbappend or even distro/local config).
Quoted 6 lines
I think explaining what blacklisting means, its implications and how to clear it is an excellent idea, but it seems there is quite a lot to say, and the layer index itself might not be the best place to show it all. So what about adding all this to the documentation, then link to it from the layer index? The recipe details page would then look like the attached image.
Agreed, LGTM.
Quoted 16 lines
Alex, sorry for nitpicking: using the .label-inverse class means that the label in the h1 of the recipe details page also hovers. Only labels with a tooltip should hover, so maybe we should go back to the extra class, or just qualify the hover styles so that they only apply to .label-inverse inside tables (td > .label-inverse:hover). Apologies: I should have picked this up before you submitted the patch.
Cheers
Belén
Quoted 3 lines
Signature · 2 lines
-- Martin 'JaMa' Jansa jabber: [email protected]
Signature · 1 line
Martin 'JaMa' Jansa jabber: [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
@Martin, I think this information about blacklisting would indeed be very useful, thanks for your input as always.
@Belen, yes indeed I noticed the label also hovers even when no tooltip is present, this bugged me a little too to be honest! No worries though, I can fix the hover situation and also add in the link to the documentation.
@All: I suppose the link should go to:
http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-
PNBLACKLIST
- - Alex Franco
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
iQEcBAEBAgAGBQJWXeZFAAoJEPR9uwMY2lTL65EH/171Bk40iVaF7Jgg/gdYDOSG 1HS8eYw55ldjEDh8YAGKKdboHyPD8pY65P8lAovY9lzFDP9rx29QO8pKv2CoG48S 9MLjLxrAtRmXpqUWhp5LZ+GKjRNfSvUTnyergS/8uzh6uG0fsAnQ9li4XvHqonAi c/mMG44tWTYclA4YBVFRLaAR5aDCYbIGZOf7qL79XkdNF3WMOLHPzzeGcZQ8Ch89 /Ox4KxFMfS3jLcn7uMSTGddX5ehjsbA+WvF9sBfeKkjYVzUhMIGJ/r7uNWOeHBwJ aB4tVHBtGrGHVrstgeKIlpjyppv9qfHReOZG841Sf8XVY02kdX6jH4kwM1Wg11k= =WLLq
-----END PGP SIGNATURE-----
Quoted 10 lines · On Tue, 01 Dec 2015 12:26:18 Alex Franco wrote:
@Martin, I think this information about blacklisting would indeed be very useful, thanks for your input as always.
@Belen, yes indeed I noticed the label also hovers even when no tooltip is present, this bugged me a little too to be honest! No worries though, I can fix the hover situation and also add in the link to the documentation.
@All: I suppose the link should go to:http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-> PNBLACKLIST
Yes, that's really the only place we could link to; unfortunately though I just noticed there is an obvious mistake in there about inheriting the class globally within the recipe (a contradiction); it also doesn't mention the class is inherited globally by default.
Cheers,
Paul
Signature · 2 lines
Paul Eggleton Intel Open Source Technology Centre
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hmm I swear reading that, the message I get is that one should inherit the blacklist class in local.conf (if not on there already) and also set the (varflag) value of that variable for your recipe there.
Perhaps the part that reads "the blacklist class, which the recipe must inherit globally" suffers from a wording issue, saying "must inherit" rather than "by default inherits".
I guess next step here's creating a documentation bug report/ticket.
Meanwhile, the changes are ready and showcased here [1]
I'll let you review this before I sent v3 of the patch ;)
@Belen, I did something possibly hacky with the css in order to accomplish this, the warn blockquote is set to take 100% of the horizontal space available within the alert div. If that runs counter to some design philosophy (perhaps specifically since we're using bootstrap) let me know please :b
The hovering now only works within a TD...
Alex Franco
[1] http://yctb03.ostc.intel.com:9999/
Quoted 11 lines · Paul Eggleton
Quoted 10 lines · On Tue, 01 Dec 2015 12:26:18 Alex Franco wrote:
@Martin, I think this information about blacklisting would indeed be very useful, thanks for your input as always.
@Belen, yes indeed I noticed the label also hovers even when no tooltip is present, this bugged me a little too to be honest! No worries though, I can fix the hover situation and also add in the link to the documentation.
@All: I suppose the link should go to:
http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-> PNBLACKLIST
Quoted 2 lines
Yes, that's really the only place we could link to; unfortunately
though I
Quoted 1 line
just noticed there is an obvious mistake in there about inheriting the
class
Quoted 6 lines
globally within the recipe (a contradiction); it also doesn't mention the class is inherited globally by default.
Cheers,
Paul
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
iQEcBAEBAgAGBQJWXj+bAAoJEPR9uwMY2lTLYT4H/1CUZHoE9nSCRhB9zRmbe/gq fYxLRCHt34DZvTjA5N+KNJd80z9NOo1q6jWKu0Rh6XHQgExTuruzi1nkyJ4BIoRD ziexugIXyYFJIymT6m38sZfwBV+KA+FSoTKplj+ZjLdC3HzSpKoVmFHO/wx/coC+ s90uyagoFYtAb/cmaLJmZW+q9J9v/UtAop4CD7nuLVhJvVxYIe2/Cub2MGrZy5P/ EcciqfI8Cn/cWoGfptoRmBOA2yjAR1SqZtwWCOLze68eiRkV/P/3uMgMOy9i2feM l13puV0OVnoxsfTFDuZHzXt/5LHmCdI/URzPK3OAL83QlJtwKck1cLU6Ufywlhc= =LBgn
-----END PGP SIGNATURE-----
Quoted 18 lines · Alex Franco
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1Hmm I swear reading that, the message I get is that one should inherit the blacklist class in local.conf (if not on there already) and also set the (varflag) value of that variable for your recipe there.
Perhaps the part that reads "the blacklist class, which the recipe must inherit globally" suffers from a wording issue, saying "must inherit" rather than "by default inherits".
I guess next step here's creating a documentation bug report/ticket.
Meanwhile, the changes are ready and showcased here [1]
I'll let you review this before I sent v3 of the patch ;)
Quoted 7 lines
@Belen, I did something possibly hacky with the css in order to accomplish this, the warn blockquote is set to take 100% of the horizontal space available within the alert div. If that runs counter to some design philosophy (perhaps specifically since we're using bootstrap) let me know please :b
The hovering now only works within a TD...
This works for me :)
Thanks!
Belén
Quoted 46 lines
Alex Franco
[1] http://yctb03.ostc.intel.com:9999/
Quoted 4 lines · Paul Eggleton
Quoted 3 lines · On Tue, 01 Dec 2015 12:26:18 Alex Franco wrote:
@Martin, I think this information about blacklisting would indeed be very useful, thanks for your input as always.
Quoted 8 lines
Quoted 8 lines
@Belen, yes indeed I noticed the label also hovers even when no tooltip is present, this bugged me a little too to be honest! No worries though,
I can fix the hover situation and also add in the link to the documentation.
@All: I suppose the link should go to:http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var->
PNBLACKLISTQuoted 2 lines
Yes, that's really the only place we could link to; unfortunately
though I
Quoted 1 line
just noticed there is an obvious mistake in there about inheriting the
class
Quoted 7 lines
globally within the recipe (a contradiction); it also doesn't mention the
class is inherited globally by default.Cheers,
Paul-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2iQEcBAEBAgAGBQJWXj+bAAoJEPR9uwMY2lTLYT4H/1CUZHoE9nSCRhB9zRmbe/gq fYxLRCHt34DZvTjA5N+KNJd80z9NOo1q6jWKu0Rh6XHQgExTuruzi1nkyJ4BIoRD ziexugIXyYFJIymT6m38sZfwBV+KA+FSoTKplj+ZjLdC3HzSpKoVmFHO/wx/coC+ s90uyagoFYtAb/cmaLJmZW+q9J9v/UtAop4CD7nuLVhJvVxYIe2/Cub2MGrZy5P/ EcciqfI8Cn/cWoGfptoRmBOA2yjAR1SqZtwWCOLze68eiRkV/P/3uMgMOy9i2feM l13puV0OVnoxsfTFDuZHzXt/5LHmCdI/URzPK3OAL83QlJtwKck1cLU6Ufywlhc= =LBgn
-----END PGP SIGNATURE-----
Quoted 14 lines · Paul
Quoted 10 lines · On Tue, 01 Dec 2015 12:26:18 Alex Franco wrote:
@Martin, I think this information about blacklisting would indeed be very useful, thanks for your input as always.
@Belen, yes indeed I noticed the label also hovers even when no tooltip is present, this bugged me a little too to be honest! No worries though, I can fix the hover situation and also add in the link to the documentation.
@All: I suppose the link should go to:Quoted 2 lines
http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var->
PNBLACKLIST
Quoted 6 lines
Yes, that's really the only place we could link to; unfortunately though I
just noticed there is an obvious mistake in there about inheriting the class
globally within the recipe (a contradiction); it also doesn't mention the class is inherited globally by default.
Could we ask Scott to correct the mistake and the omission?
Belén
Quoted 7 lines
Cheers,
PaulSignature · 2 lines
Paul Eggleton Intel Open Source Technology Centre
Quoted 15 lines · Belen
Quoted 14 lines · Paul
Quoted 12 lines · On Tue, 01 Dec 2015 12:26:18 Alex Franco wrote:
@Martin, I think this information about blacklisting would indeed be very useful, thanks for your input as always.
@Belen, yes indeed I noticed the label also hovers even when no tooltip is present, this bugged me a little too to be honest! No worries though, I can fix the hover situation and also add in the link to the documentation.
@All: I suppose the link should go to:
http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var->PNBLACKLIST
Quoted 8 lines
Quoted 6 lines
Yes, that's really the only place we could link to; unfortunately though I
just noticed there is an obvious mistake in there about inheriting the class
globally within the recipe (a contradiction); it also doesn't mention the class is inherited globally by default.Could we ask Scott to correct the mistake and the omission?
It's on my documentation todo list; I will probably file a bug.
Cheers,
Paul
Signature · 2 lines
Paul Eggleton Intel Open Source Technology Centre