- 论坛徽章:
- 0
|
参考
这段代码用来计算cygwin下某个模块的安装包的依赖关系
- #! /usr/bin/gawk -f
- #
- # gawk -v PACKAGES_TO_INSTALL="gdb" \
- # -f \$get-cygwin-requries.awk setup.ini
- function make_key(package, suffix)
- {
- return package DS suffix;
- }
- function compare(requires1, requires2, a1,n1,a2,n2,i)
- {
- n1 = split(requires1, a1);
- n2 = split(requires2, a2);
- if( n1 == n2 ) {
- asort(a1);
- asort(a2);
- for(i=1; i<=n1; i++) {
- # printf("%s -- %s\n", a1[i], a2[i]) >STDERR;
- if(a1[i] != a2[i])
- return -1;
- }
- return 0;
- }
- return n1-n2;
- }
- function in_array(val, array, i)
- {
- for(i in array) {
- if( array[i] == val ) {
- # printf("IN\n") >STDERR;
- return 1;
- }
- }
- # printf("OUT\n") >STDERR;;
- return 0;
- }
- function join(requires1, requires2,
- a1,n1,a2,n2,i,r)
- {
- n1 = split(requires1, a1);
- n2 = split(requires2, a2);
- r = "";
-
- for(i=1; i<=n1; i++)
- r = r " " a1[i];
- for(i=1; i<=n2; i++) {
- if( !in_array(a2[i], a1) ) {
- r = r " " a2[i];
- }
- }
- return r;
- }
- function get_requires(all_packages, requires,
- max_requires, more_requires, req, i, n, key_requires, package)
- {
- max_requires = requires;
- # printf("Enter: Level: %d\n", level) >STDERR;
- # printf("requries: %s\n", requires) >STDERR;
- n = split(requires, req);
- for(i=1; i<=n; i++) {
- package = req[i];
- key_requires = make_key(package, "requires");
- # printf("key: %s\n", key_requires) >STDERR;
- more_requires = all_packages[key_requires];
- # printf("more_requries: %s\n", more_requires) >STDERR;
- max_requires = join(max_requires, more_requires);
- }
- # printf("requires: %s\n", requires) >STDERR;
- # printf("max_requires: %s\n", max_requires) >STDERR;
- if( compare(max_requires, requires) != 0 ) {
- more_requires = get_requires(all_packages, max_requires);
- max_requires = join(max_requires, more_requires);
- }
- # printf("Leave: Level: %d\n", level) >STDERR;
- return max_requires;
- }
- function resolve_packages(all_packages, packages,
- a, n, i, key, files)
- {
- files = "";
- n = split(packages, a);
- for(i=1; i<=n; i++) {
- key = make_key(a[i], "install");
- if( all_packages[key] != "" )
- files = files " " all_packages[key];
- }
- return files;
- }
- BEGIN {
- FS = "(:|[ \t]+)";
- # STDERR = "/dev/stderr";
- STDERR = "/dev/null";
- skip_prev = 1;
- DS = "#";
- }
- {
- delete words
- num_words = 0;
- for(i=1; i<=NF; i++) {
- if($i != "") {
- num_words++;
- words[num_words] = $i;
- # printf("%s--", $i) >STDERR;
- }
- }
- # printf("\n") >STDERR;
-
- switch(words[1]) {
- case "@":
- skip_prev = 0;
- cur_package = words[2];
- printf("@ %s\n", cur_package) >STDERR;
- break;
- case "requires":
- if(!skip_prev) {
- key = make_key(cur_package, "requires");
- requires = "";
- for(i=2; i<=num_words; i++)
- requires = requires " " words[i];
- all_packages[key] = requires;
- printf("requires: %s\n", requires) >STDERR;
- }
- break;
- case "install":
- if(!skip_prev) {
- key = make_key(cur_package, "install");
- all_packages[key] = words[2];
- printf("install: %s\n", words[2]) >STDERR;
- }
- break;
- case "[prev]":
- skip_prev = 1; break;
- }
- }
- END {
- pkg = get_requires(all_packages, PACKAGES_TO_INSTALL);
- printf("%s\n", pkg );
- printf("%s\n", resolve_packages(all_packages,pkg) );
- }
复制代码 |
|