Remove INTLLIBS from librazor_la_LIBADD.
This partially reverts 611c84a3f4b4538a65d186050608c17adbf17770.
It's not clear what motivated the initial inclusion of INTLLIBS
here since the net effect is only seen in librazor.la and not
in razor.pc and librazor.la is not normally packaged. Certainly
neither the static nor the dynamic versions of librazor currently
use libintl. At best this would cause the linker to search a
static libintl for undefined symbols without finding any; at worse
it causes a static build of plover using librazor.la to fail if
no static version of libintl is installed.
2 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
3 * Copyright (C) 2008 Red Hat, Inc
4 * Copyright (C) 2009 J. Ali Harlow <ali@juiblex.co.uk>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 #include "razor-internal.h"
29 * razor_importer_create:
31 * Create a new %razor_importer.
33 * Returns: the new %razor_importer.
35 RAZOR_EXPORT struct razor_importer *
36 razor_importer_create(void)
38 struct razor_importer *importer;
40 importer = zalloc(sizeof *importer);
41 importer->set = razor_set_create();
42 hashtable_init(&importer->table, &importer->set->string_pool);
43 hashtable_init(&importer->details_table,
44 &importer->set->details_string_pool);
45 hashtable_init(&importer->file_table,
46 &importer->set->file_string_pool);
52 * razor_importer_destroy:
53 * @importer: the %razor_importer
55 * Destroy an importer without creating a %razor_set. Normally,
56 * %razor_importer_finish will create a new %razor_set and destroy the
57 * importer. If the import must be aborted without creating the set,
58 * just destroy the import using this function.
61 razor_importer_destroy(struct razor_importer *importer)
63 /* FIXME: write this */
68 * razor_importer_begin_package:
69 * @importer: the %razor_importer
70 * @name: the name of the new package
71 * @version: the version of the new package
72 * @arch: the architechture of the new package.
74 * Begin describing a new package to the importer. This creates a new
75 * package and sets the %name, %version and %arch. Subsequent calls
76 * to %razor_importer_add_details, %razor_importer_add_property and
77 * %razor_importer_add_file further describe this package and
78 * %razor_importer_finish_package marks the end of meta data for this
82 razor_importer_begin_package(struct razor_importer *importer,
88 struct razor_package *p;
90 p = array_add(&importer->set->packages, sizeof *p);
91 p->name = hashtable_tokenize(&importer->table, name);
93 p->version = hashtable_tokenize(&importer->table, version);
94 p->arch = hashtable_tokenize(&importer->table, arch);
96 importer->package = p;
97 array_init(&importer->properties);
98 array_init(&importer->install_prefixes);
100 empty = hashtable_tokenize(&importer->details_table, "");
101 importer->package->preun.program = empty;
102 importer->package->preun.body = empty;
103 importer->package->postun.program = empty;
104 importer->package->postun.body = empty;
108 * razor_importer_finish_package:
109 * @importer: the %razor_importer
111 * Tells the importer that the current package is complete.
114 razor_importer_finish_package(struct razor_importer *importer)
116 list_set_array(&importer->package->properties,
117 &importer->set->property_pool,
118 &importer->properties,
121 list_set_array(&importer->package->install_prefixes,
122 &importer->set->prefix_pool,
123 &importer->install_prefixes,
126 array_release(&importer->properties);
127 array_release(&importer->install_prefixes);
131 * razor_importer_add_details:
132 * @importer: the %razor_importer
133 * @summary: the package summary
134 * @description: the package description
135 * @url: the package url
136 * @license: the package license
138 * Provide additional information for the current package.
141 razor_importer_add_details(struct razor_importer *importer,
143 const char *description,
147 importer->package->summary = hashtable_tokenize(&importer->details_table, summary);
148 importer->package->description = hashtable_tokenize(&importer->details_table, description);
149 importer->package->url = hashtable_tokenize(&importer->details_table, url);
150 importer->package->license = hashtable_tokenize(&importer->details_table, license);
154 * razor_importer_add_script:
155 * @importer: the %razor_importer
156 * @script: either %RAZOR_PROPERTY_PREUN or %RAZOR_PROPERTY_POSTUN
157 * @program: the program to run the script
158 * @body: the body of the script
160 * Provide a script to use when uninstalling the current package.
163 razor_importer_add_script(struct razor_importer *importer,
164 enum razor_property_flags script,
169 case RAZOR_PROPERTY_PREUN:
170 importer->package->preun.program =
171 hashtable_tokenize(&importer->table, program);
172 importer->package->preun.body =
173 hashtable_tokenize(&importer->table, body);
175 case RAZOR_PROPERTY_POSTUN:
176 importer->package->postun.program =
177 hashtable_tokenize(&importer->table, program);
178 importer->package->postun.body =
179 hashtable_tokenize(&importer->table, body);
187 * razor_importer_add_install_prefixes:
188 * @importer: the %razor_importer
189 * @install_prefix: the relocated prefix
191 * Adds a relocated prefix for the current package.
194 razor_importer_add_install_prefix(struct razor_importer *importer,
195 const char *install_prefix)
199 r = array_add(&importer->install_prefixes, sizeof *r);
200 *r = hashtable_tokenize(&importer->table, install_prefix);
204 * razor_importer_add_property:
205 * @importer: the %razor_importer
206 * @name: name of the property
207 * @flags: property flags
208 * @version: version of the property or %NULL
210 * Add a property for the current package. The %flags parameter
211 * determines the type of the property and optionally the relation to
212 * the specified version and the availability constraint. See
213 * %razor_property_flags for further information about the flag
217 razor_importer_add_property(struct razor_importer *importer,
222 struct razor_property *p;
225 p = array_add(&importer->set->properties, sizeof *p);
226 p->name = hashtable_tokenize(&importer->table, name);
228 p->version = hashtable_tokenize(&importer->table, version);
229 list_set_ptr(&p->packages, importer->package -
230 (struct razor_package *) importer->set->packages.data);
232 r = array_add(&importer->properties, sizeof *r);
233 *r = p - (struct razor_property *) importer->set->properties.data;
235 if (((flags & RAZOR_PROPERTY_TYPE_MASK) == RAZOR_PROPERTY_REQUIRES) &&
237 r = array_add(&importer->file_requires, sizeof *r);
243 * razor_importer_add_file:
244 * @importer: the %razor_importer
245 * @name: name of the file
247 * Add a file to the current package.
250 razor_importer_add_file(struct razor_importer *importer, const char *name)
252 struct import_entry *e;
254 e = array_add(&importer->files, sizeof *e);
256 e->package = importer->package -
257 (struct razor_package *) importer->set->packages.data;
258 e->name = strdup(name);
262 compare_packages(const void *p1, const void *p2, void *data)
264 const struct razor_package *pkg1 = p1, *pkg2 = p2;
265 struct razor_set *set = data;
266 char *pool = set->string_pool.data;
268 /* FIXME: what if the flags are different? */
269 if (pkg1->name == pkg2->name)
270 return razor_versioncmp(&pool[pkg1->version], &pool[pkg2->version]);
272 return strcmp(&pool[pkg1->name], &pool[pkg2->name]);
276 compare_properties(const void *p1, const void *p2, void *data)
278 const struct razor_property *prop1 = p1, *prop2 = p2;
279 struct razor_set *set = data;
280 char *pool = set->string_pool.data;
282 if (prop1->name != prop2->name)
283 return strcmp(&pool[prop1->name], &pool[prop2->name]);
284 else if (prop1->flags != prop2->flags)
285 return prop1->flags - prop2->flags;
286 else if (prop1->version != prop2->version)
287 return razor_versioncmp(&pool[prop1->version], &pool[prop2->version]);
289 return prop1->packages.list_ptr - prop2->packages.list_ptr;
293 uniqueify_properties(struct razor_set *set)
295 struct razor_property *rp, *up, *rp_end;
296 struct array *pkgs, *p;
298 uint32_t *map, *rmap;
299 int i, count, unique;
301 count = set->properties.size / sizeof(struct razor_property);
302 map = razor_qsort_with_data(set->properties.data,
304 sizeof(struct razor_property),
308 rp_end = set->properties.data + set->properties.size;
309 rmap = malloc(count * sizeof *map);
310 pkgs = zalloc(count * sizeof *pkgs);
311 for (rp = set->properties.data, up = rp, i = 0; rp < rp_end; rp++, i++) {
312 if (rp->name != up->name ||
313 rp->flags != up->flags ||
314 rp->version != up->version) {
317 up->flags = rp->flags;
318 up->version = rp->version;
321 unique = up - (struct razor_property *) set->properties.data;
322 rmap[map[i]] = unique;
323 r = array_add(&pkgs[unique], sizeof *r);
330 set->properties.size = (void *) up - set->properties.data;
332 for (rp = set->properties.data, p = pkgs; rp < rp_end; rp++, p++) {
333 list_set_array(&rp->packages, &set->package_pool, p, 0);
343 compare_filenames(const void *p1, const void *p2, void *data)
345 const struct import_entry *e1 = p1;
346 const struct import_entry *e2 = p2;
347 const char *n1 = e1->name;
348 const char *n2 = e2->name;
350 /* Need to make sure that the contents of a directory
351 * are sorted immediately after it. So "foo/bar" has to
352 * sort before "foo.conf"
354 * FIXME: this is about 60% slower than strcmp
358 return *n2 == '/' ? 1 : -1;
360 return *n1 == '/' ? -1 : 1;
373 count_entries(struct import_directory *d)
375 struct import_directory *p, *end;
378 end = d->files.data + d->files.size;
382 d->count += p->count + 1;
388 serialize_files(struct razor_set *set,
389 struct import_directory *d, struct array *array)
391 struct import_directory *p, *end;
392 struct razor_entry *e = NULL;
396 end = d->files.data + d->files.size;
397 s = array->size / sizeof *e + d->files.size / sizeof *p;
399 e = array_add(array, sizeof *e);
402 e->start = p->count > 0 ? s : 0;
405 list_set_array(&e->packages, &set->package_pool, &p->packages, 0);
406 array_release(&p->packages);
410 e->flags |= RAZOR_ENTRY_LAST;
413 end = d->files.data + d->files.size;
415 serialize_files(set, p, array);
421 remap_property_package_links(struct array *properties, uint32_t *rmap)
423 struct razor_property *p, *end;
425 end = properties->data + properties->size;
426 for (p = properties->data; p < end; p++)
427 list_remap_head(&p->packages, rmap);
431 build_file_tree(struct razor_importer *importer)
433 int count, i, length;
434 struct import_entry *filenames;
436 uint32_t name, *r, s;
437 char rootname[256], dirname[256];
438 struct import_directory *d, *last_root;
440 struct razor_entry *e;
442 count = importer->files.size / sizeof (struct import_entry);
443 filenames = importer->files.data;
444 razor_qsort_with_data(filenames,
446 sizeof (struct import_entry),
453 for (i = 0; i < count; i++) {
454 f = filenames[i].name;
457 end = strchr(f, '/');
461 memcpy(dirname, f, length);
462 dirname[length] = '\0';
463 name = hashtable_tokenize(&importer->file_table,
466 if (!last_root || last_root->name != name) {
467 d = array_add(&roots, sizeof *d);
470 array_init(&d->files);
471 array_init(&d->packages);
476 if (!d->last || d->last->name != name) {
477 d->last = array_add(&d->files,
479 d->last->name = name;
480 d->last->last = NULL;
481 array_init(&d->last->files);
482 array_init(&d->last->packages);
491 r = array_add(&d->packages, sizeof *r);
492 *r = filenames[i].package;
493 free(filenames[i].name);
496 count = roots.size / sizeof (struct import_directory);
499 for (i = 0; i < count; i++) {
502 e = array_add(&importer->set->files, sizeof *e);
504 e = importer->set->files.data;
507 e->start = d->count > 0 ? s : 0;
509 list_set_empty(&e->packages);
513 e->flags |= RAZOR_ENTRY_LAST;
516 for (i = 0; i < count; i++) {
517 serialize_files(importer->set, d, &importer->set->files);
521 array_release(&importer->files);
522 array_release(&roots);
526 list_to_array(struct list *list, struct array *array)
531 item = array_add(array, sizeof *item);
533 list = list_next(list);
538 compare_file_requires(const void *p1, const void *p2, void *data)
540 uint32_t *f1 = (void *)p1, *f2 = (void *)p2;
541 const char *pool = data;
543 return strcmp(&pool[*f1], &pool[*f2]);
547 find_file_provides(struct razor_importer *importer)
549 struct razor_property *prop;
550 struct razor_entry *top, *entry;
551 struct razor_package *packages;
552 struct array pkgprops;
554 uint32_t *req, *req_start, *req_end;
555 uint32_t *map, *newprop;
558 pool = importer->set->string_pool.data;
559 packages = importer->set->packages.data;
560 top = importer->set->files.data;
562 req = req_start = importer->file_requires.data;
563 req_end = importer->file_requires.data + importer->file_requires.size;
564 map = razor_qsort_with_data(req, req_end - req, sizeof *req,
565 compare_file_requires, pool);
568 for (req = req_start; req < req_end; req++) {
569 if (req > req_start && req[0] == req[-1])
571 entry = razor_set_find_entry(importer->set, top, &pool[*req]);
575 for (pkg = list_first(&entry->packages, &importer->set->package_pool); pkg; pkg = list_next(pkg)) {
576 prop = array_add(&importer->set->properties, sizeof *prop);
579 RAZOR_PROPERTY_PROVIDES | RAZOR_PROPERTY_EQUAL;
580 prop->version = hashtable_tokenize(&importer->table, "");
581 list_set_ptr(&prop->packages, pkg->data);
583 /* Update property list of pkg */
584 array_init(&pkgprops);
585 list_to_array(list_first(&packages[pkg->data].properties, &importer->set->property_pool), &pkgprops);
586 newprop = array_add(&pkgprops, sizeof *newprop);
587 *newprop = prop - (struct razor_property *)importer->set->properties.data;
588 list_set_array(&packages[pkg->data].properties, &importer->set->property_pool, &pkgprops, 1);
589 array_release(&pkgprops);
593 array_release(&importer->file_requires);
597 build_package_file_lists(struct razor_set *set, uint32_t *rmap)
599 struct razor_package *p, *packages;
601 struct razor_entry *e, *end;
606 count = set->packages.size / sizeof *p;
607 pkgs = zalloc(count * sizeof *pkgs);
609 end = set->files.data + set->files.size;
610 for (e = set->files.data; e < end; e++) {
611 list_remap_head(&e->packages, rmap);
612 r = list_first(&e->packages, &set->package_pool);
614 q = array_add(&pkgs[r->data], sizeof *q);
615 *q = e - (struct razor_entry *) set->files.data;
620 packages = set->packages.data;
621 for (i = 0; i < count; i++) {
622 list_set_array(&packages[i].files, &set->file_pool, &pkgs[i], 0);
623 array_release(&pkgs[i]);
629 * razor_importer_finish:
630 * @importer: the %razor_importer
632 * Finish importing packages and create the package set. This sorts
633 * and indexes all the packages, properties and files in the importer
634 * and creates a new %razor_set. After creating the new package set,
635 * the importer is destroyed.
637 * Returns: the new %razor_set
639 RAZOR_EXPORT struct razor_set *
640 razor_importer_finish(struct razor_importer *importer)
642 struct razor_set *set;
643 uint32_t *map, *rmap;
646 build_file_tree(importer);
647 find_file_provides(importer);
649 map = uniqueify_properties(importer->set);
650 list_remap_pool(&importer->set->property_pool, map);
653 count = importer->set->packages.size / sizeof(struct razor_package);
654 map = razor_qsort_with_data(importer->set->packages.data,
656 sizeof(struct razor_package),
660 rmap = malloc(count * sizeof *rmap);
661 for (i = 0; i < count; i++)
665 list_remap_pool(&importer->set->package_pool, rmap);
666 build_package_file_lists(importer->set, rmap);
667 remap_property_package_links(&importer->set->properties, rmap);
671 hashtable_release(&importer->table);
672 hashtable_release(&importer->details_table);
673 hashtable_release(&importer->file_table);