diff options
| author | Bruce Ashfield <bruce.ashfield@gmail.com> | 2026-04-28 18:49:19 +0000 |
|---|---|---|
| committer | Bruce Ashfield <bruce.ashfield@gmail.com> | 2026-04-28 18:49:19 +0000 |
| commit | cd15723c5d62bbfa4c07c36eb7ab7bd962bd4936 (patch) | |
| tree | 0dea471977d0b5c14e1523f2a1a206d9d3fd6137 | |
| parent | a66c8df6fdc9025d0cbfae76252e12fc530a4824 (diff) | |
| download | meta-virtualization-cd15723c5d62bbfa4c07c36eb7ab7bd962bd4936.tar.gz | |
oe-go-mod-fetcher: add license scanning for Go module dependencies
Add --scan-licenses to oe-go-mod-fetcher.py which scans Go module zips
for license files and generates go-mod-licenses.inc with LICENSE and
LIC_FILES_CHKSUM entries matching OE-core's go-mod-update-modules format.
License detection uses OE-core's glob patterns and MD5 + crunched MD5
matching against known SPDX licenses. The hash database resolves from:
1. --common-license-dir (explicit path)
2. Auto-detected poky tree common-licenses
3. Bundled scripts/data/license-hashes.csv (offline fallback)
New files:
- scripts/generate-license-hashes.py: regenerate bundled CSV
- scripts/data/license-hashes.csv: pre-computed hash DB (704 entries)
bbclass changes:
- go-mod-discovery: pass --scan-licenses during do_generate_modules
- GO_MOD_DISCOVERY_SKIP_LICENSES variable to bypass scanning
- do_update_license_hashes task to refresh bundled CSV
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
| -rw-r--r-- | classes/go-mod-discovery.bbclass | 88 | ||||
| -rw-r--r-- | scripts/data/license-hashes.csv | 706 | ||||
| -rwxr-xr-x | scripts/generate-license-hashes.py | 119 | ||||
| -rwxr-xr-x | scripts/oe-go-mod-fetcher.py | 395 |
4 files changed, 1304 insertions, 4 deletions
diff --git a/classes/go-mod-discovery.bbclass b/classes/go-mod-discovery.bbclass index 39cc38da..9609ee35 100644 --- a/classes/go-mod-discovery.bbclass +++ b/classes/go-mod-discovery.bbclass | |||
| @@ -32,6 +32,10 @@ | |||
| 32 | # bitbake <recipe> -c clean_discovery | 32 | # bitbake <recipe> -c clean_discovery |
| 33 | # Remove the persistent discovery cache | 33 | # Remove the persistent discovery cache |
| 34 | # | 34 | # |
| 35 | # bitbake <recipe> -c update_license_hashes | ||
| 36 | # Regenerate the bundled license-hashes.csv from COMMON_LICENSE_DIR | ||
| 37 | # Run after OE-core upgrades to keep standalone CSV current | ||
| 38 | # | ||
| 35 | # CONFIGURATION: | 39 | # CONFIGURATION: |
| 36 | # | 40 | # |
| 37 | # Required (must be set by recipe): | 41 | # Required (must be set by recipe): |
| @@ -74,6 +78,9 @@ | |||
| 74 | # GO_MOD_DISCOVERY_RECIPEDIR - Output directory for generated .inc files | 78 | # GO_MOD_DISCOVERY_RECIPEDIR - Output directory for generated .inc files |
| 75 | # Default: "${FILE_DIRNAME}" (recipe's directory) | 79 | # Default: "${FILE_DIRNAME}" (recipe's directory) |
| 76 | # | 80 | # |
| 81 | # GO_MOD_DISCOVERY_SKIP_LICENSES - Set to "1" to skip license scanning | ||
| 82 | # Default: "" (scan enabled) | ||
| 83 | # | ||
| 77 | # WORKFLOW EXAMPLES: | 84 | # WORKFLOW EXAMPLES: |
| 78 | # | 85 | # |
| 79 | # Full automatic (one command does everything): | 86 | # Full automatic (one command does everything): |
| @@ -122,6 +129,11 @@ GO_MOD_DISCOVERY_RECIPEDIR ?= "${FILE_DIRNAME}" | |||
| 122 | # Usage: GO_MOD_DISCOVERY_SKIP_VERIFY = "1" in local.conf or recipe | 129 | # Usage: GO_MOD_DISCOVERY_SKIP_VERIFY = "1" in local.conf or recipe |
| 123 | GO_MOD_DISCOVERY_SKIP_VERIFY ?= "" | 130 | GO_MOD_DISCOVERY_SKIP_VERIFY ?= "" |
| 124 | 131 | ||
| 132 | # Skip license scanning during generation | ||
| 133 | # Set to "1" to bypass license scanning (default: scan licenses) | ||
| 134 | # Usage: GO_MOD_DISCOVERY_SKIP_LICENSES = "1" in local.conf or recipe | ||
| 135 | GO_MOD_DISCOVERY_SKIP_LICENSES ?= "" | ||
| 136 | |||
| 125 | # Modules to exclude from git:// generation (space-separated prefixes) | 137 | # Modules to exclude from git:// generation (space-separated prefixes) |
| 126 | # Excluded modules must be fetched via gomod:// in the recipe's SRC_URI | 138 | # Excluded modules must be fetched via gomod:// in the recipe's SRC_URI |
| 127 | # Usage: GO_MOD_VCS_EXCLUDE = "github.com/vtolstov/go-ioctl" | 139 | # Usage: GO_MOD_VCS_EXCLUDE = "github.com/vtolstov/go-ioctl" |
| @@ -406,13 +418,19 @@ Or run 'bitbake ${PN} -c show_upgrade_commands' to see manual options." | |||
| 406 | EXCLUDE_FLAGS="${EXCLUDE_FLAGS} --exclude-module ${mod}" | 418 | EXCLUDE_FLAGS="${EXCLUDE_FLAGS} --exclude-module ${mod}" |
| 407 | done | 419 | done |
| 408 | 420 | ||
| 421 | LICENSE_FLAGS="" | ||
| 422 | if [ "${GO_MOD_DISCOVERY_SKIP_LICENSES}" != "1" ]; then | ||
| 423 | LICENSE_FLAGS="--scan-licenses --common-license-dir ${COMMON_LICENSE_DIR} --discovery-cache ${GO_MOD_DISCOVERY_DIR}/cache" | ||
| 424 | fi | ||
| 425 | |||
| 409 | python3 "${FETCHER_SCRIPT}" \ | 426 | python3 "${FETCHER_SCRIPT}" \ |
| 410 | --discovered-modules "${GO_MOD_DISCOVERY_MODULES_JSON}" \ | 427 | --discovered-modules "${GO_MOD_DISCOVERY_MODULES_JSON}" \ |
| 411 | --git-repo "${GO_MOD_DISCOVERY_GIT_REPO}" \ | 428 | --git-repo "${GO_MOD_DISCOVERY_GIT_REPO}" \ |
| 412 | --git-ref "${GO_MOD_DISCOVERY_GIT_REF}" \ | 429 | --git-ref "${GO_MOD_DISCOVERY_GIT_REF}" \ |
| 413 | --recipedir "${GO_MOD_DISCOVERY_RECIPEDIR}" \ | 430 | --recipedir "${GO_MOD_DISCOVERY_RECIPEDIR}" \ |
| 414 | ${SKIP_VERIFY_FLAG} \ | 431 | ${SKIP_VERIFY_FLAG} \ |
| 415 | ${EXCLUDE_FLAGS} | 432 | ${EXCLUDE_FLAGS} \ |
| 433 | ${LICENSE_FLAGS} | ||
| 416 | 434 | ||
| 417 | if [ $? -eq 0 ]; then | 435 | if [ $? -eq 0 ]; then |
| 418 | echo "" | 436 | echo "" |
| @@ -422,6 +440,7 @@ Or run 'bitbake ${PN} -c show_upgrade_commands' to see manual options." | |||
| 422 | echo "Files generated in: ${GO_MOD_DISCOVERY_RECIPEDIR}" | 440 | echo "Files generated in: ${GO_MOD_DISCOVERY_RECIPEDIR}" |
| 423 | echo " - go-mod-git.inc" | 441 | echo " - go-mod-git.inc" |
| 424 | echo " - go-mod-cache.inc" | 442 | echo " - go-mod-cache.inc" |
| 443 | echo " - go-mod-licenses.inc (if license scanning enabled)" | ||
| 425 | echo "" | 444 | echo "" |
| 426 | echo "You can now build the recipe:" | 445 | echo "You can now build the recipe:" |
| 427 | echo " bitbake ${PN}" | 446 | echo " bitbake ${PN}" |
| @@ -434,7 +453,7 @@ Or run 'bitbake ${PN} -c show_upgrade_commands' to see manual options." | |||
| 434 | addtask generate_modules | 453 | addtask generate_modules |
| 435 | do_generate_modules[nostamp] = "1" | 454 | do_generate_modules[nostamp] = "1" |
| 436 | do_generate_modules[vardeps] += "GO_MOD_DISCOVERY_MODULES_JSON GO_MOD_DISCOVERY_GIT_REPO \ | 455 | do_generate_modules[vardeps] += "GO_MOD_DISCOVERY_MODULES_JSON GO_MOD_DISCOVERY_GIT_REPO \ |
| 437 | GO_MOD_DISCOVERY_GIT_REF GO_MOD_DISCOVERY_RECIPEDIR" | 456 | GO_MOD_DISCOVERY_GIT_REF GO_MOD_DISCOVERY_RECIPEDIR GO_MOD_DISCOVERY_SKIP_LICENSES" |
| 438 | do_generate_modules[postfuncs] = "do_show_hybrid_recommendation" | 457 | do_generate_modules[postfuncs] = "do_show_hybrid_recommendation" |
| 439 | 458 | ||
| 440 | # Show hybrid conversion recommendations after VCS generation | 459 | # Show hybrid conversion recommendations after VCS generation |
| @@ -627,12 +646,22 @@ python do_show_upgrade_commands() { | |||
| 627 | bb.plain(f" --git-ref {git_ref} \\") | 646 | bb.plain(f" --git-ref {git_ref} \\") |
| 628 | bb.plain(f" --recipedir {recipedir}") | 647 | bb.plain(f" --recipedir {recipedir}") |
| 629 | bb.plain("") | 648 | bb.plain("") |
| 649 | bb.plain("Add --scan-licenses to also generate go-mod-licenses.inc:") | ||
| 650 | bb.plain("") | ||
| 651 | bb.plain(f" {fetcher_script} \\") | ||
| 652 | bb.plain(f" --discovered-modules {modules_json} \\") | ||
| 653 | bb.plain(f" --git-repo {git_repo} \\") | ||
| 654 | bb.plain(f" --git-ref {git_ref} \\") | ||
| 655 | bb.plain(f" --recipedir {recipedir} \\") | ||
| 656 | bb.plain(f" --scan-licenses --discovery-cache {discovery_dir}/cache") | ||
| 657 | bb.plain("") | ||
| 630 | bb.plain("") | 658 | bb.plain("") |
| 631 | bb.plain("Generated files:") | 659 | bb.plain("Generated files:") |
| 632 | bb.plain("-" * 70) | 660 | bb.plain("-" * 70) |
| 633 | bb.plain("") | 661 | bb.plain("") |
| 634 | bb.plain(" go-mod-git.inc - SRC_URI entries for fetching module git repos") | 662 | bb.plain(" go-mod-git.inc - SRC_URI entries for fetching module git repos") |
| 635 | bb.plain(" go-mod-cache.inc - Module path mappings for cache creation") | 663 | bb.plain(" go-mod-cache.inc - Module path mappings for cache creation") |
| 664 | bb.plain(" go-mod-licenses.inc - LICENSE and LIC_FILES_CHKSUM for dependencies") | ||
| 636 | bb.plain("") | 665 | bb.plain("") |
| 637 | bb.plain("=" * 70) | 666 | bb.plain("=" * 70) |
| 638 | bb.plain("") | 667 | bb.plain("") |
| @@ -642,3 +671,54 @@ addtask show_upgrade_commands | |||
| 642 | do_show_upgrade_commands[nostamp] = "1" | 671 | do_show_upgrade_commands[nostamp] = "1" |
| 643 | do_show_upgrade_commands[vardeps] += "GO_MOD_DISCOVERY_GIT_REPO GO_MOD_DISCOVERY_GIT_REF \ | 672 | do_show_upgrade_commands[vardeps] += "GO_MOD_DISCOVERY_GIT_REPO GO_MOD_DISCOVERY_GIT_REF \ |
| 644 | GO_MOD_DISCOVERY_RECIPEDIR GO_MOD_DISCOVERY_DIR GO_MOD_DISCOVERY_MODULES_JSON" | 673 | GO_MOD_DISCOVERY_RECIPEDIR GO_MOD_DISCOVERY_DIR GO_MOD_DISCOVERY_MODULES_JSON" |
| 674 | |||
| 675 | # ============================================================================= | ||
| 676 | # TASK: do_update_license_hashes - Regenerate bundled license hash CSV | ||
| 677 | # ============================================================================= | ||
| 678 | # Regenerates scripts/data/license-hashes.csv from ${COMMON_LICENSE_DIR}. | ||
| 679 | # Run after OE-core upgrades to keep the bundled CSV current for standalone users. | ||
| 680 | # | ||
| 681 | # Usage: bitbake <any-go-recipe> -c update_license_hashes | ||
| 682 | # | ||
| 683 | python do_update_license_hashes() { | ||
| 684 | import subprocess | ||
| 685 | from pathlib import Path | ||
| 686 | |||
| 687 | common_license_dir = d.getVar('COMMON_LICENSE_DIR') | ||
| 688 | if not common_license_dir or not os.path.isdir(common_license_dir): | ||
| 689 | bb.fatal(f"COMMON_LICENSE_DIR not found: {common_license_dir}") | ||
| 690 | |||
| 691 | # Find the generator script and output path | ||
| 692 | layerdir = None | ||
| 693 | for layer in d.getVar('BBLAYERS').split(): | ||
| 694 | candidate = os.path.join(layer, 'scripts', 'generate-license-hashes.py') | ||
| 695 | if os.path.exists(candidate): | ||
| 696 | layerdir = layer | ||
| 697 | break | ||
| 698 | |||
| 699 | if not layerdir: | ||
| 700 | bb.fatal("Could not find generate-license-hashes.py in any layer") | ||
| 701 | |||
| 702 | script = os.path.join(layerdir, 'scripts', 'generate-license-hashes.py') | ||
| 703 | output = os.path.join(layerdir, 'scripts', 'data', 'license-hashes.csv') | ||
| 704 | |||
| 705 | bb.plain(f"Regenerating {output} from {common_license_dir}") | ||
| 706 | |||
| 707 | result = subprocess.run( | ||
| 708 | ['python3', script, common_license_dir], | ||
| 709 | capture_output=True, text=True, timeout=60 | ||
| 710 | ) | ||
| 711 | |||
| 712 | if result.returncode != 0: | ||
| 713 | bb.fatal(f"generate-license-hashes.py failed: {result.stderr}") | ||
| 714 | |||
| 715 | os.makedirs(os.path.dirname(output), exist_ok=True) | ||
| 716 | with open(output, 'w') as f: | ||
| 717 | f.write(result.stdout) | ||
| 718 | |||
| 719 | lines = [l for l in result.stdout.splitlines() if l and not l.startswith('#')] | ||
| 720 | bb.plain(f"Generated {len(lines)} license hash entries in {output}") | ||
| 721 | } | ||
| 722 | |||
| 723 | addtask update_license_hashes | ||
| 724 | do_update_license_hashes[nostamp] = "1" | ||
diff --git a/scripts/data/license-hashes.csv b/scripts/data/license-hashes.csv new file mode 100644 index 00000000..ff1d6d57 --- /dev/null +++ b/scripts/data/license-hashes.csv | |||
| @@ -0,0 +1,706 @@ | |||
| 1 | # Generated by generate-license-hashes.py from OE-core common-licenses | ||
| 2 | # Format: exact_md5,crunched_md5,spdx_id | ||
| 3 | f667a3c3830a55a17ec3067709f4526c,13b6fe3075f8f42f2270a748965bf3a1,0BSD | ||
| 4 | 3698933bc48f8aa60375d4423f07610f,442cfb32d1bee3d4b1a4c3f4a90ee5b3,3D-Slicer-1.0 | ||
| 5 | a06b3606273d78257b0e374217de1087,c9c300a27d86ece34c325312a3207327,AAL | ||
| 6 | 7ddd727dfd24eb311bcc7f5fd1f8ff67,c573316c00b0a8233833424212b8209d,ADSL | ||
| 7 | 8fda9a719e1497545e396d0b5d92eaef,d6b15630ef6c74e6600708465caf96ab,AFL-1.1 | ||
| 8 | 0cce6826431e2f999d7f42258d77511d,3d476f17938cc1b98d230d658b17bfd9,AFL-1.2 | ||
| 9 | f01c02e5eac69cff6b8c2cc474b8d468,f752f99c728213244905e05139a5c3ef,AFL-2.0 | ||
| 10 | e40039b90e182a056bcd9ad3e47ddd71,f470c050800f67eda6525fa31c8e5eb7,AFL-2.1 | ||
| 11 | 12a46e25465f5b0543e1de5823ba3bb3,6b32bf21abe8f4dc5d2ec32eba53ab85,AFL-3.0 | ||
| 12 | 06bcb8ed1dec352d24e92f6f39cd138f,20b0783ec6de4d938539b3e690d34b4d,AGPL-1.0-only | ||
| 13 | 06bcb8ed1dec352d24e92f6f39cd138f,20b0783ec6de4d938539b3e690d34b4d,AGPL-1.0-or-later | ||
| 14 | 73f1eb20517c55bf9493b7dd6e480788,087e34aa359b50c351f034bc42c14b65,AGPL-3.0-only | ||
| 15 | a4af3f9f0c0fc9de318e4df46665906e,72a1ba88792cb5de00eb1ded96d0f719,AGPL-3.0-or-later | ||
| 16 | 468af53ba3709485581b835c3144bc47,0f1886fe73f0ba0067694a53e5d7cc92,AMD-newlib | ||
| 17 | 91501a731d1de5dba677333b7ab0ced7,e2636a60d7b2f3961dee2725fa045ccb,AMDPLPA | ||
| 18 | 88dfbf7b73c924dc62b8ae9c3bb0337b,5b6d9776cc1fde82c89012b54124966d,AML | ||
| 19 | cc1e6525c4033c9f1302a825b390415c,da070a37ba943476fcdb2928220b4ccf,AML-glslang | ||
| 20 | 6c766ae145b1f282b87773c4fa1ecfd5,88143b11b08d721b374ffde1cccc078b,AMPAS | ||
| 21 | 8f131eff08616d0a4bd642e2707aab2d,e02bb3412434ee5aa720bb022bca0826,ANTLR-PD | ||
| 22 | 90cddeecef52748c37563b99d2ef1fc4,00a71d509597eaae8956312756884e88,ANTLR-PD-fallback | ||
| 23 | 7a08c1d5cc0f8a43d4a02d65fab6e22e,8fde6af5dffce8e93f9e13dfa35c07a8,APAFML | ||
| 24 | a85284103c73764f1dc551531a50dba5,5c99ea1be80d62f1f716bcc599f4b2c4,APL-1.0 | ||
| 25 | c503584d3ffbdc4e2ae2351c20e95783,9228467d1f3ebad0f267693b90c88de3,APSL-1.0 | ||
| 26 | 316c504405600d20049616655cb331e4,1af05c27d7191f77c012328b4c3577db,APSL-1.1 | ||
| 27 | 9cf3c6d8e5e6cbe7cdef8bc218adfc8d,889e42519a82dd4440b7fa618d463a3e,APSL-1.2 | ||
| 28 | f9e4701d9a216a87ba145bbe25f54c58,6ad0886a2db2940c1e0600a8582db657,APSL-2.0 | ||
| 29 | 6f51fe8f98ea9fd9ca27dc9646b80079,668f87fb794f46399557d3bc52cc1324,ASWF-Digital-Assets-1.0 | ||
| 30 | e6101f537c7f36fbd9130d2fdbb932b6,1d38133f222d978a95001af2a5d5ade3,ASWF-Digital-Assets-1.1 | ||
| 31 | be2715bfed742616b09ed26eddad5ad2,926816b3495b941df924ede8b1231d3a,Abstyles | ||
| 32 | b9de10f35b08470f4a70a99db62e6f4c,b79bedcc5eb26871363e84e73bd3e2aa,AdaCore-doc | ||
| 33 | abedf927be332ceb1e491cfba353d6e8,608d2fc9fa1ea5401f88a26e11ea4472,Adobe | ||
| 34 | 8bd7e96fbef6cf386505b6dfba6586a2,656ab718401e0489e0fee4911068dad5,Adobe-2006 | ||
| 35 | 6a85ad861dee598c6a282125ff5236cd,001ae2e2cac7cc867866bfc4e561d3a1,Adobe-Display-PostScript | ||
| 36 | b8fb22ace48b0b589b0cc6c70e50f73c,77fcb64f46a6f7a45b898c5efc85aab3,Adobe-Glyph | ||
| 37 | c0cb39e855b6ddbff398561eef7d734c,b1eeb24930e43ac70213510449184773,Adobe-Utopia | ||
| 38 | cb0f956653d716234754e8487eee962a,d41939df2a25169b87821b613d63e2b5,Afmparse | ||
| 39 | f0549e909c5da7d62703007d82e606cf,4f47ab42ed793ef2b2a667248d462476,Aladdin | ||
| 40 | 9f7a9503b805de9158a2a31a2cef4b70,0a2e95ebd32041781ae902e3da91080a,Apache-1.0 | ||
| 41 | 61cc638ff95ff4f38f243855bcec4317,c6a371ecc71c570929382dbddd7d3d9e,Apache-1.1 | ||
| 42 | 89aea4e17d99a7cacdbeed46a0096b10,89f3bf322f30a1dcfe952e09945842f0,Apache-2.0 | ||
| 43 | 0bcd48c3bdfef0c9d9fd17726e4b7dab,9d5d19f6c0926f4aefdf2f645e9976a7,Apache-2.0-with-LLVM-exception | ||
| 44 | 6db49dfe0dcbe847a47d32e6b571e8bf,bef8ae27d57c1fca2fc234cfc5758e88,App-s2p | ||
| 45 | 4555ed88e9a72fc9562af379d07c3350,97b8ea9bea5944640fabf3cfc94bc98b,Arphic-1999 | ||
| 46 | cda03bbdc3c1951996392b872397b798,c64a104a9b87e9bda1ac605124d8fd27,Artistic-1.0 | ||
| 47 | 8feedd169dbd5738981843bd7d931f9f,6b04b99f7f949b489a09d7e923bbec13,Artistic-1.0-Perl | ||
| 48 | dea3f591dd4e2a7a6c00644c29d38755,a2cc8d65421a92bf8ec2ae1b4c8581c4,Artistic-1.0-cl8 | ||
| 49 | 8bbc66f0ba93cec26ef526117e280266,a06e61dbbd1e9be362a02a8e98742a5c,Artistic-2.0 | ||
| 50 | 1a6692cac860780d6ac0fca918330143,7cfc26f87f5c94c55f3daa3e9c047dfe,Artistic-dist | ||
| 51 | 25d99a06ae6066ed25d7ff7010888263,51273e49a54e521d55c2c710f314bbda,Aspell-RU | ||
| 52 | fb195e1b4b5cc0cb2c17c5a4fd793cd8,27e3e0c9e340a731a5a136eb98c1dddd,BSD-1-Clause | ||
| 53 | cb641bc04cda31daea161b1bc15da69f,ba87a7d7c20719c8df4b8beed9b78c43,BSD-2-Clause | ||
| 54 | 0251eaec1188b20d9a72c502ecfdda1b,b22e39c77fe5f523c207bbd4c6ac8244,BSD-2-Clause-Darwin | ||
| 55 | 0518d409dae93098cca8dfa932f3ab1b,5f21c51c5e5a4ee1dfa3c1e30c9ace60,BSD-2-Clause-Patent | ||
| 56 | adacc2c4dd508d9986cfd9465317cd6a,7dbf7466b669a3cac52b2ae47e232154,BSD-2-Clause-Views | ||
| 57 | ee56eac379fa8663a8bc9909ef28499e,572aaa1eabcd2cfe95edb67f2410a411,BSD-2-Clause-first-lines | ||
| 58 | 32bb6b156d73f9be5f454418ec07363e,9e6061ad558b7c47f533fa731db55846,BSD-2-Clause-pkgconf-disclaimer | ||
| 59 | 550794465ba0ec5312d6919e203a55f9,7f8892c03b72de419c27be4ebfa253f8,BSD-3-Clause | ||
| 60 | 93f8b671a4e8b1d10e37898c4662e2e2,699e0c4173414eeaeb8ca866a4ad6402,BSD-3-Clause-Attribution | ||
| 61 | 7a434440b651f4a472ca93716d01033a,6966e6f4f411d8927f81efb6cd9c26cd,BSD-3-Clause-Clear | ||
| 62 | 51af8a7a67d3863596e975fa408587db,7f46b52863be460cdfbc4b0c9484336a,BSD-3-Clause-HP | ||
| 63 | a3ab534f25ad82cb6dcfb470a9b2bca0,610d7e67e6c32f3ee3a0fbdc344cd149,BSD-3-Clause-LBNL | ||
| 64 | 27b46022df7bdef61a1e404fc3573f83,494097023f05889154d6e51c80c88c3b,BSD-3-Clause-Modification | ||
| 65 | c8a6a9be92f163b6c1ed17d533daa86e,e35f81460717b97b13d587b2ae739b6f,BSD-3-Clause-No-Military-License | ||
| 66 | 17c115db2c7fcf47125deff9367911fb,5a7d71268a704586cdaba930d63656c8,BSD-3-Clause-No-Nuclear-License | ||
| 67 | c2a08f01e6d3a42b0942bc5a5a32a3e5,927a10df3d49909a3d126227867a692e,BSD-3-Clause-No-Nuclear-License-2014 | ||
| 68 | 03cfa4f20a1ba9d1744c8c970c64e41e,036fd615ca5e4e2c5d4de2ea776fc611,BSD-3-Clause-No-Nuclear-Warranty | ||
| 69 | 78a514775377e847ce6058f458fb5972,695c29f1a5a46f0eb213474c9778e1a3,BSD-3-Clause-Open-MPI | ||
| 70 | 391601a93410f811eeb3d3428fca68d3,8e1c91e0ac446deee276790cd55855e3,BSD-3-Clause-Sun | ||
| 71 | d4085d7a29799bd0c871e38b5f7a4823,dd2672f3c8d7581c2b50a0083eb9cf6a,BSD-3-Clause-acpica | ||
| 72 | e4742cf92e89040b39486a6219b68067,7481f4985288f83cc75f8ec8c85b7942,BSD-3-Clause-flex | ||
| 73 | 624d9e67e8ac41a78f6b6c2c55a83a2b,b40062fa7ebfe5e3423b7c6d8d021d11,BSD-4-Clause | ||
| 74 | d56cfe8f3043d810b4ea9efec2d443d4,e6f8d6746039278e08972daceeddb30a,BSD-4-Clause-Shortened | ||
| 75 | 1da3cf8ad50cd8d5d1de3cfc53196d01,d0644ee4c26725c165f2280b554ec238,BSD-4-Clause-UC | ||
| 76 | 5186e0001e0e10a46405a3774e3aec28,c5eac023974078f8c0437c4748a20fc6,BSD-4.3RENO | ||
| 77 | 75f4d72f502ee3b38a52784426b2c3ad,adca8c6be8fd4c06aa0db0fb713fc96c,BSD-4.3TAHOE | ||
| 78 | 6dab7dd78a472fa382d2faf9f040b24a,dac2a15e5631080d42c88c65ed83e5be,BSD-Advertising-Acknowledgement | ||
| 79 | 5dbe4f55844da27a6267da77a0fed10d,eb6612d34ce8109a38ad38fb829f9c70,BSD-Attribution-HPND-disclaimer | ||
| 80 | bb6146f667105a7f0480f47c7c6b62e8,876c3b8e8acba55c01ffd89186cf24e8,BSD-Inferno-Nettverk | ||
| 81 | 1fba3066d8be1a052125a4991003470b,bdbf75e1a7550f064e48db2b473c0942,BSD-Protection | ||
| 82 | fe8b41221d7524c70688f7d059ff6d87,f2e8ba1e3c97bf8af7af0941c9ae117d,BSD-Source-Code | ||
| 83 | b02d94a02374c33001e79575d3e4d054,08cd21554ca6d5e4077c3f63da4ad17b,BSD-Source-beginning-file | ||
| 84 | bcd3361e18f1583954dc382b9a600e17,ce34ba25be84758a601cd5d59ef98193,BSD-Systemics | ||
| 85 | e3cf7e0cff59ebd1f296c41add6602e7,4eda29ee97287507d41613c66382aba7,BSD-Systemics-W3Works | ||
| 86 | 65a7df9ad57aacf825fd252c4c33288c,21128c0790b23a8a9f9e260d5f6b3619,BSL-1.0 | ||
| 87 | 2e3afbc9f35f84c6c6ca5f21cd16f9a5,c0b39fe553eb6e94f35669661fe35460,BUSL-1.1 | ||
| 88 | 57ddcbf3ed6da6b35d1adc9f4ff4741d,50436e196a7c2fd3ac962da069870108,Baekmuk | ||
| 89 | 2742d70a4d048c85e63db1e64a436726,64532bb93a55d629c800cbb105dad038,Bahyph | ||
| 90 | ccfcd635757dbd4a5ba7526aa9d8feb6,f028972050f1cf9756f7f4b29a3c7983,Barr | ||
| 91 | 8db32780d0d8bbbdce0fa415e514cb89,964195e98292692323108eadd7970135,Beerware | ||
| 92 | 343ae07b73a164814623299eeab1e1d9,a4c0de56e46bad5378b0b10502490ddf,BitTorrent-1.0 | ||
| 93 | 92cedb99d0471a8acd4ecc7c84b5b3cb,e3656988ac598b1c0ae39ce0a1e37eb2,BitTorrent-1.1 | ||
| 94 | 6bb125664f82c1853f7d54e98ea922b9,5b2826f750ecebd97e7728c6bce21afa,Bitstream-Charter | ||
| 95 | 8c4328074cf50f27d3efb9aae5a87f4a,6ea6150ebad6abbd3337bd308dc19fd7,Bitstream-Vera | ||
| 96 | 4157c4506f2d3cf0da1dc51015431b0c,c0c23ae2a62168a8e9ef207d86ec651a,BitstreamVera | ||
| 97 | 95e9f67f2840df3a3a09a77ef3aea34b,15336a64f430636e3f642c0a6e0b982a,BlueOak-1.0.0 | ||
| 98 | ad03248d75acacddc990f85bb70a1854,c32490734121b24edd7d084093eabc7b,Boehm-GC | ||
| 99 | 04d80e73d4673eee6158a5b50899f12f,038624ac63ae80b2d4a8db6e6e7196c5,Boehm-GC-without-fee | ||
| 100 | b474f10b305d72c6c423807177646dc0,234880273e1b499d5fad3e36cd31655c,Borceux | ||
| 101 | e6c1b2a8e1473cb07da49cbf8ee9473d,1510518ccb9b4afa4ebb9409938497a0,Brian-Gladman-2-Clause | ||
| 102 | 741b0469dbc545c7a47950513ba53911,3ea26a6b2e4284c03d4e54dccd70ce8c,Brian-Gladman-3-Clause | ||
| 103 | f894ae2ca273737325e332d44dd5bdf3,a1b056f1f76cf231c441507e70aed6cd,C-UDA-1.0 | ||
| 104 | a3771b929b1097b53210a4e8da10ed60,ff749ba1869109ecd9c734e2805046fd,CAL-1.0 | ||
| 105 | a3771b929b1097b53210a4e8da10ed60,ff749ba1869109ecd9c734e2805046fd,CAL-1.0-Combined-Work-Exception | ||
| 106 | dbb00b2869645074b4e695aec992df10,c61c34e6739afb33aea56306b9c14adc,CATOSL-1.1 | ||
| 107 | e1b141d75eb69dca77dedffa72ab8099,998ef758d616fc39a9aa766299d3d6c7,CC-BY-1.0 | ||
| 108 | b79db37a058b24d186ed078d34982463,55cbfbe8211f458bc478bc34b13166b9,CC-BY-2.0 | ||
| 109 | bf27f7347b03a9fb6376a71c26d5873e,1230c8d58407a79e86f2e5baedc3c932,CC-BY-2.5 | ||
| 110 | 1490533ce18e36ff799448a8152e5f38,4d4851343a79bb425c80639f2e6df62e,CC-BY-2.5-AU | ||
| 111 | dfa02b5755629022e267f10b9c0a2ab7,c688272e7c401d9f8b4447664605b5d7,CC-BY-3.0 | ||
| 112 | ac16bb7393ecc02c0ad56743f5c7fcd1,e5e94ac9ec877a8754623353c5386f8a,CC-BY-3.0-AT | ||
| 113 | f40160ba362231f2f3af8701c9b3893f,dd9f394c3c84e436a77ac3d6d4fdd35d,CC-BY-3.0-AU | ||
| 114 | 6af0c687e05a9af2d3777291cc10341b,450748b9b751b21be10f1195689920a2,CC-BY-3.0-DE | ||
| 115 | 23c2e07ef5fbe97fd8d5f05852793a26,b816ca4bf33549806f77c66ad71969d4,CC-BY-3.0-IGO | ||
| 116 | c3adfa3c8749946e60510facb64bd6cb,e2ef9a0943d9dc1b9ef315130de147ce,CC-BY-3.0-NL | ||
| 117 | e86181756ea84a3a6c838c57187c0e48,5a2d7d5d3217f3366b39c6e02667ac66,CC-BY-3.0-US | ||
| 118 | 9b33bbd06fb58995fb0e299cd38d1838,988202b5ed1229103539868ed0b8c065,CC-BY-4.0 | ||
| 119 | 60c2ef26ff098732959ecfaca4ee293f,48312559a5efae45f824a5cec0cde571,CC-BY-NC-1.0 | ||
| 120 | eb459fd0027ee7bd45ddc87041d0dac0,c4bf54074bdb62a3fb98408a95a161c4,CC-BY-NC-2.0 | ||
| 121 | 3fb1f5b70ed355def0c7510f0c3ff868,f2f2b54b10b931dc5cb74b2d75bd2218,CC-BY-NC-2.5 | ||
| 122 | da665b47544b8cf138600d9e2aeefadd,a6c9b2cdf1bfbfccc0f349376cf1e2f9,CC-BY-NC-3.0 | ||
| 123 | e937cec4476e354e700e70f8184ba255,7840ddb9e5a96edb7de9b795ab3f2e41,CC-BY-NC-3.0-DE | ||
| 124 | de4d02d928802a50f2fe5bc021f81b21,dad42a93ae06c5bc5f6078c2f4816e02,CC-BY-NC-4.0 | ||
| 125 | 1fa0b366e67cd5d33008da416010adc8,afb623d9c270600a64fc1fa3a4f93de5,CC-BY-NC-ND-1.0 | ||
| 126 | 75075c6d5013fdd3248ae5d6f7a98cd5,9b803a8d447ce9f5bf64403d2add9f9b,CC-BY-NC-ND-2.0 | ||
| 127 | f9339183804ba3d5e9769247477764f7,d51880f3df49ff59dfa7786948b4617c,CC-BY-NC-ND-2.5 | ||
| 128 | a1038f0f4a3de1fe9e79e2180c40f10c,c190d0225fa82052bc67249c121e0ba4,CC-BY-NC-ND-3.0 | ||
| 129 | a4448b13b2efa2608ad7372e7e1efd5b,6c4e2dc4e5f42b4be5f64a42685f6c70,CC-BY-NC-ND-3.0-DE | ||
| 130 | 4985c047ad0e40d607a6407b34f18b9a,ed9feaff618b0c34d89db747f51ffb1e,CC-BY-NC-ND-3.0-IGO | ||
| 131 | afe664d64109562c3fa9c309bd7f73bc,dc886895c27bc10ef3baf01738447d3e,CC-BY-NC-ND-4.0 | ||
| 132 | 679365ce5f061c65ce9b2beadb728dc6,796c39fbd77166c12319e04198f00c4a,CC-BY-NC-SA-1.0 | ||
| 133 | 33afa953f9a9ec1c45cff66877723a83,7ef9c59edac34a82543dcd21e9e5ad57,CC-BY-NC-SA-2.0 | ||
| 134 | a9a70cd0b5ec5150fdb5e7960c0fcde4,d95aee682e5b4fb5cda9583b13fa10f9,CC-BY-NC-SA-2.0-DE | ||
| 135 | cd9fd5140672e5f5a7972f261415a4c8,2b1eb511c28786fce581c1100d146bde,CC-BY-NC-SA-2.0-FR | ||
| 136 | 5390dc64dbc02ea720da9862c2d833e3,b7d268e6e4d616fef6cf74777c1566c4,CC-BY-NC-SA-2.0-UK | ||
| 137 | 49d7927bc671238531c941f5282a9c62,c0a7726094672e201fa9333c36f94395,CC-BY-NC-SA-2.5 | ||
| 138 | b285975b5e439d99c95bcba5b5a8cf39,1536d73b2bad5d2f60de0c07fbbbf4fd,CC-BY-NC-SA-3.0 | ||
| 139 | 8c667bd3adc7d359cdfb47f4bbd0080a,d45c8b797b88e41f6ef133a2215cf071,CC-BY-NC-SA-3.0-DE | ||
| 140 | 1bb6df63159c36c499a4abce384f1035,2aaaad74486351d69fb2c1f6388bc0ab,CC-BY-NC-SA-3.0-IGO | ||
| 141 | 277261f4a7c6c099822f8f5cb0180da0,547068c75650d124c8a9c791f196e3f1,CC-BY-NC-SA-4.0 | ||
| 142 | 5697702d6857a5ecf98636ef2a8ff46b,86c1668c4bf50ba2ceae38dfd38bbe99,CC-BY-ND-1.0 | ||
| 143 | 2c7b116933227ab8e62498a916bbfa55,bed70c967433a4f16f95dc3bb89c2db4,CC-BY-ND-2.0 | ||
| 144 | 546f3980b6203a38e6315ca736813822,db674ee52bae2d6d22818f995299453f,CC-BY-ND-2.5 | ||
| 145 | 009338acda935b3c3a3255af957e6c14,3275be58076cb0e48f40b8a380d986cb,CC-BY-ND-3.0 | ||
| 146 | c312e794b0018de67bc843148ecaeea7,4c4e0ac593073cc8aa41d70f37ebd0e4,CC-BY-ND-3.0-DE | ||
| 147 | ab85f6aeae6fce4e9ac8d74990974b86,1dc03315c1622881a2b3ce40966648cd,CC-BY-ND-4.0 | ||
| 148 | 681ffad43a0addd90f1bebf45675104e,16b286e5a094b795e6680c5c1fac5d28,CC-BY-SA-1.0 | ||
| 149 | d91509a59f42bb5341a8af8295f28211,8bc7da3ae5a109b4851c200ab1a5c4e3,CC-BY-SA-2.0 | ||
| 150 | 80d8974849ea3017effd4ad4d2d68a40,39b28cecddfdc9107ba3330bc637c562,CC-BY-SA-2.0-UK | ||
| 151 | f6971d785145ff1e92dc69dc4167da07,94c5ebd3f3d0b2f5585a5aa8e4dae1e9,CC-BY-SA-2.1-JP | ||
| 152 | 5e79ee07b35e45e708fcc631c0df4e1e,afe57e267fccb69dd6722aa5e5e4aeae,CC-BY-SA-2.5 | ||
| 153 | 3248afbd148270ac7337a6f3e2558be5,637026e5987a14499dff2bbae25fa414,CC-BY-SA-3.0 | ||
| 154 | 29bea97bd15f0be0384506ba9aa59a9b,89ef48bc7c12e6ca84398cb24790f110,CC-BY-SA-3.0-AT | ||
| 155 | a7741479921adbee9d03dce48364756d,1606c43fde6286480cd57af30ca8f38d,CC-BY-SA-3.0-DE | ||
| 156 | 16bcb36a8505cc3a17e6205952625c5b,42a7a5d6ea5c7104cf045022debab4ab,CC-BY-SA-3.0-IGO | ||
| 157 | 4084714af41157e38872e798eb3fe1b1,fa25aa6e5418013ab81c8a90ba7b5b56,CC-BY-SA-4.0 | ||
| 158 | 3b51ba0e7718dfed153b9a6bcd786cef,1cdcbf4ee1cfa642e6ed537b223fa803,CC-PDDC | ||
| 159 | 4ac4452d08c713576b524e50a7af1717,7269c5b3323f239119f37f05ec02d05b,CC-PDM-1.0 | ||
| 160 | 10b41b3422e2e88d424ce2e6a6a8f63c,e2a59d5c2892d6b57a458a392ffad2f1,CC-SA-1.0 | ||
| 161 | 0ceb3372c9595f0a8067e55da801e4a1,ca1fcf16bf9c23f4d97edb371901b82f,CC0-1.0 | ||
| 162 | d63dcc9297f2efd6c18d1e560b807bc6,de8c36093b8530c0fa0702057077e079,CDDL-1.0 | ||
| 163 | c18a2eab9bf440520baecdebd5561fc5,1f8c353703b3fc38f84cb7e9e2235a62,CDDL-1.1 | ||
| 164 | 6945436e301008b0d5bf87b1cc19673e,3b2882ac814bbe62e99f5e19de0f88aa,CDL-1.0 | ||
| 165 | db8def9d9625b54d39e485d2203a25bf,e7aa41a9e9cf070d22fff9b535ce9ad5,CDLA-Permissive-1.0 | ||
| 166 | c9fd4fc0f8d1507270a46df37af8e8e4,f1aa0ac13d97532f0cb621f2a54890e4,CDLA-Permissive-2.0 | ||
| 167 | f6d4e2e69d4b50159124bde6a16a11a9,67b61d27099cd9fccfd6be5a1c2c862c,CDLA-Sharing-1.0 | ||
| 168 | 2e1cd3c142f3ee0c48ac10ad0edfd6a2,24b79a6464e8925c65507c984f864834,CECILL-1.0 | ||
| 169 | 2a288b1ecac1b81b88207d41ed6f62bb,0a4ee7dc6b3e0f194552950e4d5da589,CECILL-1.1 | ||
| 170 | 574109ac4bdff61f9c3e0de892ecbd19,f562a18a3c2e0473caad9b16e051b916,CECILL-2.0 | ||
| 171 | 342660b06b8c7717c974c19366c80e7a,ba41d376f852db14fcec943357cf560e,CECILL-2.1 | ||
| 172 | 6a836b2e19f087226df57a014fb871e4,ff78c16a26b498213f2343bf60c67927,CECILL-B | ||
| 173 | de61e8e359a18f44efdb91f6d020e73b,5e3834fb49b1e7a6f4cb8a56f7ec3413,CECILL-C | ||
| 174 | f590cf750bd365fdd1b41da8c7d4cd82,d2d494bb86609effc1ecb21ba2274f52,CERN-OHL-1.1 | ||
| 175 | 8830efada678f2f7e6eb7039960418dc,0cfbf6cc54b7ae0a536604d24cdc2c21,CERN-OHL-1.2 | ||
| 176 | b16f082a74b67070bf552dd5a0a6967d,978217b5ceb086957b2baeaa6691a831,CERN-OHL-P-2.0 | ||
| 177 | e54c225891056b4b5b9aedf720324c48,f6ac98e130f2549a8d3ddee20fafffa2,CERN-OHL-S-2.0 | ||
| 178 | 9c52a15851488b9d3d4d1ff2ce9ebe63,6cfa1b8c13c1995e3e922149f6425377,CERN-OHL-W-2.0 | ||
| 179 | 3f2e28358fd5878d6c047f3df09593e6,90fbcebf1f3d0fa224d5ba338b5d0cf4,CFITSIO | ||
| 180 | cf408d61106c47b36709bc34a6a11b06,baf7144fc1339f0e362ba20660e19885,CMU-Mach | ||
| 181 | 05889c72562f06247a60566567778858,a746bef491ccd5c5079dd75dd4a261ac,CMU-Mach-nodoc | ||
| 182 | 73f709359181c00178478e8a3b20cda4,6d022a43817ca2613a8f748735e225e4,CNRI-Jython | ||
| 183 | 504de64ba3e2c39bb65485686b0e3a33,1b3172bfd79842bbca6216240fa72a46,CNRI-Python | ||
| 184 | efc38ad5089e7c3314adca7c4eb8351b,514ddef779190c50b8a328abbd0cc9a6,CNRI-Python-GPL-Compatible | ||
| 185 | 427bb5cb3253b5fa3fc15b6682f99c0c,5f98956e28603753fdaf349fe5c31a2a,COIL-1.0 | ||
| 186 | 4b571d5d786c50fbe70381b8c504be7d,72bd71fbdd47cb6da39f9f02d6f44213,CPAL-1.0 | ||
| 187 | 5295cd12fc5acc87bf1cf754455a1c56,eb33e9ee7af69908a385ce50cd475df0,CPL-1.0 | ||
| 188 | 634398b133bc1f789f32b278f56fc7df,4e8a42a5254c68ec7a136a47360f6db4,CPOL-1.02 | ||
| 189 | 0bdd9acccdaec449aedffb518252fa12,522ecc170ae6a8a655d32fa5adcbc0e4,CUA-OPL-1.0 | ||
| 190 | 9844d8451b9d4eff66d8f8ef4a55a206,6721e1e4d5902f3fb3dd884c82bb69f6,Caldera | ||
| 191 | f4338c70a1bf12fdb343b98f9aed1966,7ffd0f0205518c9d2f71e31d6a3bf1d5,Caldera-no-preamble | ||
| 192 | 3b9277d8c092ffdd18d853cfade067ff,956099f332e3ecd42eb3c1ed653ef6a1,Catharon | ||
| 193 | f633bbf0697ec33066b83adfa9ebe51d,314f1f9be0fe41de44b73949cb6e3ed2,ClArtistic | ||
| 194 | 4b8ddf96c3c2d1d2195815235b87f8d8,a7f8df3cf4269bdca142418e0c65ec34,Clips | ||
| 195 | 3aee591f88991b746e1e223889996923,f9753c457b081188a6d94d80276a2a84,Community-Spec-1.0 | ||
| 196 | fc018a7d79dee1e8498e07e632a83895,914baf15c1ea0e3549988efdc68c32db,Condor-1.1 | ||
| 197 | d58c4769ee9a05b2cb7769bb6a445dbb,011fdf1ae7e471000f02784d39a1cefa,Cornell-Lossless-JPEG | ||
| 198 | 33998e7b4461ed0ed0a65aea6479ea2e,59cb0924efe4e943c5ecd6aba177b86e,Cronyx | ||
| 199 | 60c3fab2573aae2a88d7f8c69462de88,e31560d59cd5692a0c69a37af1eba4a8,Crossword | ||
| 200 | 8c12e5d3be190fbd04a7b7d8e6f920ed,281b5f359bc97681ef962bcafe41c7e7,CryptoSwift | ||
| 201 | d93dee0d11742aa64d04dafeb9ad789d,139f43feb383f71fff152d0b5668ac2d,CrystalStacker | ||
| 202 | f60e3dd4c8ecd9ef8c12216ad198b70e,bbcf4c29d9de7192eb76a37880ad8faf,Cube | ||
| 203 | 1899cb922af9857069381a10e9360db9,c6cd512f3a4f78900dfcccd90642f2b2,D-FSL-1.0 | ||
| 204 | 79d48942e4701601ca9395b06b1b6102,a98b4594d612fe95c2fc325c5bd0c058,DEC-3-Clause | ||
| 205 | fc27105efcc01e0c3f5676f688f4954c,822f29bb5ba8de43f39b99f03951ef2b,DL-DE-BY-2.0 | ||
| 206 | 69bed12dd46176896eff39791e329136,7256535c3149013b0218f72ece146412,DL-DE-ZERO-2.0 | ||
| 207 | ebb580f32931868a8a238b01eeeedf29,cae873e49ab9e9c08471338cda34d570,DOC | ||
| 208 | 466df5bc4f94b4bad27a2c278fa09f56,675b3f1c3fdcb2fb6f6fcf4425656130,DRL-1.0 | ||
| 209 | 665db44dcb4c03a4090f22fdcc102b35,57b1a620e17174931f9193fe3ac7939e,DRL-1.1 | ||
| 210 | 476efe3fc49aa495b544c2b3da04b8f1,28ad0c16fe32f16593114ec14d43d1bb,DSDP | ||
| 211 | b597b18461d4ca652c43297c1e22b80c,0d7e1dba04cda3547619e2ba7499e00d,DSSSL | ||
| 212 | a6d8a177c13ec21ed44824a01f44216a,d6d20beadba5b2cbf8837a6e35a5e291,DocBook-DTD | ||
| 213 | 8d6602a268a9532585452aec0a62038b,8751cb883e5c6855f9450587b1adb12c,DocBook-Schema | ||
| 214 | 05f0782889d413839663a0f07da997bb,ce03b8f566e53684ee142704fb5b55f2,DocBook-Stylesheet | ||
| 215 | a6eeeed43d498c22a835382533356462,9aa82f0382f331b25b8174d489be42ec,DocBook-XML | ||
| 216 | ad6660e511dcfe55a177fd53377dea59,db387f3fe9485ca7a9136ff52082936f,Dotseqn | ||
| 217 | d63919ac66adfeaf1f51e0c9ea9c19f9,c4abad6b281140a2a765a1a6dda01611,ECL-1.0 | ||
| 218 | 69e416df0eb517ff13bbb9219da29344,0a3bc94a2309ad04c36fd3ebfd9047d6,ECL-2.0 | ||
| 219 | e06be17b8577bf6e2277a5c3c71b2d05,975742a59ae1b8abdea63a97121f49f4,EDL-1.0 | ||
| 220 | 9ef6c560d1e6dd249eb0a55335500690,4b0a2ca1de6fad7855b64242004df84f,EFL-1.0 | ||
| 221 | cf203289aa5ab7db7ddf321cafe3d815,104182b0bf415ebe98ad351bdfee11a4,EFL-2.0 | ||
| 222 | 43c7610db53c3693e0ba4467d7874db9,67ddff53c9db82382dce4cdc6aa24d25,EPICS | ||
| 223 | 57f8d5e2b3e98ac6e088986c12bf94e6,5322cee4433d84fb3aafc9e253116447,EPL-1.0 | ||
| 224 | 2dd765ca47a05140be15ebafddbeadfe,6922352e87de080f42419bed93063754,EPL-2.0 | ||
| 225 | eb44fbd1496ddcfd5d28b73ee48c849f,087aafe0e6d46b52364dbc7e2f6736c6,EUDatagrid | ||
| 226 | 9b6186c48020a9763693332dc4998bc0,f6768a63a83b42f5d4fc24b5a8b4a11a,EUPL-1.0 | ||
| 227 | 3f12b8134016fd7ba5a010afd690abaa,790b14a1824859da7282a35a3bd1c7f8,EUPL-1.1 | ||
| 228 | 41fa1e32337666d37d19786aebbf3923,7fe61c6a60890bf5d8a90e5e26369816,EUPL-1.2 | ||
| 229 | 42631b1af161defcf4844fb1e26cfc70,a7fea2446b9707ad986a2bb0084438aa,Elastic-2.0 | ||
| 230 | 569f0c2c33934ff2511e1b129eb4b77d,b6a4a957367eb851c40d7951b77ba1c5,Entessa | ||
| 231 | 9567c64d58e18a81951c75d00c10fa98,90a7ce5d1cc714db3b3ad6b2205c96b1,ErlPL-1.1 | ||
| 232 | 7c1ad6a95981815dbe65a27eefac6bb3,c2a9f6ef9c05e63ad58e02e2893ba20f,Eurosym | ||
| 233 | 7fb655591b2698ed9a93ee05acd4f2a7,2b1279c0fdbcf59bb9bf59b26705de14,FBM | ||
| 234 | ecb28e9a9909d24005bd1951238ce35e,403edc29888f8ae09a14834014c6bce6,FDK-AAC | ||
| 235 | 06fadd9ae6adbcd5d8d545dac90b15f6,f8001d7ca41107412666073c94a56f8d,FSF-Unlimited | ||
| 236 | 232368338ef6dc99de71c2e05ff12176,166e9e93763912d23516372c22cb6b53,FSFAP | ||
| 237 | 3bdfb6b7141d64fbe01234d27ab9d39f,7c085c03311c4df367ba551f70a53929,FSFAP-no-warranty-disclaimer | ||
| 238 | dc74327e8d4dca295527a090d2af4ba4,75cc591499e55d5cd775a1d6cda68b7f,FSFUL | ||
| 239 | f0aa4b452548cc5d53a7772a9a90b3c0,f8001d7ca41107412666073c94a56f8d,FSFULLR | ||
| 240 | 64d4a3ca203a187bd11f47a2c8ddec47,bb577c8ef765114264be58b9b163a81a,FSFULLRSD | ||
| 241 | 546c2b17f1a20be593935a4babd275f2,00d9bcbcaf63b905cf7b2bed0023be30,FSFULLRWD | ||
| 242 | 9dc5a21fee2aa3367ed7e5fc5b1df410,d1ba3f1e105ae21f1c6dc8967f3cabc5,FSL-1.1-ALv2 | ||
| 243 | 029bd8c4c146af57c48fd42fcb8a5617,2b47e4f827110eab2052a560b980bec1,FSL-1.1-MIT | ||
| 244 | f0bf6b09ee8b02121ed10709d9e49d8b,dc1d5ccd80f76155b44da67ece7065c8,FTL | ||
| 245 | 4b962f28acfe06428def53679d1161a5,a3cc38e53861969255464508da42e6bd,Fair | ||
| 246 | abd020ac7223106584046231a36cc563,5e428a0aea0409f164a1947f10613590,Ferguson-Twofish | ||
| 247 | f163acc1f7bf0b7978bb29b2b46dd864,6988d5c25075d9554a6e0c178d9cab87,Frameworx-1.0 | ||
| 248 | 39ac307a6de92199a3ec5ec7e6eeec03,9692e000a1000db174f8a62efb7e8da6,FreeBSD-DOC | ||
| 249 | f9cbd56c0b114af37c44d6f127cd9fbe,28711571aec93049406814773976049f,FreeImage | ||
| 250 | 2db647cc1598d0b3cf6c263350bb59fe,cdf5f0c3c39eb168e595a55690b41fa5,Furuseth | ||
| 251 | 38686eb1b8e21891cb1111456d58acb9,507a36f9a1771df117a83d79446f069e,GCR-docs | ||
| 252 | 4640dac12cf15ff1fc48e2d812d20cd9,f69483bd26e53373c699cf3b3b0a62bb,GD | ||
| 253 | c9211dab3ae61e580f48432020784324,6ccb3b31e9db9cc08cdab17923a74329,GFDL-1.1 | ||
| 254 | 03322744a1a73f36ebf29f98cced39a4,ad4e9d34a2e966dfe9837f18de03266d,GFDL-1.1-invariants-only | ||
| 255 | 03322744a1a73f36ebf29f98cced39a4,ad4e9d34a2e966dfe9837f18de03266d,GFDL-1.1-invariants-or-later | ||
| 256 | 03322744a1a73f36ebf29f98cced39a4,ad4e9d34a2e966dfe9837f18de03266d,GFDL-1.1-no-invariants-only | ||
| 257 | 03322744a1a73f36ebf29f98cced39a4,ad4e9d34a2e966dfe9837f18de03266d,GFDL-1.1-no-invariants-or-later | ||
| 258 | 03322744a1a73f36ebf29f98cced39a4,ad4e9d34a2e966dfe9837f18de03266d,GFDL-1.1-only | ||
| 259 | 03322744a1a73f36ebf29f98cced39a4,ad4e9d34a2e966dfe9837f18de03266d,GFDL-1.1-or-later | ||
| 260 | 95d7aba50e99d173b2a5f125d24a911a,201945d7c8298e073b6b9d62e1553665,GFDL-1.2 | ||
| 261 | 9f58808219e9a42ff1228309d6f83dc6,d014fb11a34eb67dc717fdcfc97e60ed,GFDL-1.2-invariants-only | ||
| 262 | 9f58808219e9a42ff1228309d6f83dc6,d014fb11a34eb67dc717fdcfc97e60ed,GFDL-1.2-invariants-or-later | ||
| 263 | 9f58808219e9a42ff1228309d6f83dc6,d014fb11a34eb67dc717fdcfc97e60ed,GFDL-1.2-no-invariants-only | ||
| 264 | 9f58808219e9a42ff1228309d6f83dc6,d014fb11a34eb67dc717fdcfc97e60ed,GFDL-1.2-no-invariants-or-later | ||
| 265 | 9f58808219e9a42ff1228309d6f83dc6,d014fb11a34eb67dc717fdcfc97e60ed,GFDL-1.2-only | ||
| 266 | 9f58808219e9a42ff1228309d6f83dc6,d014fb11a34eb67dc717fdcfc97e60ed,GFDL-1.2-or-later | ||
| 267 | 1083add59b39991c748ea70a92166959,8242b0f25d1a8cf93a25a84faa3bf3f3,GFDL-1.3 | ||
| 268 | e0771ae6a62dc8a2e50b1d450fea66b7,e020ca655b06c112def28e597ab844f1,GFDL-1.3-invariants-only | ||
| 269 | e0771ae6a62dc8a2e50b1d450fea66b7,e020ca655b06c112def28e597ab844f1,GFDL-1.3-invariants-or-later | ||
| 270 | e0771ae6a62dc8a2e50b1d450fea66b7,e020ca655b06c112def28e597ab844f1,GFDL-1.3-no-invariants-only | ||
| 271 | e0771ae6a62dc8a2e50b1d450fea66b7,e020ca655b06c112def28e597ab844f1,GFDL-1.3-no-invariants-or-later | ||
| 272 | e0771ae6a62dc8a2e50b1d450fea66b7,e020ca655b06c112def28e597ab844f1,GFDL-1.3-only | ||
| 273 | e0771ae6a62dc8a2e50b1d450fea66b7,e020ca655b06c112def28e597ab844f1,GFDL-1.3-or-later | ||
| 274 | f241646acc4eeceb4b2d1496385609ef,0c668195597b0bfc75603979588a8b2b,GL2PS | ||
| 275 | 9c7f16ad544b4c9090db061524c4ecbf,63280a0680046fd0a8525cc7c7fc2986,GLWTPL | ||
| 276 | e9e36a9de734199567a4d769498f743d,c27b0005ba6255e7ec1c042c7119b5ad,GPL-1.0-only | ||
| 277 | 30c0b8a5048cc2f4be5ff15ef0d8cf61,e2bb1703ec21213f3cb9816023711f2e,GPL-1.0-or-later | ||
| 278 | 676cb7fcf1214ecbe3be420dd5a5b967,ff07743d7307482bfc205231a478a706,GPL-2-with-bison-exception | ||
| 279 | 801f80980d171dd6425610833a22dbe6,793475baa22295cae1d3d4046a3a0ceb,GPL-2.0-only | ||
| 280 | fed54355545ffd980b814dab4a3b312c,ff9047f969b02c20f0559470df5cb433,GPL-2.0-or-later | ||
| 281 | 14c42911132e8c9008911385aede6449,d9305eec735dceaea89c309651ffee39,GPL-2.0-with-GCC-exception | ||
| 282 | 0bad96c422c41c3a94009dcfe1bff992,0fc3a2442d23814e3331c2d89b663b4b,GPL-2.0-with-Linux-syscall-note | ||
| 283 | d9e4412f125e3e6f14efba8ce7b4604f,8f104356594afcdf60f5d39c00cb5d4a,GPL-2.0-with-OpenSSL-exception | ||
| 284 | 966c02a95037a9c7ad75a7597aea9c5f,fb135dfeca798ea30289952f491e90c3,GPL-2.0-with-autoconf-exception | ||
| 285 | 6133e6794362eff6641708cfcc075b80,8f0e0b3085ca64857d15ec776e8d3852,GPL-2.0-with-classpath-exception | ||
| 286 | bf93e21a513f6f923474e62fb920434d,8f591c52ed49d95687055100e8959acb,GPL-2.0-with-font-exception | ||
| 287 | 6e1bac3dc21fcc4fa049cf5c407eb7a2,e79f2b7c71198191a9309a31379e2d37,GPL-3-with-bison-exception | ||
| 288 | c79ff39f19dfec6d293b95dea7b07891,ea6de5453fcadf534df246e6cdafadcd,GPL-3.0-only | ||
| 289 | 1c76c4cc354acaac30ed4d5eefea7245,b419257d4d153a6fde92ddf96acf5b67,GPL-3.0-or-later | ||
| 290 | aef5f35c9272f508be848cd99e0151df,ee36936fda28084b11e8d99812bf7606,GPL-3.0-with-GCC-exception | ||
| 291 | da26b415cb0faf9bfe6829f0ffa409ec,a101ba086852a854b262050d90a9ef10,GPL-3.0-with-autoconf-exception | ||
| 292 | fd68513f06aa6a7152df173ca2ced1d5,eaca5ca8bf7b8d91939c22b10b2e8e1d,Game-Programming-Gems | ||
| 293 | 842cffb135d8acfd5cd3ef4281efd140,bf305e9ccedefd0e196c24b9e9bffa37,Giftware | ||
| 294 | 98566c42efca5f49dfd5c8c8f040b419,25e6928ad2d3c32a8cc8074356400a89,Glide | ||
| 295 | 9e4ccb2a5e3ae7d2c4f2ad3f0a8e18c2,98806bc3501433890cd94e57d1638fa6,Glulxe | ||
| 296 | d0aba67ffac27d88e32782a0ddea7781,78a6aeb13283e8188bbb96b962e9696d,Graphics-Gems | ||
| 297 | cf754ff71ecba468d1c3dc9c729ec4be,95729d66b82e2d06a07a91d7c2901661,Gutmann | ||
| 298 | 2349c5ea816e0ff437f3d63e02f948c3,5a6522bf01126336f87bdffd2cf059e9,HDF5 | ||
| 299 | 7667661a039c6408bfaecebb984442c8,902f1a4ffbb8712bec72821c7d49a8af,HIDAPI | ||
| 300 | 8937760d9189ab9daed685da1c608f55,7316dcd50baca47f8db06568e979dbf6,HP-1986 | ||
| 301 | b402423daac617956bf39cdd3360d3c9,a7aab32a61cf2d784efe29abc3300746,HP-1989 | ||
| 302 | faa364b3e3c6db0f74cc0e704ddf6b9c,1afdf224cc65521eb9bf3d6b26bef9b5,HPND | ||
| 303 | 63c89d6fa93a99237e96b74c6e267778,d4b44a6958001d0f972047218785546e,HPND-DEC | ||
| 304 | cb79d2ada1c67f5a36bd6e876701f18f,7b0870801109847f5f7b7ade46ed1361,HPND-Fenneberg-Livingston | ||
| 305 | 7d73846faf6b89b1700d406e89a3f7b0,ff2cae907bd830a7bb33b8438902baf9,HPND-INRIA-IMAG | ||
| 306 | 8c2ad6eda88a19cd687fb39b18d2a381,2394e4017d506a8e684e1dae2342965d,HPND-Intel | ||
| 307 | 35f473deb259d9c059127971d19347d5,62fcf649bcbb6ab7453b9142ba90a7d5,HPND-Kevlin-Henney | ||
| 308 | 8b90e19491ef78dd7f61037f50c101df,ccb1c31406caabead46d3f1255684fe8,HPND-MIT-disclaimer | ||
| 309 | 5a1d801548c23958ccd88a8b268884f3,42d2b2a8bfd3f9d3d0aa392f3cd2a394,HPND-Markus-Kuhn | ||
| 310 | a81c9a228402dd0f8e07b1aa2c364605,d13853e1fa56edd11683c728ef796be8,HPND-Netrek | ||
| 311 | bfbb16faa58cf761542ba3ddd0a56d9e,324ca733ee82f58eff05eae2124162fc,HPND-Pbmplus | ||
| 312 | 2b0b90a648d2507d043b6bae013fbfbb,d9d74fd1550c50928310c4d51cbe07f5,HPND-UC | ||
| 313 | 26a25ed7307a326f555b251b670372a0,9bc0c53d6e882fd7ada6978c7257f17a,HPND-UC-export-US | ||
| 314 | 37a261109f374a8cc8d19431ab6ff677,7d0695133d4790b40c411fe0a2f041c8,HPND-doc | ||
| 315 | 80b6d5b74043f3112b132d2dff65aa49,4415b77f9b97ac6cadc4885fb9264cd9,HPND-doc-sell | ||
| 316 | b6405a09c65be809fe8255dce3147729,96911926b501485d2c0b4bd8cdf81c06,HPND-export-US | ||
| 317 | 0d0dfdb8d027eefaf2a4a039622e5077,05efccaf36b8162131d10c05a946b15d,HPND-export-US-acknowledgement | ||
| 318 | 432f6d5a8810035526dcbd74ff2b6c9d,845876f9f225e21c3a2cb9f9aced2059,HPND-export-US-modify | ||
| 319 | 72c547a8cd0cea28b7dd6357f44e9c9a,2ee2c7a1eb565b3bf943f8d3274d718c,HPND-export2-US | ||
| 320 | d948969d402c1792f21b497addfd87c2,8bbdc179d259a5fbd3a12d8eca281204,HPND-merchantability-variant | ||
| 321 | 584132f8a06ba260c199b5479ac39166,8de0026ec5bca1e0fb9c2455e83e4651,HPND-sell-MIT-disclaimer-xserver | ||
| 322 | 7cf7171ab01b3841d35a87977644d7fc,f11057f85f40ce9820a174e82c0706c8,HPND-sell-regexpr | ||
| 323 | 2a45f725f5ea99a831c06aa6be09f368,8f9160bcd3ba3c1fdab16af47c75c245,HPND-sell-variant | ||
| 324 | 22facf55152762303d6e32eb2fa7fbc2,b20466da2a94a3a02191a239cbc4adf6,HPND-sell-variant-MIT-disclaimer | ||
| 325 | 43575e76516382681f3d6084e128e5c8,0d397c027669c48ac66cb82531f24d50,HPND-sell-variant-MIT-disclaimer-rev | ||
| 326 | d12343a2d67cdff907091c77d9f929af,47a9459e5c5b14c62791b4026cd47a19,HTMLTIDY | ||
| 327 | 79040043c56d4fef36975020dc270420,834942941d174792d154e0348343396b,HaskellReport | ||
| 328 | b80cf26a858bf07912ac604409ff4ffa,67f5b86ada3d96e719e7eda2ce79c071,Hippocratic-2.1 | ||
| 329 | b55b967482208bb2abce2233534a01a0,075c9413058e22ff1516cced22de4a5c,IBM-pibs | ||
| 330 | 4d85ad1f393add71dc66bcf78e3ee584,b165b41e6cfcef0ec9375e66a301a940,ICU | ||
| 331 | a9a30ea703572ad3ded3a27ee7db812e,988c275bf59f86fd692a612ebd08701c,IEC-Code-Components-EULA | ||
| 332 | d9fc5ebaa95c14466091d25e0d34e688,4d58a6f52548a942894366dc3f1dfa01,IJG | ||
| 333 | fa85185da21c9f725663fb4ebc6443ed,006e7208f5de4f5a86078c4273eea409,IJG-short | ||
| 334 | 17b18da2d8b2c43c598aa7583229ef1b,16c1dd9f00cc26013f7d0f34cc47ef31,IPA | ||
| 335 | be739b8845e6e98f99e206221fe9293b,a7335747c7c8a4a2aaee3f765448fb04,IPL-1.0 | ||
| 336 | f3b90e78ea0cffb20bf5cca7947a896d,228737f4c49d3ee75b8fb3706b090b84,ISC | ||
| 337 | 250ec29b2decd76847fe880e5c0e83e4,92dcd74b1c6e1192b95eaeb67ab9e25c,ISC-Veillard | ||
| 338 | 2c2cb8af4def8c0bb0c3046ac2c8d514,a3807e85727837044f74ee39b3bd61dc,ImageMagick | ||
| 339 | 07eb6510e14fe74a376fb67157b806a0,54cdb66df90551c99448cbf7510ab07f,Imlib2 | ||
| 340 | 83a1c8ea099b3b58beb6e55dcbe4c15f,116555e799b5729c931406ef4f7d18a8,Info-ZIP | ||
| 341 | f179e6175372e6e2c06b6c2794a1a478,9283974f12be64e59e2f1da04f9390ad,Inner-Net-2.0 | ||
| 342 | a8c11f520c3973e3300d40dc6d03c38f,3fc661a4a5544ac1545c9fab21f43d30,InnoSetup | ||
| 343 | ced5efc26449ecac834b4b71625a3410,ae1e23cc7f6d863e9b20452462c66938,Intel | ||
| 344 | 127b1c00c0dad2b0296f4e909cc4a547,ad4776027f8e917638f6e0bca98df66f,Intel-ACPI | ||
| 345 | f65304bc0e87e6700fe1e4ab5affdc6f,afcf0a4d2eedb2529114131814518f78,Interbase-1.0 | ||
| 346 | 0a034e5200a8faf192d1e5e0db32fa7d,fe456b995e55bfe380a447dadfc4a45d,JPL-image | ||
| 347 | bb17eba7b7f83e0c108c4df52fdd7694,7b2329becc6c1238c3ddec866c080f9e,JPNIC | ||
| 348 | 08ae6a95b08b6b8db33b3ac4700fbeb1,c483afb48acffcb070371040e1c07bf4,JSON | ||
| 349 | cb964db04e8da9aac4241e724d1379eb,a12b7d87a502886df11c840ddd522e03,Jam | ||
| 350 | 94c046e511122aa69212ae137b55eb9a,6b5bb294d85f068526fbbf2c6cd2e7bb,JasPer-2.0 | ||
| 351 | 7ce1c908ca53cfa7e691c53187e8545a,3beac04eab762762063d24aa63bbc80d,Kastrup | ||
| 352 | 6a55d5ad80645ea24fea8e179d3fb6c8,7d4157ad58423aa23dc08fc9e348da46,Kazlib | ||
| 353 | db688c4a804ef41ca3cdd97955696309,a25648a10131b683522a86e38777e16a,Knuth-CTAN | ||
| 354 | af880a0f040cb16dc39e66580e1ef6e0,c4a0cfd79e0ed8687144313b78eab474,LAL-1.2 | ||
| 355 | 3728762dff91f7fc2c26e5470e4fde9d,921d527d62ea5e95202e412ed7144d6f,LAL-1.3 | ||
| 356 | 9427b8ccf5cf3df47c29110424c9641a,c6a782e826ca4e85bf7f8b89435a677d,LGPL-2.0-only | ||
| 357 | 6d2d9952d88b50a51a5c73dc431d06c7,32d8f758a066752f0db09bd7624b8090,LGPL-2.0-or-later | ||
| 358 | 1a6d268fd218675ffea8be556788b780,4820937eb198b4f84c52217ed230be33,LGPL-2.1-only | ||
| 359 | 2a4f4fd2128ea2f65047ee63fbca9f68,db13fe9f3a13af7adab2dc7a76f9e44a,LGPL-2.1-or-later | ||
| 360 | bfccfe952269fff2b407dd11f2f3083b,d7a0f2e4e0950e837ac3eabf5bd1d246,LGPL-3.0-only | ||
| 361 | c51d3eef3be114124d11349ca0d7e117,abbf328e2b434f9153351f06b9f79d02,LGPL-3.0-or-later | ||
| 362 | d5311495d952062e0e4fbba39cbf3de1,07f35905b113e04930aad2aff9723f5a,LGPL-3.0-with-zeromq-exception | ||
| 363 | 159ff0ac8f0ae99f92b7e604b3bf02b6,96fe3af8ff2e20d3e293457aee82509c,LGPLLR | ||
| 364 | e31cf1d5021bea3d57e59f2e4c6e190f,d65bad62db49062b508c3b44101db0ae,LOOP | ||
| 365 | 6f9bcdb850aa1a5381465dba316c376e,ce2db32c90337bc63b5e86855e3d28e5,LPD-document | ||
| 366 | efd7b41ec0e3fde64acd215334ac4436,1629443a4a86cf39203d8963d43d6ef3,LPL-1.0 | ||
| 367 | 7000797b47d74a5ce02dbae91e4814c9,113e0b34c63436e74dcc4f2150eddc7e,LPL-1.02 | ||
| 368 | 9263bb4eebce865da8626ad537b97d8d,93dfdf04dd7f65c48485b319aa274834,LPPL-1.0 | ||
| 369 | d9f6cdb08c684151d839756e8b04e8db,fcfb3e07821a8a6f768ccdeb870d73d9,LPPL-1.1 | ||
| 370 | 417075eb69f70fcf5a50388bb516af12,102b904cc2fb5229d116216f71c6054b,LPPL-1.2 | ||
| 371 | 8e2e8e1428b39cd78927c2ad28734ff7,8f8ac6a78d20d416083ed0bace5156b8,LPPL-1.3a | ||
| 372 | ba2fa6fe055623756de43a298d88a8b3,68c72d314d70e00c96d26db2c15e8ab1,LPPL-1.3c | ||
| 373 | 43613958980fd00a6ecdda51d9b9b05d,dfd1f6c25f342a7216540f47c65da12b,LZMA-SDK-9.11-to-9.20 | ||
| 374 | 2de42ec1dbd0879189e37f6fea6c4b63,ad9adfe69bcb5f8c1119fa6f4110937c,LZMA-SDK-9.22 | ||
| 375 | ef91d258f6a8d4d7f4db4d30adf38598,9940c96b64f7641f186c2fbfe35435cd,Latex2e | ||
| 376 | 30a98f811094c3dded653a205007d9a6,aac45216f806050f7402f5c351a9ba2f,Latex2e-translated-notice | ||
| 377 | 3da0ce0907d870523c2cc5d94d32fad1,1f5cdc76245a7fab79b99f0aa842d2ff,Leptonica | ||
| 378 | 503577dcf1b97fe29e64519f3eb52f93,5facc5f182ef3150d49a7fe98e649dde,LiLiQ-P-1.1 | ||
| 379 | faf775436c2359467177f2e0dbd891c4,54067345da0e2a4071a79b3a62792bc5,LiLiQ-R-1.1 | ||
| 380 | bd6163c22201a119540db4a2606b3e1e,928c006aeebdb50d230f20b5a9f623f5,LiLiQ-Rplus-1.1 | ||
| 381 | 12b4ec50384c800bc568f519671b120c,eaaab67e38179d6db00282c6956e446f,Libpng | ||
| 382 | 448c42d4ca4be6f8fb40e0620c8b145f,06dd6dddc4d1288fad4499693c0a4052,Linux-OpenIB | ||
| 383 | 97ab07585ce6700273bc66461bf46bf2,1852b2dc3e92e45c8bb8e318aa03ee7a,Linux-man-pages-1-para | ||
| 384 | 173b960c686ff2d26f043ddaeb63f6ce,97d9f6cd25bfe015b264d09db6fcef2a,Linux-man-pages-copyleft | ||
| 385 | 1cafc230857da5e43f3d509c425d3c64,62270e2b08f88dc1aa0f2f34fccdc16e,Linux-man-pages-copyleft-2-para | ||
| 386 | 3853cd62795903a9ebd1357f6a3a66b4,34e81d1d85bc989095be7c7099d28944,Linux-man-pages-copyleft-var | ||
| 387 | 3c79a4d5128d4a7beecf641abc8aa884,228ee80599a32d49542864cf4eb1af4e,Lucida-Bitmap-Fonts | ||
| 388 | 1e0b1b77c8b70630131c95bc4ef4befa,ad2e22456f120d08609476d3398650b4,MIPS | ||
| 389 | 0835ade698e0bcf8506ecda2f7b4f302,eecf6429523cbc9693547cf2db790b5c,MIT | ||
| 390 | f41b3a5f969eb450434cf0e4f33449b9,b218b0e94290b9b818c4be67c8e1cc82,MIT-0 | ||
| 391 | 91b70218e0db8e063ed88cd532cb801d,9fabe195ee00170406314047681a3a37,MIT-CMU | ||
| 392 | 908396cd67049b226422ebfd4f38ec17,393b77944c64e8e6b57a32095a101a5a,MIT-Click | ||
| 393 | 4bdb3f94d7a2b2cf7cabfae18f2bfee3,a86f382fe8fe6624c740d6623cd3fdf7,MIT-Festival | ||
| 394 | a81aa9fd63b8e618b46e566919afa6a5,5d702953a49b9b274d7718d3e1d11eca,MIT-Khronos-old | ||
| 395 | 272dea2b67586002978254bc04648ab2,ea216f8e73afc6a62c197a783f12ea2c,MIT-Modern-Variant | ||
| 396 | 3ffdd0306405414588d867600cdd79f2,995eac9ef87f818acc85a617cae3c505,MIT-Wu | ||
| 397 | 0f358dd6677661d482934070c7eeaeec,1b07faa3e6bc37da8eaafa4cb8e02eb4,MIT-advertising | ||
| 398 | 837570c48d6e224a531b1c5cb31f6831,a83af35d24e8345619cec33e7909c86c,MIT-enna | ||
| 399 | 031c73abe1c92133bd0f02f41a6a5d11,b5e1a9ec68102001c88281d3a5e4d9d6,MIT-feh | ||
| 400 | a7c50bba311e4b09d48a526eedcef837,9e56ce99bf8947fbb0e932dabf9a0feb,MIT-open-group | ||
| 401 | 6a0fffc30c6eceeccaf346c1dc6abd90,00dccaf97d73308b84ebae69588892c8,MIT-testregex | ||
| 402 | ae098e6f49fc0720cbe27319dffe2f48,38adb0ba29e5fe703751e35bf3b3f27d,MITNFA | ||
| 403 | 463c2e5794b2f441e7f95face33e16f5,0237a20a33f53115dc0d0d59734904a7,MMIXware | ||
| 404 | 62b024ad4b594e88f24a034e38e9aede,3e875d5b00a960c5c02b8f7113b14f21,MPEG-SSG | ||
| 405 | 781b4a0e6dc50518d9b876a0877d22f1,255eb25fc840e4ad830d011f7482e990,MPL-1.0 | ||
| 406 | 1d38e87ed8d522c49f04e1efe0fab3ab,286c1572b85ed9d72ca197186e6432b6,MPL-1.1 | ||
| 407 | 815ca599c9df247a0c7f619bab123dad,7a8d6f143302141f49951cd709dd9120,MPL-2.0 | ||
| 408 | d266657003c8e2b02f66ac8bdd9a2d03,0c46cc29565c1dc91b4ffd3ff52de4e4,MPL-2.0-no-copyleft-exception | ||
| 409 | 4f9912faa1c88c40a29bd2809f60a827,62d4f17144c48571005861d8b6e3babf,MS-LPL | ||
| 410 | b9cbca4f1a399b0c17b3521736e67848,aa257edc58d2d332711fe025b51bec53,MS-PL | ||
| 411 | 3535ded4dbb8b9b8c08d529cfd963c83,26acec6d75a906b7355aa889e588ff70,MS-RL | ||
| 412 | 09c3ec64e4c518cd72657a2cb1e85095,db441307b31144afd10e5652bdb40a44,MTLL | ||
| 413 | 3082b840a28d09e16b50bee0de9ccb28,b34f8f5c992307b038634b57134e29d3,Mackerras-3-Clause | ||
| 414 | ae070b893d5d0d64355fe41e204250d3,5679609003e3370e65e4423dbd8568e4,Mackerras-3-Clause-acknowledgment | ||
| 415 | 430cb4ba3b3436686366675e95e88673,5e575086ff5c4ed9588ebf6786289060,MakeIndex | ||
| 416 | 1dc046ff04588295cd034dc8d8aa1c29,a5d3293ef8c03e04deefdef97df25ee4,Martin-Birgmeier | ||
| 417 | 1426c0b56aec1c7d0a56ac51a5e9299e,42c995ceedd53df416a9df9901f2abbe,McPhee-slideshow | ||
| 418 | 71d91b0f75ce79a75d3108a72bef8116,33205dd255fd6717a80fcba9c3d2a7e6,Minpack | ||
| 419 | 92710048faf09c7db6fbab0b5c68e722,4d8941b1a4876037eb67efdbf5ebd8cb,MirOS | ||
| 420 | 8f45290f66a01a2bd7d3c1a1bee379e5,2335e8b3dbf03716ec7d673e0da7ad79,Motosoto | ||
| 421 | 22c9d6c03512270a0c604dfbbe6c2fe1,871c4d513e90886c462f7fa61fd525f5,MulanPSL-1.0 | ||
| 422 | 74b1b7a7ee537a16390ed514498bf23c,b1cda2381467fa0f7d2eda841e8beab6,MulanPSL-2.0 | ||
| 423 | 91fdbe190a1f86c68e25bc9b1b1893ce,f41c017da81e6b06b1e45a9c7cbd6f98,Multics | ||
| 424 | fd1a6fb4c99f4f8f014b2c4aa2e0010a,af88f0bd68e822e8533635fba7b8b07a,Mup | ||
| 425 | 980c7c3833ef8c21d425cb30a71cf41e,c7625db8390483c97cf88a48cc63c79a,NAIST-2003 | ||
| 426 | 1a69b36c2473705eb993f4d259f7023a,c8b83d71e6d6c063e10768375ab9b7fc,NASA-1.3 | ||
| 427 | 0639f02ead7321f9b56065a4c82ab0dc,64cc9f22b5a4c87dee3e32ad1db8b9fe,NBPL-1.0 | ||
| 428 | 8dd4edfde7df98d9121a4863c39e80d8,aed33247718c6260dc8df3a1a28a34ef,NCBI-PD | ||
| 429 | 818e598c8efea97a0f3b1c1b106512f9,079bd358582e3e8d52a72cbb09f9e8bc,NCGL-UK-2.0 | ||
| 430 | 159ba93fd6e804f4b33403b703faef26,b6f755bf6795211e1a73ebb19f6437e3,NCL | ||
| 431 | 1b5fdec70ee13ad8a91667f16c1959d7,1fad5c4e03d39de7009fe66ff4a0f457,NCSA | ||
| 432 | eba216effbb501d5a27143374c96cec2,1e85789cc507736363423b6988ec6713,NGPL | ||
| 433 | e840fe304e3b95c4492a451e3eb6ebae,398205163ffe928edfe0d6229dd93e9d,NICTA-1.0 | ||
| 434 | e3cdd21422615e65cfb61d66efb6695b,7181344621ab66eb950bc3b8dd7a6623,NIST-PD | ||
| 435 | d4316699a62681192cd0a75a136e47bc,504f9bf061d442035ba6f45efc951673,NIST-PD-fallback | ||
| 436 | 0fda83722f4b845d0a9026ce1c3be556,869fb90ee76f6f74a3c64fc1150f9302,NIST-Software | ||
| 437 | da42cb2460f2c6eea098e6705ed1c103,0a5665a111253e2657d72a2afe00af80,NLOD-1.0 | ||
| 438 | 3d2da0636f9877a48662c3d180b642d7,35b1e7fccb90d4365e5a86ef9ac9b135,NLOD-2.0 | ||
| 439 | b05ce303130dcb84b2c437d439bedc2d,684c59c3ca8157b5b27aa6bff9ccaa58,NLPL | ||
| 440 | 470951e1489bb4c347db388f7202c8cc,e4a8f5cf1ec97c262a58169b8b019a61,NOSL | ||
| 441 | fb9ceca80dbcd24694c510c689a6e19a,aec044b7b12668bd9750acc438ab4dcb,NPL-1.0 | ||
| 442 | f9c017c062c1b02462efb915d9f2cb63,40f46c1f2cb553217e7a111cd759aca7,NPL-1.1 | ||
| 443 | 42f47bd574b2eb4a27f42dde3f85d0b2,737304afb49064c9211660f0fbee9809,NPOSL-3.0 | ||
| 444 | 4eec9c9b063500c9dab38ae621d0b2d6,9a87495c7e540b7e54ae83aa9ce34168,NRL | ||
| 445 | c661c75f283d2703878599ec5b178106,4c6b56242ad743f4b72b59eda8396389,NTIA-PD | ||
| 446 | 0926fd147301b2a65e45e21adb3a6f14,9a69d5a11c0d5051f525c1430f29bb40,NTP | ||
| 447 | 71be4bd600c03804e058629b45707e56,1405d91914c4591647360b3e42deca35,NTP-0 | ||
| 448 | 9803b6df768c3b9adea1260c48449bcd,c7a5d5f30e53388ea8b4f89a6a5005b8,Naumen | ||
| 449 | 2b7c132b054e26675ec8644159bfe90a,23cf192dc2d29c9825f0de07c245ac8e,Net-SNMP | ||
| 450 | 645ff84670453dc664c934a11b9fd001,384fcc45a17714cce879b62e7fbc9eaa,NetCDF | ||
| 451 | 7f208af1ee34d97c36ae4ba616d99b15,a01081fed8469acef866950bf69b0834,Newsletr | ||
| 452 | 1d63716e5a0d424380c8c275b38a684d,b59007c2ce90dc1d3f296193d5259f11,Nokia | ||
| 453 | c5aab02dae304462b39031effdbc3e5c,e7f5c6815874e0923413614aad2fc821,Noweb | ||
| 454 | 38534e9743a6e7d2e4d5127d8868e92b,fcd757b0f438e0885b14218a141e9611,O-UDA-1.0 | ||
| 455 | 2574c2cdf097d0fab1203762469ea2ee,30f6d1b17930ca095591fcc06ad07be9,OAR | ||
| 456 | 661853fdec2fe9c75df5e7019d349e8b,61775fd08ac4e3e02291d3a2f7813f78,OCCT-PL | ||
| 457 | 911d82bafafd8b8f2f65d02b6c5dad22,284f358286240566c57c0746d712f157,OCLC-2.0 | ||
| 458 | 3f2f9df7619f1e43eadba2b5c617542e,ec144f3f0d8414b6c40b332ab497a170,ODC-By-1.0 | ||
| 459 | 498d26a501c10739d57fca1c9d80bbc2,496db8abfc10a14cf61e62a3b763fd6e,ODbL-1.0 | ||
| 460 | c412607763e2c9576869d9a093d1541d,6c80cdbf0dbe4d9a8bd543e33724f348,OFFIS | ||
| 461 | 147016579566640a7c38f035cf962d40,956f71fa678c3002682d6b1761d1d119,OFL-1.0 | ||
| 462 | 147016579566640a7c38f035cf962d40,956f71fa678c3002682d6b1761d1d119,OFL-1.0-RFN | ||
| 463 | 147016579566640a7c38f035cf962d40,956f71fa678c3002682d6b1761d1d119,OFL-1.0-no-RFN | ||
| 464 | fac3a519e5e9eb96316656e0ca4f2b90,c5c06d912054460684f24d91cd18632a,OFL-1.1 | ||
| 465 | 2680fce30f17e5fed9bcebd9336e5b78,82d34fe1270488e4c3d2a72293a6b690,OFL-1.1-RFN | ||
| 466 | 2680fce30f17e5fed9bcebd9336e5b78,82d34fe1270488e4c3d2a72293a6b690,OFL-1.1-no-RFN | ||
| 467 | 92be1547ea59dfa6f5fa3eb511436611,1a8c364b472f01eb4800245eddc2bc04,OGC-1.0 | ||
| 468 | 6b7695daeb4ad458f48d002b1db4bb30,9976e0400318e1ba7ba393828628e448,OGDL-Taiwan-1.0 | ||
| 469 | 1186cebccc11532af57c2bc2e3a2de4a,9009d261f9b3a06e15360135950b6813,OGL-Canada-2.0 | ||
| 470 | 11478da101cc77bf8e09ff33b315c3c6,700246a719276212b6522d4b75d19d38,OGL-UK-1.0 | ||
| 471 | 5efb1ce72bf097f37048e2f1ad8d132c,9dbad9a6fe3304cbfbc65e34e53a1751,OGL-UK-2.0 | ||
| 472 | dbb49d86a7b9dd0868cf565a3cdd90bd,40b77d7b03a7fed9bedf693b506f44d4,OGL-UK-3.0 | ||
| 473 | c610791f6155b203309becfa6f6f3795,269071c94c9913659b010cf914a92d27,OGTSL | ||
| 474 | edf587adfe362e8571448b184e222baf,0348b1bb1566b51edab2286549b7f00f,OLDAP-1.1 | ||
| 475 | 009f8a570c2c8e46e505ce6907e4a6e0,9a9ee3414752003a5a47f98d9eda9f2b,OLDAP-1.2 | ||
| 476 | 3e11ab81fc86be2c56da7edcb522c967,fc7b247545dbbfbff7764fee57186f64,OLDAP-1.3 | ||
| 477 | da1851bbe489fa73c523fe36236086a2,2777fb9dc95f898cb2093a4f48267522,OLDAP-1.4 | ||
| 478 | 7afe16775d3dbf5b387812e43d12e235,91dc598c461f4e8ec58b3bda2080e466,OLDAP-2.0 | ||
| 479 | 9bc4bd6ef1047c3135cb0b38c17b5f1f,cfe602b3f2a4268b50724a9758acda54,OLDAP-2.0.1 | ||
| 480 | a297b240f382dcdad5bb563a6fa7c3c5,c8582ccaa7187894df11b4af65187d98,OLDAP-2.1 | ||
| 481 | b99c5ef67fc401e28669fc5d3fe2270e,bc574f37161c5f548a427848f3caf006,OLDAP-2.2 | ||
| 482 | 5eb5f8dea32c3a159c3a108c7cba0d59,48f9d7f741e391a9c7686ab3c18c15ce,OLDAP-2.2.1 | ||
| 483 | da4dd8d7a88833faa0c3253f951da0ec,9562a63fd2a4d029209e15c4d795477c,OLDAP-2.2.2 | ||
| 484 | 47f8ee5890ce16863a73c26ea20ea500,4436983adc031646c1067041a5170a4a,OLDAP-2.3 | ||
| 485 | ed1e505c4fc33fec82d32064c8aeb15b,51c760a7e3992978d221dd556b02efed,OLDAP-2.4 | ||
| 486 | 6f6d3079515dea35945b13250baf4eff,55b591a274d1af4930edcad092ab6d9a,OLDAP-2.5 | ||
| 487 | 1ec0cd6f3f76fe56633e150ff591eefe,3bd7a35a90bb960d3c84453f2a725945,OLDAP-2.6 | ||
| 488 | 2db9c02b79795b5997be787ab4e3b130,eb7e9dbf3d13428d80853ffabb54f04c,OLDAP-2.7 | ||
| 489 | bb28ada4fbb5c3f52c233899b2e410a5,62cc81470d2c909a1f142f595d2588d3,OLDAP-2.8 | ||
| 490 | 0ea211599981d34919e725ab3b7fb70e,a41f9334c1157898b5bddd5832867a34,OLFL-1.3 | ||
| 491 | a1cf4d4c2be36962b02896f7f49175f6,e9c142ba1f31a9fba550d43c657d537e,OML | ||
| 492 | acdf1e4398bd93dc137e271c50316324,875031f5496ce3613d6947d886409a3b,OPL-1.0 | ||
| 493 | bcf5928152ba0de1f2cde3e2d84c6e02,66754a9a53b8b0e4e3370b4dfb01d0a3,OPL-UK-3.0 | ||
| 494 | 99367d4750dbf0ae6cc74209ddd52f6d,2a228838eeed3f407c26fb079c2b53b7,OPUBL-1.0 | ||
| 495 | 233c45084b5126b70b8cddbe0852754b,4deaabfd6040e0280f64dc4c5ed74c2b,OSET-PL-2.1 | ||
| 496 | 42d04076301ef38862a32199ac00734c,39f43284d2ffbd8144f040f3ca1018b4,OSL-1.0 | ||
| 497 | 04ba39e3fcdbb1e46c78d56ebc24bcf1,4e53296759165a7e167694932efb0478,OSL-1.1 | ||
| 498 | 6c74c6bad0b7f7503f1b80a33c6d6079,c670fad4fb2b81f3c65de19dd5e439e9,OSL-2.0 | ||
| 499 | c8f36cbbff0b620fc60e775f65b478ac,c0af45d93daa7d5b7c0b07f589ea6e7d,OSL-2.1 | ||
| 500 | 438ec6d864bbb958a49df939a56511cf,65786c4f715c8a60fe3bc8a50af1f3d8,OSL-3.0 | ||
| 501 | 21840569278bd0abb97e907632c71391,b86f19ef734216aea23ee774cdec9ce2,OpenPBS-2.3 | ||
| 502 | 4eb1764f3e65fafa1a25057f9082f2ae,8dd050d5558743da537d1d70a8b4877f,OpenSSL | ||
| 503 | a2f51dd2badb478cfa5864e1c7971229,6090c35ed4c627f6ebf3352abf94e875,OpenSSL-standalone | ||
| 504 | af6d886f4117da60c562b07a4d1525a4,6bb7de83993e3aabd957f76f9ccad42a,OpenVision | ||
| 505 | 99861d2ee92af29a001caef7a90a4098,68a46aee72fe3edb156b6e8541219575,PADL | ||
| 506 | b3597d12946881e13cb3b548d1173851,e59545114390e59f615ec8618dc766e2,PD | ||
| 507 | 3d473a68d189d64108d78e13c464dd04,40a45da70b3e0fa01629ea47e79cea9d,PDDL-1.0 | ||
| 508 | a4f510523c0a44fd4335cbdf941adc9d,d56bb8e36249baa2e6b99a35d2ece7dd,PHP-3.0 | ||
| 509 | 3363e286b5882ec667a6ebd86e0d9d91,4a33a7e642e918e6bf52b3c216aaa7dd,PHP-3.01 | ||
| 510 | a742df783d74542def22bf228e19e878,b8a8ac37a7318e7831ae4e5b2379cb8a,PPL | ||
| 511 | 76c1502273262a5ebefb50dfb20d7c4f,7cbce15241d6de0c675b1e876b4efb0b,PSF-2.0 | ||
| 512 | 405086898d0a61076de2337982808055,e7a66d6dc2dcb0e6ab703ab6962fd14c,ParaTypeFFL-1.3 | ||
| 513 | 2a2abdb5818c49e694d97e402f5fc312,ec112146199cc17f6af8e10eea3ad326,Parity-6.0.0 | ||
| 514 | 914d6ca25a35f8c9ee454b52c4e91a3b,7ae19ad16bacb314460a57f3bcaa83ec,Parity-7.0.0 | ||
| 515 | 973fbf9f6e09fb6f164d2887dfb0fee6,aa56683d8da3248397510df9034a3f5e,Pixar | ||
| 516 | 1a4b0fc1c32cee1fe94f3751b6ccccf7,b4ab148fe7a709642afed226ab045dc6,Plexus | ||
| 517 | fa4f6eb8206bcfb6954542687e669418,cec397d544d2fc9c585e99943ed7da1f,PolyForm-Noncommercial-1.0.0 | ||
| 518 | e892ccb8a79a01d14b523fe6d902e1cd,fa94f027ec7ddaa56f8f8e19a5fe24cd,PolyForm-Small-Business-1.0.0 | ||
| 519 | a9c78964f52e27f4c01140a1a16da8e2,0ee2f2bd4e2f42da5d41d624e7ff4fc4,PostgreSQL | ||
| 520 | 0557f9d92cf58f2ccdd50f62f8ac0b28,d41d8cd98f00b204e9800998ecf8427e,Proprietary | ||
| 521 | a5c8025e305fb49e6d405769358851f6,49f9f7282f1fe4dcae4afe86f844b8a0,Python-2.0 | ||
| 522 | 8be2c269848c9d3043b76f2367c5c18a,eec6ca50c01adbf399d9a61a6bc48ea2,Python-2.0.1 | ||
| 523 | 824e3ef3ffe56fe63fd0be5fadca32c3,8dc47edb2437a9e5d46c1bcccf35da04,QPL-1.0 | ||
| 524 | c14a5cf549e88da791409f5753801956,310c16690bb6e426a02f32ebba66690f,QPL-1.0-INRIA-2004 | ||
| 525 | ead0c25f1f54544531a30118cf0f1c0a,58a0327d9d8785c3e524fd0ed853e5df,Qhull | ||
| 526 | 188c8d0bb34589c566accc8322a90f28,e606e4762cac6d50e89d078e745d3a86,RHeCos-1 | ||
| 527 | e1ca9c263e0eb0d888ee6679bf8e8b14,1af44811172d3804915d838e30103c1d,RHeCos-1.1 | ||
| 528 | c59681d408c615434d0a6e492a7bddc7,d29df77122c12775a429b31186d9ddcd,RPL-1.1 | ||
| 529 | 6e55b9520d6dadbecd149143b00455dc,6db57cb8ee9a94718fa91ebdb42f60b4,RPL-1.5 | ||
| 530 | 5caf8a85d16fc7c611f34630a69540a0,87203daef2a7af15fb8fab37e5e7b8fb,RPSL-1.0 | ||
| 531 | 9342e66a3fb8ddeebe449a85366f4acc,e3555909e0f98b734a5f3d12e7d06ea9,RSA-MD | ||
| 532 | 4e467e07f5ace155ec63e5c9b1f0ecd1,0e8aeecc25c085da3264d7eb5b9ad9b5,RSCPL | ||
| 533 | d20ec9a5ed8bbd938bad4415b18f5596,0e5bb85604d88281e599f721d1a5a1c9,Rdisc | ||
| 534 | 105fc57d3f4d3122db32912f3e6107d0,8c29e44b4e22dbd92263adee7c429d3a,Ruby | ||
| 535 | 9aaa46b47300ef46019f32aa0f712863,8d60c1af906ce8087bbd9dd16d59b74a,Ruby-pty | ||
| 536 | 81ff49c3141b3ab7cd5e5ae49ecbc6a6,e95253f180e6e5214a894d15b261bea0,SAX-PD | ||
| 537 | 512c3addc6134e0d7f52d401f46c5da3,a5217487c4f69b0a9071a3f6ee371de4,SAX-PD-2.0 | ||
| 538 | 116ebacb8f62900f2668fc68520b23da,83fc1994aa37501447b4aa6566deb605,SCEA | ||
| 539 | 269cdab4af6748677acce51d9aa13552,24f3435c81336185096b07ff97161689,SGI-1 | ||
| 540 | 485f57c05469db83127ef16446766d4f,477969ebae2231d0a50c4315e0b31799,SGI-B-1.0 | ||
| 541 | 97a5de7e45c7791fed51f0430da5e021,9dbc24f4bb94462b90e04e8cd634d678,SGI-B-1.1 | ||
| 542 | 5f5dd7bd973dff1594131b1e9c7981f1,916d4009aa80c7ac430206c93b81e3f2,SGI-B-2.0 | ||
| 543 | ad615b66c99e4c238af0b584f7afcff0,24f3435c81336185096b07ff97161689,SGI-OpenGL | ||
| 544 | cfc797903eced5f2dbc18b4ca5c661ca,f158d8930d5aaa7c45aa02e5fe7d9752,SGP4 | ||
| 545 | 70f2c3d8942e777809af967d95c66876,2cb7aa611d5802bdf20459612a9e3dc6,SHL-0.5 | ||
| 546 | c29f611ea2c44bddf31d68a885cc5d9b,3fc3ce0e3f383601175b9ece8991541d,SHL-0.51 | ||
| 547 | fded06bff75eb4a2899bd051e2e128f5,3c2d54a5545454317b12dc598840124c,SISSL | ||
| 548 | aa229f2c4e4966e222a3f04ff7a8083c,af9237b3cc8d0140afdd1b216be19e10,SISSL-1.2 | ||
| 549 | c003a0afa50574c0e5d8ef15db47f485,cfc5c171aaaa1b15bae2091431293376,SL | ||
| 550 | 785f3688caca0adb413cd39878d0411f,e6f0bbe09a360be66a8f4c7a8cc5b6ca,SMAIL-GPL | ||
| 551 | 0a05801c8261ddd5a92e1d9b764d5ad3,57279658cff1c854b4dcc351db8911e8,SMLNJ | ||
| 552 | cde69c935d39daae103c6ca3bd5f759d,c55513ec50471ff59e7c5094d18b961a,SMPPL | ||
| 553 | e0a34c06921abf8464e4e60b7097fc64,fcc142f831cd339a48df42832e750bf7,SNIA | ||
| 554 | 7bd50a8db20e7709b9d8b2b5cd7a976a,175baeadc4129618349c094cad51f656,SOFA | ||
| 555 | ecfc027911d191ac143b128048e03420,61b62ce91f6b85009f42c32a933d16a2,SPL-1.0 | ||
| 556 | 3af632aae8cf01feb6ce2ed44bb7ed2e,56532bf496acc335f976de368efa7abd,SSH-OpenSSH | ||
| 557 | b73783010a430cadaabdc8ec0c0748f8,69f1b33406f2d92decf5956fdbd638d6,SSH-short | ||
| 558 | 56e74f394dd55a69ce0b057350fa5304,7f7ef97af947beb41fa9ab12e57f8f93,SSLeay-standalone | ||
| 559 | 684260b3c3c7bf281830da24273d7401,04807169fce241fe8dda04adc443b42b,SSPL-1.0 | ||
| 560 | f17a4211b3230b802f938ab9501621da,360efa92bc80dd9626c69329c826b575,SUL-1.0 | ||
| 561 | e332583a335d1c483a9a765eda62ce51,01b2a4f570834a8b51d67174a689832c,SWL | ||
| 562 | d8cb48d540d878b981f2f6b8c09f8107,8a411c74a4ab26891711e54cb8ef8852,Saxpath | ||
| 563 | dfeb820efcbad7d8e6989cb325cb248d,2443746cf43e547f1583f312dc61bf39,SchemeReport | ||
| 564 | 8037c42e05a5d4bfce06a44729fb6f1a,0d84f0dcecbbf49629343abd425d6302,Sendmail | ||
| 565 | 9e4f9cb55403f300a83fb063d1bf1833,3ef30ef6c7f915f6e3654db4fbe185c6,Sendmail-8.23 | ||
| 566 | fdf91f1d73bf4ec43ffdf7ad17fe94c5,f400482ec76bc2156403267812ea936e,Sendmail-Open-Source-1.1 | ||
| 567 | 4867a4ecc3b7a760c1e7808a34a58587,56ff0af4b830578ed24ac0cb1dd90cdf,SimPL-2.0 | ||
| 568 | 15fb3db10a51d0e9ab512a93c9f62925,0f11a1d66eed5c430f1ed0e3b0136b42,Simple-2.0 | ||
| 569 | 1cbb64231c94198653282f3ccab88ffb,059330d234201d2a4b2d1b738c8e1469,Sleepycat | ||
| 570 | 177c45ca43174182b737695c6e52155f,660c269baa9d03cfa328507b5af52a45,Soundex | ||
| 571 | 97ba797de74f88a17676473fab224843,46ca8e5422d3b7b20ae0160864697b64,Spencer-86 | ||
| 572 | 0e15cb5da9d4f3d5fa9cfa353c837150,c9699cba21831920edefc06fd6989400,Spencer-94 | ||
| 573 | ddb159145fcbc01a88734aab1cb59174,52de446c91fed673521a04fbb2a90e96,Spencer-99 | ||
| 574 | 40588981e1072d3175e79de8e95d3fb0,6867e4c02d47fd828e5b968ab7f36dd8,SugarCRM-1 | ||
| 575 | 6c0ff3dae045b3a23cc028a090a7e5b8,d7a07cab76bcd7eea3280665947dd1dc,SugarCRM-1.1.3 | ||
| 576 | c5e1a3a8067021f96be2ccb79e3459a7,b15d93816251f22593cd6eb6eeabe0ac,Sun-PPP | ||
| 577 | 79a54221d7746e702773f0b6ebebef59,d7a2fdabc12a2ee0027e08827993eff9,Sun-PPP-2000 | ||
| 578 | 496178eb098fe34dcf2e5226de2933cc,d77f34e7d946740c87c9ba032ab7492c,SunPro | ||
| 579 | fecccd8da2021ad4a4f54e86236452f2,0adcd10fd66b3342b4aa329e5d90be19,Symlinks | ||
| 580 | 8fce5ee68aa617ceaffa5fe6aa788492,68590670f8b00607e54f6530adf30cc5,TAPR-OHL-1.0 | ||
| 581 | 5f7b23ac10d8f7cde16737bc896bb6fb,7abe1bfad7b02e80b9d3459ad4b76c7d,TCL | ||
| 582 | 83b1f59c3c52689f5652193e0cd5b1cf,a350ee7368673c19e2dbe602475bf205,TCP-wrappers | ||
| 583 | 1be547628b0c0cf4022622da86257bce,285e050ac62fa1ec1a9ad97db7c3a82a,TGPPL-1.0 | ||
| 584 | 26811b5196ae54d9ac179032300a411e,3187b61256e142f83efa506a030b72f0,TMate | ||
| 585 | 4c6793f966f41313b86a41f9322ee887,c7e90419a67270dcb5adba0f022b02a4,TORQUE-1.1 | ||
| 586 | d91547d52af2576c8050a25f4a8cf296,e3649062502ed323eae700825dd7e8a1,TOSL | ||
| 587 | beb969cfda4b6aeb68e2593b4ee7fd1a,6e1f5eedd2966c256e160d9fa3f49702,TPDL | ||
| 588 | b7b790a5ab275fdfba45d3cd0015ba90,5d23d55a60f44af9868ea5ae0b10a5e8,TPL-1.0 | ||
| 589 | 914672cc1a5dfedf2d03c57103b9d90a,c083506793bebd54fd2d308d48825e48,TTWL | ||
| 590 | a09524fbcb4492566d267eb7a2e51dba,30ebde21ca8106eab1275b4a18f897ca,TTYP0 | ||
| 591 | 919f113fcb44c5df8b732d335ebb2797,0d5c9d71df8966b26bed102b4bc7a87d,TU-Berlin-1.0 | ||
| 592 | db8d48938582bc7b10c608728da229d1,8387ce0bdb75baf0759248dab06472a5,TU-Berlin-2.0 | ||
| 593 | 8b2cac5e826b2ba6648efa311c1b976a,2f6ee08d9d977a4291f9c825f507de9a,TermReadKey | ||
| 594 | 812fa71c163a43fc2e72e5607f66743e,6f545babeeb59324d1d98319284baa01,ThirdEye | ||
| 595 | 0812f8cbc63a5d6e49171080528f0b7a,de9cae2717dfcbf8dd7d19ecbf80d06a,TrustedQSL | ||
| 596 | 556bf12c00de0a86f7ea8a6c553e648c,cb6e062b5ffcb133dcab427dfb6f9bac,UCAR | ||
| 597 | 6363734dbce8fd58d7c497ae65b16cdf,a3ea42560c645e3803e67a48e6ebfacf,UCB | ||
| 598 | 0ce1025be0c66b99b205fe41dc9a623a,3343b2387459d7cdfdcfbe257706d123,UCL-1.0 | ||
| 599 | 162895d33fd19ceb38742c7aa1d23253,74f157fce158966f1f964de7c89467b7,UMich-Merit | ||
| 600 | 8189d67787b0c83874474b40ecec6262,ccf6b8a878dc3bdaf510fc8aa0f3da0f,UPL-1.0 | ||
| 601 | 1402eb536be28a7f8efc4ad70d31650a,a55cd5644056d33549f5f40616964b73,URT-RLE | ||
| 602 | 325a1a9029112a2405e743c7f816427b,e5a547a862bdbf75d41a25167555cdac,Ubuntu-font-1.0 | ||
| 603 | 548c7e11b6a9486e064814cf1c708e5b,c190ea42bb0b4dd088e2767c2317bfd5,Unicode-3.0 | ||
| 604 | 0cf627bfee18ca2ff60e2988ac0feab0,a5c0362e7ae64779bd6258c1fdf9bfd0,Unicode-DFS-2015 | ||
| 605 | 907371994d651afe53e98adc27824669,304930a2d54dd38028d513e52d9b8e93,Unicode-DFS-2016 | ||
| 606 | 666362dc5dba74f477af0f44fb85bd22,3727b08671585f198cf22357c531fd5c,Unicode-TOU | ||
| 607 | 7d7d190ed3392030968ff6df8ac2d8f3,3b87cf93a1b2b0e0f44f0c7e5d24684f,UnixCrypt | ||
| 608 | 7246f848faa4e9c9fc0ea91122d6e680,ddc18131d6748374f0f35a621c245b49,Unlicense | ||
| 609 | cf57633109a7eb219c619567dc61e6e3,258334b7f4a998970b221c514c4749c7,Unlicense-libtelnet | ||
| 610 | 742d768a9074ca92905222e6e1490bd4,0b1c173586d60ca6038206752335bc6f,Unlicense-libwhirlpool | ||
| 611 | d97a6df8bcb5a3ffd6932e9ad9e3f6b6,711538e1db373d2dc8a17f0441a6b504,VOSTROM | ||
| 612 | 5569e16f406c52cda34c6707068fd2da,94b151cdf8db5791e7b051da538fb01e,VSL-1.0 | ||
| 613 | 676d28582e2dca824e7e309a9865eeb1,69bc575ac94ecd5d7b713110c86300db,Vim | ||
| 614 | 4b1d0384b406508a63e51f7c69687700,2acd38e47489dc47bf5740438c7f3063,W3C | ||
| 615 | 8e1670967a54b3eb1c60afea27ad2837,1ce603391ed10773b1e3765ff78ab232,W3C-19980720 | ||
| 616 | 9ff23a699fca546a380855dd40d12d4f,714b5db7e02b76c0c01518e854e06734,W3C-20150513 | ||
| 617 | 7993e3336259bdb618ad5a1afc872165,51f9570ff32571fc0a443102285c5e33,WTFPL | ||
| 618 | 9cd2300481960fbf3551fee571e0df12,470c88534a79e1a705309aad3aa400a5,WXwindows | ||
| 619 | f84539e411677753163564553d0314f4,b780b12627c7975a418d3aa1218ceb49,Watcom-1.0 | ||
| 620 | bf6a2f5cba0ff0204ace681719b582e9,b450ff15de997bb5669f2d24491825fd,Widget-Workshop | ||
| 621 | 58d6eb73a04d4011a4dfdded022807e9,f174faaef2b124b6c1250ecb0c37ee16,Wsuipa | ||
| 622 | 87f08485cf6ba3c63a00eda8ecba7f1d,b45f72052756cd307ce6ba872b785eca,X11 | ||
| 623 | c2e3edd9db5f153aea61684e5b37cfbf,165ac1e8caf2ef3eeaf005491be4cc41,X11-distribute-modifications-variant | ||
| 624 | 9f4e3e1a80d1e82f127d109fa4805c66,96e33e29fceea65b19c73ed2f4120181,X11-swapped | ||
| 625 | a7f2ef6cf86decfa93ef9f759b59d566,05ee2828345013f055526a766ed6d2fa,XFree86-1.0 | ||
| 626 | eabd0ee63562be8b63dcf842f2ff7932,b8c4ae332dced1096574e73c1b979a3d,XFree86-1.1 | ||
| 627 | a6eeeed43d498c22a835382533356462,9aa82f0382f331b25b8174d489be42ec,XSL | ||
| 628 | 89cdf2938f9fba06ef01be9d75801a54,539b4296e726bf27fd6014ce94adb939,XSkat | ||
| 629 | afd6ce4aa04fdc346e5b3c6e634bd75c,8baca7df3c92fcee1e34874659db5611,Xdebug-1.03 | ||
| 630 | a3bc2710d63fa2d3b31618271833da3d,a067f7bee147ac22bc8c18d1398d2ddb,Xerox | ||
| 631 | a8ef97bc6fedc2b816a4bd3207cbb46d,616c2dac252df4b20c67d8da04d53caa,Xfig | ||
| 632 | 1d7133ce407ae41a40678ce53fe146cc,d698f7a4c891a71ffb35cb8526c6aa9a,Xnet | ||
| 633 | f89765972ccf05ec2c6727775bbd35e6,38b6cc7f7f20031beb631eb2d1dcdc34,YPL-1.0 | ||
| 634 | f4abd544e57b717e3211a8f71fb78051,b64449fd75b91c7d8d6d660af6ad14c9,YPL-1.1 | ||
| 635 | 1773e417ed280d37fb3d4ecadb61d2c4,b1b030703b19f3a6623ef902ae917026,ZPL-1.1 | ||
| 636 | 292e8c58674d178944fa3c553a574ab3,4717ee4f01eb9b3fdba8a26e581e5acc,ZPL-2.0 | ||
| 637 | 5166e505dd5e2073ab1f97b1a6b31755,23537d8718f7272035c42e7d1252ae98,ZPL-2.1 | ||
| 638 | d7f86b208ceac65fdbe19b2b9fcf4b28,49a13756a1f1837270d2ac563da967d3,Zed | ||
| 639 | 47e13823470b439985e7fa80cc85c6b5,b1330e9ebd1acfb5a815acf766f3def6,Zeeff | ||
| 640 | 1862e5c7c0a6fc7198e4e11f1d58a8ed,3259a4952ae58ea6e6bc012c2ca5be29,Zend-2.0 | ||
| 641 | fe2ad80d298893f7c3958dc8cd5560b2,dc9897ce050c3b3322ec5ca7d30ce431,Zimbra-1.3 | ||
| 642 | 1d4b5ff798479b5b920b5a2d19a65efd,c7351735a3495e187b4c9e0b3a6cf6ca,Zimbra-1.4 | ||
| 643 | 87f239f408daca8a157858e192597633,54c4ac0824d6ba7e86f0b7bfd1ac18df,Zlib | ||
| 644 | fa23c7c35cf60c445d692b5f2b9bebb4,f4b560e7179176736751c1315622239e,any-OSI | ||
| 645 | 2e3ab8ad22a14baf7f2cab05491e90df,041aee3e6d508e2f06b3cea232a0e654,any-OSI-perl-modules | ||
| 646 | 932d525edeb2c77749ad6e52cbaeee78,96beca5c7a6f235808dc4aba12347722,bcrypt-Solar-Designer | ||
| 647 | d5407b61870d6dc19d0bdc04ae4cc654,d8cad04905f692aed0b29aca3e83472e,blessing | ||
| 648 | 452e1b423688222dcfc3cb9462c92902,b2b9a3d407940d88d2bcc5e7fd423c46,bzip2-1.0.4 | ||
| 649 | ac3866fa352ea7b071a9e93172e66dd5,55b9555f2b7511628387c79696346c45,bzip2-1.0.5 | ||
| 650 | 841c5495611ae95b13e80fa4a0627333,857893777f97291378fd06dffa465401,bzip2-1.0.6 | ||
| 651 | ea85d39f14acb58cd6aaa3f2acca1ae7,146a15645c6ae9d856e1d0150e54f7d6,check-cvs | ||
| 652 | 84745a13ba01ae1b167be3ab2140d6c1,3baa9ccec750a8af7da86a36d610d454,checkmk | ||
| 653 | 8743a2c359037d4d329a31e79eabeffe,79a4d3a605479f92b18359dd5c3c19c1,copyleft-next-0.3.0 | ||
| 654 | 963c6a9e5347d93674eda37494dee7f8,8bfb8ae9e5164b7fb0518487928c1226,copyleft-next-0.3.1 | ||
| 655 | f7adb1397db248527ffed14d947e445c,e927d8f7ba623c521404737eea89cee5,curl | ||
| 656 | 4f7e96b3094e80e66b53359a8342c7f8,e7877095b81f07f56437c387ce9d79fe,cve-tou | ||
| 657 | 7726eda4b16466f32b70b16bfdb5eb0a,a074419f000fb52c1903f2bcb969b46c,diffmark | ||
| 658 | be6fc1d823096aae1cf8ef94b3993684,962022e6afd1efc211de4a546d2babbc,dtoa | ||
| 659 | b0566961d94a087aad56740181a35527,fe0f64c32d5cf023cc4b70d77ba401e1,dvipdfm | ||
| 660 | 8c3ea41d02fa9c9253c692351e5940e7,57889afa060098497c6ed55d716d57a1,eCos-2.0 | ||
| 661 | 1d1e8bc7e9a4c17f74f873850b116618,a0531496681c23f1049f467da1d12308,eGenix | ||
| 662 | 7cbd681f5f0006d6611ac0ebb9ef1816,de29885911779edc8d7bc9b80db20663,etalab-2.0 | ||
| 663 | 1229543e58da3aa29640175d8ca83708,099856300d10b40a8ae99d741f30cd09,fwlw | ||
| 664 | 0e617697318e3f050743deb4b9b817da,3aa6d4a31d3f3efed7fc2fbdd84e1e30,gSOAP-1 | ||
| 665 | 530c4ffdf84728fd9a65f868ad4ea7ba,0d9fdf1c0bdddd82518f8a9f84c36ddd,gSOAP-1.3b | ||
| 666 | 2b3268bea8a42f8709165b74ceec4e5e,c7c8bb01f857cf64a834cc4be270a0f4,generic-xts | ||
| 667 | 62bdcd9066e57359cd473e6b7cf69bd3,a9c439da80f7bc78603e1a2fdea6c246,gnuplot | ||
| 668 | 4ca4cbd038f22426bb727ae95d96ba2a,dc3651e0ba376a5b47144c24d9f31646,gtkbook | ||
| 669 | 910a8a42c962d238619c75fdb78bdb24,94029bef242b1756062d249fb6f551a5,hdparm | ||
| 670 | bf8e6fec4cb56805c785ffff285cd21f,5ef6c94654dfd428bcd3f9c9c4182846,iMatix | ||
| 671 | 1644bdf53b9cadfd00f3d6ba15d2f545,000295cba6d64a343fa634e19c5b918d,jove | ||
| 672 | 262530e5f891393eebc9d07985d53069,64ef8758829e73955cf90b219d3bfdcc,libpng-1.6.35 | ||
| 673 | 9a1fb0fb6574c976ad51dfe77a0b89a3,1e9b7704d6bf72ab4d614ae76f7a8229,libpng-2.0 | ||
| 674 | 84b4d2c6ef954a2d4081e775a270d0d0,3aed74ef626d859f44cfe6987e28a04c,libselinux-1.0 | ||
| 675 | b99383975855adc28712577c9cd56485,5dd33ac6c9b110cadd0c990592c7f88e,libtiff | ||
| 676 | fb531b96a550524e6a1d48b47aef72ff,b92fcc0c7448f2e19478b4a28ba5c8a5,libutil-David-Nugent | ||
| 677 | a48ac97a8550eff12395a2c0d6151510,1cbd5dda4c51217dcf2593cceab59ce3,lsof | ||
| 678 | 593383ab37318cb9c75643ca3e97f559,f7608c1f0f4a4ea415c25e8e53ecc470,magaz | ||
| 679 | 5efe0bed4acb0678f1a1f5fd07ae5293,a6bd6d8635ae64a314bca301427314f0,mailprio | ||
| 680 | ad44af994f0cb873fd44f7a856acc853,ee9c6a714194739a34edfea11b57aa6d,man2html | ||
| 681 | da4ff3fe2e916d13df8a0b14de6388c2,3f2f9d00bd7b898edd31f8096b9beff6,metamail | ||
| 682 | a543f980b9fb80af227a3fa03c241905,df10b60c029462b2ded6858e3e197845,mpi-permissive | ||
| 683 | f30403bda2a18f780f897079cd662d57,3046c3d3920a545e68856f49fcd53c52,mpich2 | ||
| 684 | 2652a6ac3cde957b21368aa25b1a576e,183500e9955e364fef6a25c3b277abef,mplus | ||
| 685 | eaf9fb42ed6abba6bdc21715b8917b4d,9977302a1d5a1a5d64185965820699a5,ngrep | ||
| 686 | 548a9d1db10cc0a84810c313a0e9266f,ecbc678102cf1a2d61cb21006956e17a,pkgconf | ||
| 687 | e14886beeaa5ab2e4c00b878baf40ce2,b1ab7faf11a78808cb4e2ad833bd0b1f,pnmstitch | ||
| 688 | 512a10c9665b4efb9a18d0591d0d2295,b9fe28fad09b7c8c4aa7e08ac667deac,psfrag | ||
| 689 | 29046009c1f269661e7b74196fb8f6a0,81f1bbaa03a54120cced4dd994e6b33e,psutils | ||
| 690 | 782dd6656b46553a0e38348499af3767,dc12176d21fb329f5c30c989f7377561,python-ldap | ||
| 691 | 4e5d572d355f0baae973d1310e8e6a61,3017374c8c99e54706b4048868292d6c,radvd | ||
| 692 | ae60d0d87ae6c850a95fa29d55a70fde,b8dca745a483757c28e03af215c4e3ad,snprintf | ||
| 693 | 96f1b00888f013ce243609e19aeb8c5d,06072a97f481fdfb0a8c36e3636a6698,softSurfer | ||
| 694 | b195ba35061e1e01334392047ccb0da5,9447b52005aad52ca2e210001807f42e,ssh-keyscan | ||
| 695 | a96f3252d1c7fbb544b2ff8d228c8003,242c5479dd98eefecfec4d9415be5d36,swrule | ||
| 696 | 9a10f2bb34f06910a4c70916c9eac9b7,556b686b959bb8b8a9ed27eaa9c3fc8c,threeparttable | ||
| 697 | 6c33c3447b7881c3014750de6da3e896,2016e16a5f4bfb54f64f2f7586c02ef5,ulem | ||
| 698 | 9475885294e17c0cc0067820d042792e,d285c1751e33a2766d3efd0dc86b1dc7,unfs3 | ||
| 699 | 741f8e7f6c137991b5753284d52e855e,aadb0e8bf5e30a82d203b151dfda00dd,w3m | ||
| 700 | 255e0b146f0de41a5845a093a98e12b1,8e91d527b31c7e66fe3fb31549ff9811,wwl | ||
| 701 | 2f1142c57bde236bb44607b0207636a9,8fcf095dd512fdffd1198ab597089112,xinetd | ||
| 702 | 198b03cbacc6a6d98e82baa0b589daa9,7eebfa2414401417a986930f81d82122,xkeyboard-config-Zinoviev | ||
| 703 | 10b126d9261b563f2dfb8edf14db9876,ed0b21d166e2bc93fcbff3be1adfe0b5,xlock | ||
| 704 | 47ed22fa8e5b1ca0cc42ea9c1c1f3aee,4d443e8b2516b6c0d36849888d029844,xpp | ||
| 705 | a9a8ccd7329608692e82ffeeb8e48257,fafdeee0fe31adf25821fb08ea790702,xzoom | ||
| 706 | c76c64e2cf99efcfb5e2b26aa86b12e6,0d63a6879f22613579185f88d3418f99,zlib-acknowledgement | ||
diff --git a/scripts/generate-license-hashes.py b/scripts/generate-license-hashes.py new file mode 100755 index 00000000..b5601b2e --- /dev/null +++ b/scripts/generate-license-hashes.py | |||
| @@ -0,0 +1,119 @@ | |||
| 1 | #!/usr/bin/env python3 | ||
| 2 | # SPDX-License-Identifier: GPL-2.0-only | ||
| 3 | # | ||
| 4 | # Generate license-hashes.csv from OE-core's common-licenses directory. | ||
| 5 | # | ||
| 6 | # Usage: | ||
| 7 | # python3 generate-license-hashes.py /path/to/meta/files/common-licenses | ||
| 8 | # | ||
| 9 | # Output: CSV to stdout with columns: md5,crunched_md5,spdx_id | ||
| 10 | # Redirect to scripts/data/license-hashes.csv to update the bundled database. | ||
| 11 | |||
| 12 | import hashlib | ||
| 13 | import os | ||
| 14 | import re | ||
| 15 | import sys | ||
| 16 | |||
| 17 | |||
| 18 | def squashspaces(s): | ||
| 19 | return re.sub(r"\s+", " ", s).strip() | ||
| 20 | |||
| 21 | |||
| 22 | def crunch_license(licfile): | ||
| 23 | """ | ||
| 24 | Normalize license text by removing non-material content, then compute MD5. | ||
| 25 | Same algorithm as OE-core's oe/license_finder.py _crunch_license(). | ||
| 26 | """ | ||
| 27 | license_title_re = re.compile( | ||
| 28 | r'^#*\(? *(This is )?([Tt]he )?.{0,15} ?[Ll]icen[sc]e( \(.{1,10}\))?\)?[:\.]? ?#*$') | ||
| 29 | license_statement_re = re.compile( | ||
| 30 | r'^((This (project|software)|.{1,10}) is( free software)? (released|licen[sc]ed)' | ||
| 31 | r'|(Released|Licen[cs]ed)) under the .{1,10} [Ll]icen[sc]e:?$') | ||
| 32 | copyright_re = re.compile( | ||
| 33 | r'^ *[#\*]* *(Modified work |MIT LICENSED )?Copyright ?(\([cC]\))? .*$') | ||
| 34 | disclaimer_re = re.compile(r'^ *\*? ?All [Rr]ights [Rr]eserved\.$') | ||
| 35 | email_re = re.compile(r'^.*<[\w\.-]*@[\w\.\-]*>$') | ||
| 36 | header_re = re.compile(r'^(\/\**!?)? ?[\-=\*]* ?(\*\/)?$') | ||
| 37 | tag_re = re.compile(r'^ *@?\(?([Ll]icense|MIT)\)?$') | ||
| 38 | url_re = re.compile(r'^ *[#\*]* *https?:\/\/[\w\.\/\-]+$') | ||
| 39 | |||
| 40 | lictext = [] | ||
| 41 | with open(licfile, 'r', errors='surrogateescape') as f: | ||
| 42 | for line in f: | ||
| 43 | if copyright_re.match(line): | ||
| 44 | continue | ||
| 45 | if disclaimer_re.match(line): | ||
| 46 | continue | ||
| 47 | if email_re.match(line): | ||
| 48 | continue | ||
| 49 | if header_re.match(line): | ||
| 50 | continue | ||
| 51 | if tag_re.match(line): | ||
| 52 | continue | ||
| 53 | if url_re.match(line): | ||
| 54 | continue | ||
| 55 | if license_title_re.match(line): | ||
| 56 | continue | ||
| 57 | if license_statement_re.match(line): | ||
| 58 | continue | ||
| 59 | line = line.replace('*', '').replace('#', '') | ||
| 60 | line = line.replace('sub-license', 'sublicense') | ||
| 61 | line = squashspaces(line) | ||
| 62 | line = (line.replace(u"\u2018", "'").replace(u"\u2019", "'") | ||
| 63 | .replace(u"\u201c", "'").replace(u"\u201d", "'") | ||
| 64 | .replace('"', "'").replace('`', "'")) | ||
| 65 | line = line.replace("{", "[").replace("}", "]") | ||
| 66 | if line: | ||
| 67 | lictext.append(line) | ||
| 68 | |||
| 69 | m = hashlib.md5() | ||
| 70 | try: | ||
| 71 | m.update(' '.join(lictext).encode('utf-8')) | ||
| 72 | return m.hexdigest() | ||
| 73 | except UnicodeEncodeError: | ||
| 74 | return None | ||
| 75 | |||
| 76 | |||
| 77 | def md5_file(path): | ||
| 78 | m = hashlib.md5() | ||
| 79 | with open(path, 'rb') as f: | ||
| 80 | for chunk in iter(lambda: f.read(8192), b''): | ||
| 81 | m.update(chunk) | ||
| 82 | return m.hexdigest() | ||
| 83 | |||
| 84 | |||
| 85 | def generate_hashes(common_license_dir): | ||
| 86 | """Generate CSV lines from a common-licenses directory.""" | ||
| 87 | entries = [] | ||
| 88 | for fn in sorted(os.listdir(common_license_dir)): | ||
| 89 | path = os.path.join(common_license_dir, fn) | ||
| 90 | if not os.path.isfile(path): | ||
| 91 | continue | ||
| 92 | exact_md5 = md5_file(path) | ||
| 93 | crunched_md5 = crunch_license(path) or '' | ||
| 94 | entries.append((exact_md5, crunched_md5, fn)) | ||
| 95 | return entries | ||
| 96 | |||
| 97 | |||
| 98 | def main(): | ||
| 99 | if len(sys.argv) != 2: | ||
| 100 | print(f"Usage: {sys.argv[0]} <common-licenses-dir>", file=sys.stderr) | ||
| 101 | print(f" Generates license-hashes.csv to stdout", file=sys.stderr) | ||
| 102 | sys.exit(1) | ||
| 103 | |||
| 104 | common_license_dir = sys.argv[1] | ||
| 105 | if not os.path.isdir(common_license_dir): | ||
| 106 | print(f"Error: not a directory: {common_license_dir}", file=sys.stderr) | ||
| 107 | sys.exit(1) | ||
| 108 | |||
| 109 | entries = generate_hashes(common_license_dir) | ||
| 110 | print("# Generated by generate-license-hashes.py from OE-core common-licenses") | ||
| 111 | print("# Format: exact_md5,crunched_md5,spdx_id") | ||
| 112 | for exact_md5, crunched_md5, spdx_id in entries: | ||
| 113 | print(f"{exact_md5},{crunched_md5},{spdx_id}") | ||
| 114 | |||
| 115 | print(f"# Generated {len(entries)} entries", file=sys.stderr) | ||
| 116 | |||
| 117 | |||
| 118 | if __name__ == "__main__": | ||
| 119 | main() | ||
diff --git a/scripts/oe-go-mod-fetcher.py b/scripts/oe-go-mod-fetcher.py index 1be803b5..c083b156 100755 --- a/scripts/oe-go-mod-fetcher.py +++ b/scripts/oe-go-mod-fetcher.py | |||
| @@ -55,6 +55,8 @@ CHANGELOG v3.0.0: | |||
| 55 | 55 | ||
| 56 | import argparse | 56 | import argparse |
| 57 | import concurrent.futures | 57 | import concurrent.futures |
| 58 | import csv | ||
| 59 | import fnmatch | ||
| 58 | import hashlib | 60 | import hashlib |
| 59 | import io | 61 | import io |
| 60 | import json | 62 | import json |
| @@ -66,6 +68,7 @@ import sys | |||
| 66 | import tempfile | 68 | import tempfile |
| 67 | import textwrap | 69 | import textwrap |
| 68 | import threading | 70 | import threading |
| 71 | import zipfile | ||
| 69 | from pathlib import Path | 72 | from pathlib import Path |
| 70 | from typing import Dict, List, Optional, Set, Tuple | 73 | from typing import Dict, List, Optional, Set, Tuple |
| 71 | from datetime import datetime, timedelta, timezone | 74 | from datetime import datetime, timedelta, timezone |
| @@ -2103,6 +2106,36 @@ def _execute(args: argparse.Namespace) -> int: | |||
| 2103 | except Exception as e: | 2106 | except Exception as e: |
| 2104 | print(f"\n⚠️ Could not write corrected JSON: {e}") | 2107 | print(f"\n⚠️ Could not write corrected JSON: {e}") |
| 2105 | 2108 | ||
| 2109 | # License scanning (after successful generation) | ||
| 2110 | if args.scan_licenses and output_dir and not args.validate: | ||
| 2111 | print("\n" + "=" * 70) | ||
| 2112 | print("LICENSE SCANNING") | ||
| 2113 | print("=" * 70) | ||
| 2114 | |||
| 2115 | # Determine discovery cache location | ||
| 2116 | disc_cache = args.discovery_cache | ||
| 2117 | if not disc_cache and args.gomodcache: | ||
| 2118 | # gomodcache IS the discovery cache root | ||
| 2119 | disc_cache = args.gomodcache | ||
| 2120 | if not disc_cache: | ||
| 2121 | # Try CURRENT_GOMODCACHE | ||
| 2122 | if CURRENT_GOMODCACHE and Path(CURRENT_GOMODCACHE).exists(): | ||
| 2123 | disc_cache = str(CURRENT_GOMODCACHE) | ||
| 2124 | |||
| 2125 | if disc_cache and os.path.isdir(disc_cache): | ||
| 2126 | license_db = _resolve_license_db(args.common_license_dir) | ||
| 2127 | if license_db: | ||
| 2128 | lic_results = scan_module_licenses(modules, disc_cache, license_db) | ||
| 2129 | if lic_results: | ||
| 2130 | write_license_inc(output_dir, lic_results) | ||
| 2131 | else: | ||
| 2132 | print(" No license files found in module zips") | ||
| 2133 | else: | ||
| 2134 | print(" Skipping license scan: no license database available") | ||
| 2135 | else: | ||
| 2136 | print(" Skipping license scan: no discovery cache found") | ||
| 2137 | print(" Hint: pass --discovery-cache <path> or run via bitbake -c discover_and_generate") | ||
| 2138 | |||
| 2106 | exit_code = 0 | 2139 | exit_code = 0 |
| 2107 | else: | 2140 | else: |
| 2108 | print("\n❌ FAILED - Recipe generation failed") | 2141 | print("\n❌ FAILED - Recipe generation failed") |
| @@ -4244,6 +4277,7 @@ def generate_recipe(modules: List[Dict], source_dir: Path, output_dir: Optional[ | |||
| 4244 | print(f"\nTo use these files, add to your recipe:") | 4277 | print(f"\nTo use these files, add to your recipe:") |
| 4245 | print(f" require go-mod-git.inc") | 4278 | print(f" require go-mod-git.inc") |
| 4246 | print(f" require go-mod-cache.inc") | 4279 | print(f" require go-mod-cache.inc") |
| 4280 | print(f" require go-mod-licenses.inc # if --scan-licenses was used") | ||
| 4247 | 4281 | ||
| 4248 | return True | 4282 | return True |
| 4249 | 4283 | ||
| @@ -4358,6 +4392,336 @@ def load_discovered_modules(discovered_modules_path: Path) -> Optional[List[Dict | |||
| 4358 | return None | 4392 | return None |
| 4359 | 4393 | ||
| 4360 | # ============================================================================= | 4394 | # ============================================================================= |
| 4395 | # License Scanning | ||
| 4396 | # ============================================================================= | ||
| 4397 | |||
| 4398 | LICENSE_FILE_PATTERNS = [ | ||
| 4399 | '*LICEN[CS]E*', 'COPYING*', '*[Ll]icense*', 'LEGAL*', '[Ll]egal*', | ||
| 4400 | '*GPL*', 'README.lic*', 'COPYRIGHT*', '[Cc]opyright*', 'e[dp]l-v10', | ||
| 4401 | ] | ||
| 4402 | |||
| 4403 | LICENSE_SKIP_EXTENSIONS = ('.html', '.js', '.json', '.svg', '.ts', '.go', '.sh') | ||
| 4404 | |||
| 4405 | |||
| 4406 | def _squashspaces(s: str) -> str: | ||
| 4407 | return re.sub(r"\s+", " ", s).strip() | ||
| 4408 | |||
| 4409 | |||
| 4410 | def _crunch_license_text(text: str) -> Optional[str]: | ||
| 4411 | """Compute crunched MD5 of license text (same algorithm as OE-core).""" | ||
| 4412 | license_title_re = re.compile( | ||
| 4413 | r'^#*\(? *(This is )?([Tt]he )?.{0,15} ?[Ll]icen[sc]e( \(.{1,10}\))?\)?[:\.]? ?#*$') | ||
| 4414 | license_statement_re = re.compile( | ||
| 4415 | r'^((This (project|software)|.{1,10}) is( free software)? (released|licen[sc]ed)' | ||
| 4416 | r'|(Released|Licen[cs]ed)) under the .{1,10} [Ll]icen[sc]e:?$') | ||
| 4417 | copyright_re = re.compile( | ||
| 4418 | r'^ *[#\*]* *(Modified work |MIT LICENSED )?Copyright ?(\([cC]\))? .*$') | ||
| 4419 | disclaimer_re = re.compile(r'^ *\*? ?All [Rr]ights [Rr]eserved\.$') | ||
| 4420 | email_re = re.compile(r'^.*<[\w\.-]*@[\w\.\-]*>$') | ||
| 4421 | header_re = re.compile(r'^(\/\**!?)? ?[\-=\*]* ?(\*\/)?$') | ||
| 4422 | tag_re = re.compile(r'^ *@?\(?([Ll]icense|MIT)\)?$') | ||
| 4423 | url_re = re.compile(r'^ *[#\*]* *https?:\/\/[\w\.\/\-]+$') | ||
| 4424 | |||
| 4425 | lictext = [] | ||
| 4426 | for line in text.splitlines(): | ||
| 4427 | if copyright_re.match(line): | ||
| 4428 | continue | ||
| 4429 | if disclaimer_re.match(line): | ||
| 4430 | continue | ||
| 4431 | if email_re.match(line): | ||
| 4432 | continue | ||
| 4433 | if header_re.match(line): | ||
| 4434 | continue | ||
| 4435 | if tag_re.match(line): | ||
| 4436 | continue | ||
| 4437 | if url_re.match(line): | ||
| 4438 | continue | ||
| 4439 | if license_title_re.match(line): | ||
| 4440 | continue | ||
| 4441 | if license_statement_re.match(line): | ||
| 4442 | continue | ||
| 4443 | line = line.replace('*', '').replace('#', '') | ||
| 4444 | line = line.replace('sub-license', 'sublicense') | ||
| 4445 | line = _squashspaces(line) | ||
| 4446 | line = (line.replace(u"\u2018", "'").replace(u"\u2019", "'") | ||
| 4447 | .replace(u"\u201c", "'").replace(u"\u201d", "'") | ||
| 4448 | .replace('"', "'").replace('`', "'")) | ||
| 4449 | line = line.replace("{", "[").replace("}", "]") | ||
| 4450 | if line: | ||
| 4451 | lictext.append(line) | ||
| 4452 | |||
| 4453 | m = hashlib.md5() | ||
| 4454 | try: | ||
| 4455 | m.update(' '.join(lictext).encode('utf-8')) | ||
| 4456 | return m.hexdigest() | ||
| 4457 | except UnicodeEncodeError: | ||
| 4458 | return None | ||
| 4459 | |||
| 4460 | |||
| 4461 | def _md5_bytes(data: bytes) -> str: | ||
| 4462 | return hashlib.md5(data).hexdigest() | ||
| 4463 | |||
| 4464 | |||
| 4465 | def _build_license_db_from_dir(common_license_dir: str) -> Dict[str, str]: | ||
| 4466 | """Build MD5->SPDX map by scanning a common-licenses directory.""" | ||
| 4467 | md5_to_spdx = {} | ||
| 4468 | for fn in os.listdir(common_license_dir): | ||
| 4469 | path = os.path.join(common_license_dir, fn) | ||
| 4470 | if not os.path.isfile(path): | ||
| 4471 | continue | ||
| 4472 | with open(path, 'rb') as f: | ||
| 4473 | data = f.read() | ||
| 4474 | exact_md5 = _md5_bytes(data) | ||
| 4475 | md5_to_spdx[exact_md5] = fn | ||
| 4476 | try: | ||
| 4477 | text = data.decode('utf-8', errors='surrogateescape') | ||
| 4478 | except Exception: | ||
| 4479 | continue | ||
| 4480 | crunched = _crunch_license_text(text) | ||
| 4481 | if crunched: | ||
| 4482 | md5_to_spdx[crunched] = fn | ||
| 4483 | return md5_to_spdx | ||
| 4484 | |||
| 4485 | |||
| 4486 | def _load_license_db_from_csv(csv_path: str) -> Dict[str, str]: | ||
| 4487 | """Load MD5->SPDX map from bundled CSV.""" | ||
| 4488 | md5_to_spdx = {} | ||
| 4489 | with open(csv_path, newline='') as f: | ||
| 4490 | for line in f: | ||
| 4491 | line = line.strip() | ||
| 4492 | if not line or line.startswith('#'): | ||
| 4493 | continue | ||
| 4494 | parts = line.split(',', 2) | ||
| 4495 | if len(parts) < 3: | ||
| 4496 | continue | ||
| 4497 | exact_md5, crunched_md5, spdx_id = parts | ||
| 4498 | md5_to_spdx[exact_md5] = spdx_id | ||
| 4499 | if crunched_md5: | ||
| 4500 | md5_to_spdx[crunched_md5] = spdx_id | ||
| 4501 | return md5_to_spdx | ||
| 4502 | |||
| 4503 | |||
| 4504 | def _find_common_license_dir() -> Optional[str]: | ||
| 4505 | """Auto-detect common-licenses dir by walking up from script location.""" | ||
| 4506 | script_dir = Path(__file__).resolve().parent | ||
| 4507 | # Walk up looking for meta/files/common-licenses | ||
| 4508 | for parent in [script_dir] + list(script_dir.parents): | ||
| 4509 | candidate = parent / 'meta' / 'files' / 'common-licenses' | ||
| 4510 | if candidate.is_dir(): | ||
| 4511 | return str(candidate) | ||
| 4512 | return None | ||
| 4513 | |||
| 4514 | |||
| 4515 | def _resolve_license_db(common_license_dir: Optional[str]) -> Dict[str, str]: | ||
| 4516 | """Resolve the license hash database using the priority order.""" | ||
| 4517 | # Option 1: Explicit --common-license-dir | ||
| 4518 | if common_license_dir and os.path.isdir(common_license_dir): | ||
| 4519 | db = _build_license_db_from_dir(common_license_dir) | ||
| 4520 | print(f" License DB: {len(db)} hashes from {common_license_dir}") | ||
| 4521 | return db | ||
| 4522 | |||
| 4523 | # Option 2: Auto-detect from poky tree | ||
| 4524 | auto_dir = _find_common_license_dir() | ||
| 4525 | if auto_dir: | ||
| 4526 | db = _build_license_db_from_dir(auto_dir) | ||
| 4527 | print(f" License DB: {len(db)} hashes (auto-detected {auto_dir})") | ||
| 4528 | return db | ||
| 4529 | |||
| 4530 | # Option 3: Bundled CSV | ||
| 4531 | csv_path = Path(__file__).resolve().parent / 'data' / 'license-hashes.csv' | ||
| 4532 | if csv_path.exists(): | ||
| 4533 | db = _load_license_db_from_csv(str(csv_path)) | ||
| 4534 | print(f" License DB: {len(db)} hashes from bundled CSV") | ||
| 4535 | print(f" WARNING: Using bundled CSV - may not include custom or recently-added licenses") | ||
| 4536 | return db | ||
| 4537 | |||
| 4538 | print(" WARNING: No license database found - license scanning will mark all as Unknown") | ||
| 4539 | return {} | ||
| 4540 | |||
| 4541 | |||
| 4542 | def _is_license_file(filename: str) -> bool: | ||
| 4543 | """Check if filename matches license file patterns.""" | ||
| 4544 | if filename.endswith(LICENSE_SKIP_EXTENSIONS): | ||
| 4545 | return False | ||
| 4546 | for pattern in LICENSE_FILE_PATTERNS: | ||
| 4547 | if fnmatch.fnmatch(filename, pattern): | ||
| 4548 | return True | ||
| 4549 | return False | ||
| 4550 | |||
| 4551 | |||
| 4552 | def _go_module_case_encode(path: str) -> str: | ||
| 4553 | """Encode a Go module path for filesystem: uppercase -> !lowercase.""" | ||
| 4554 | return re.sub(r'([A-Z])', lambda m: '!' + m.group(1).lower(), path) | ||
| 4555 | |||
| 4556 | |||
| 4557 | def _scan_licenses_from_zip(zip_path: str, license_db: Dict[str, str] | ||
| 4558 | ) -> List[Tuple[str, str, str]]: | ||
| 4559 | """ | ||
| 4560 | Scan a Go module zip for license files. | ||
| 4561 | |||
| 4562 | Returns list of (spdx_name, relative_path, md5_hash) tuples. | ||
| 4563 | relative_path is within the module root (no module@version prefix). | ||
| 4564 | """ | ||
| 4565 | results = [] | ||
| 4566 | try: | ||
| 4567 | with zipfile.ZipFile(zip_path, 'r') as zf: | ||
| 4568 | # Determine the prefix (module@version/) from the first entry | ||
| 4569 | prefix = None | ||
| 4570 | for name in zf.namelist(): | ||
| 4571 | at_idx = name.find('@') | ||
| 4572 | if at_idx >= 0: | ||
| 4573 | slash_idx = name.find('/', at_idx) | ||
| 4574 | if slash_idx >= 0: | ||
| 4575 | prefix = name[:slash_idx + 1] | ||
| 4576 | break | ||
| 4577 | if not prefix: | ||
| 4578 | return results | ||
| 4579 | |||
| 4580 | for info in zf.infolist(): | ||
| 4581 | if info.is_dir(): | ||
| 4582 | continue | ||
| 4583 | if not info.filename.startswith(prefix): | ||
| 4584 | continue | ||
| 4585 | rel_path = info.filename[len(prefix):] | ||
| 4586 | if not rel_path: | ||
| 4587 | continue | ||
| 4588 | basename = os.path.basename(rel_path) | ||
| 4589 | if not _is_license_file(basename): | ||
| 4590 | continue | ||
| 4591 | # Only scan top-level license files (not in subdirectories) | ||
| 4592 | # to match OE-core's first_only=True behavior | ||
| 4593 | if '/' in rel_path: | ||
| 4594 | continue | ||
| 4595 | |||
| 4596 | data = zf.read(info.filename) | ||
| 4597 | md5 = _md5_bytes(data) | ||
| 4598 | spdx = license_db.get(md5) | ||
| 4599 | if not spdx: | ||
| 4600 | try: | ||
| 4601 | text = data.decode('utf-8', errors='surrogateescape') | ||
| 4602 | except Exception: | ||
| 4603 | text = '' | ||
| 4604 | crunched = _crunch_license_text(text) | ||
| 4605 | if crunched: | ||
| 4606 | spdx = license_db.get(crunched) | ||
| 4607 | if not spdx: | ||
| 4608 | spdx = 'Unknown' | ||
| 4609 | results.append((spdx, rel_path, md5)) | ||
| 4610 | except (zipfile.BadZipFile, OSError) as e: | ||
| 4611 | print(f" WARNING: Could not read zip {zip_path}: {e}") | ||
| 4612 | return results | ||
| 4613 | |||
| 4614 | |||
| 4615 | def _find_module_zip(discovery_cache: str, module_path: str, version: str) -> Optional[str]: | ||
| 4616 | """Find the .zip for a module in the discovery cache.""" | ||
| 4617 | encoded_path = _go_module_case_encode(module_path) | ||
| 4618 | zip_path = os.path.join( | ||
| 4619 | discovery_cache, 'cache', 'download', | ||
| 4620 | encoded_path, '@v', f'{version}.zip' | ||
| 4621 | ) | ||
| 4622 | if os.path.isfile(zip_path): | ||
| 4623 | return zip_path | ||
| 4624 | return None | ||
| 4625 | |||
| 4626 | |||
| 4627 | def scan_module_licenses(modules: List[Dict], discovery_cache: str, | ||
| 4628 | license_db: Dict[str, str]) -> Dict[str, Tuple[str, str, str]]: | ||
| 4629 | """ | ||
| 4630 | Scan all modules for licenses using their discovery cache zips. | ||
| 4631 | |||
| 4632 | Returns dict mapping "module_path@version" to (spdx_name, license_file, md5). | ||
| 4633 | Only the first license file per module (matching OE-core behavior). | ||
| 4634 | """ | ||
| 4635 | results = {} | ||
| 4636 | scanned = 0 | ||
| 4637 | no_zip = 0 | ||
| 4638 | unknown = 0 | ||
| 4639 | |||
| 4640 | for module in modules: | ||
| 4641 | module_path = module['module_path'] | ||
| 4642 | version = module['version'] | ||
| 4643 | key = f"{module_path}@{version}" | ||
| 4644 | |||
| 4645 | zip_path = _find_module_zip(discovery_cache, module_path, version) | ||
| 4646 | if not zip_path: | ||
| 4647 | no_zip += 1 | ||
| 4648 | continue | ||
| 4649 | |||
| 4650 | licenses = _scan_licenses_from_zip(zip_path, license_db) | ||
| 4651 | if licenses: | ||
| 4652 | # Take first match (sorted by path for determinism) | ||
| 4653 | licenses.sort(key=lambda x: x[1]) | ||
| 4654 | spdx, rel_path, md5 = licenses[0] | ||
| 4655 | results[key] = (spdx, rel_path, md5) | ||
| 4656 | if spdx == 'Unknown': | ||
| 4657 | unknown += 1 | ||
| 4658 | scanned += 1 | ||
| 4659 | |||
| 4660 | print(f"\n License scan: {len(results)} modules with licenses, " | ||
| 4661 | f"{no_zip} missing zips, {unknown} unknown") | ||
| 4662 | return results | ||
| 4663 | |||
| 4664 | |||
| 4665 | def _fold_uri(uri: str) -> str: | ||
| 4666 | """Fold URI for sorting (same as OE-core go-mod-update-modules).""" | ||
| 4667 | return uri.replace(';', ' ').replace('/', '!') | ||
| 4668 | |||
| 4669 | |||
| 4670 | def _tidy_licenses(licenses: Set[str]) -> List[str]: | ||
| 4671 | """Sort and deduplicate license names.""" | ||
| 4672 | return sorted(licenses - {'Unknown'}, key=str.casefold) | ||
| 4673 | |||
| 4674 | |||
| 4675 | def write_license_inc(output_dir: Path, license_results: Dict[str, Tuple[str, str, str]]) -> Path: | ||
| 4676 | """ | ||
| 4677 | Write go-mod-licenses.inc with LICENSE and LIC_FILES_CHKSUM. | ||
| 4678 | |||
| 4679 | Args: | ||
| 4680 | output_dir: Recipe directory for output | ||
| 4681 | license_results: Dict mapping "module@version" to (spdx, file, md5) | ||
| 4682 | |||
| 4683 | Returns: | ||
| 4684 | Path to generated file | ||
| 4685 | """ | ||
| 4686 | import urllib.parse | ||
| 4687 | |||
| 4688 | licenses = set() | ||
| 4689 | lic_entries = [] | ||
| 4690 | |||
| 4691 | for mod_ver, (spdx, lic_file, md5) in license_results.items(): | ||
| 4692 | licenses.add(spdx) | ||
| 4693 | # Build path matching OE-core format: pkg/mod/<module@version>/<file> | ||
| 4694 | lic_path = f"pkg/mod/{mod_ver}/{lic_file}" | ||
| 4695 | encoded_spdx = urllib.parse.quote_plus(spdx) | ||
| 4696 | lic_entries.append(f"file://{lic_path};md5={md5};spdx={encoded_spdx}") | ||
| 4697 | |||
| 4698 | tidy = _tidy_licenses(licenses) | ||
| 4699 | |||
| 4700 | inc_path = output_dir / "go-mod-licenses.inc" | ||
| 4701 | with open(inc_path, 'w') as f: | ||
| 4702 | f.write(f"# Generated by oe-go-mod-fetcher.py v{VERSION}\n") | ||
| 4703 | f.write("#\n") | ||
| 4704 | f.write("# Do not modify by hand. Regenerate with:\n") | ||
| 4705 | f.write("# bitbake <recipe> -c discover_and_generate\n\n") | ||
| 4706 | if tidy: | ||
| 4707 | f.write(f'LICENSE += "& {" & ".join(tidy)}"\n\n') | ||
| 4708 | else: | ||
| 4709 | f.write('# No known licenses found\n\n') | ||
| 4710 | f.write('LIC_FILES_CHKSUM += "\\\n') | ||
| 4711 | for entry in sorted(lic_entries, key=_fold_uri): | ||
| 4712 | f.write(f' {entry} \\\n') | ||
| 4713 | f.write('"\n') | ||
| 4714 | |||
| 4715 | unknown_count = sum(1 for s, _, _ in license_results.values() if s == 'Unknown') | ||
| 4716 | print(f"\n Wrote {inc_path}") | ||
| 4717 | print(f" Licenses: {', '.join(tidy) if tidy else 'none'}") | ||
| 4718 | if unknown_count: | ||
| 4719 | print(f" WARNING: {unknown_count} modules with Unknown license") | ||
| 4720 | |||
| 4721 | return inc_path | ||
| 4722 | |||
| 4723 | |||
| 4724 | # ============================================================================= | ||
| 4361 | # Main Entry Point | 4725 | # Main Entry Point |
| 4362 | # ============================================================================= | 4726 | # ============================================================================= |
| 4363 | 4727 | ||
| @@ -4385,10 +4749,25 @@ Persistent Caches: | |||
| 4385 | Use --clean-cache to remove metadata cache before regeneration. | 4749 | Use --clean-cache to remove metadata cache before regeneration. |
| 4386 | Use --clean-ls-remote-cache to remove both caches (slower, but fully fresh). | 4750 | Use --clean-ls-remote-cache to remove both caches (slower, but fully fresh). |
| 4387 | 4751 | ||
| 4752 | License Scanning: | ||
| 4753 | Use --scan-licenses to generate go-mod-licenses.inc with LICENSE and | ||
| 4754 | LIC_FILES_CHKSUM for all Go module dependencies. License files are | ||
| 4755 | detected using OE-core's glob patterns and matched against known SPDX | ||
| 4756 | licenses via MD5 + crunched MD5 hashing. | ||
| 4757 | |||
| 4758 | The license hash database is resolved in order: | ||
| 4759 | 1. --common-license-dir <path> (explicit) | ||
| 4760 | 2. Auto-detect from poky tree (walk up from script location) | ||
| 4761 | 3. Bundled data/license-hashes.csv (offline fallback) | ||
| 4762 | |||
| 4388 | Examples: | 4763 | Examples: |
| 4389 | # Normal regeneration (fast, uses caches) | 4764 | # Normal regeneration (fast, uses caches) |
| 4390 | %(prog)s --recipedir /path/to/recipe/output | 4765 | %(prog)s --recipedir /path/to/recipe/output |
| 4391 | 4766 | ||
| 4767 | # With license scanning (requires discovery cache with .zip files) | ||
| 4768 | %(prog)s --recipedir /path/to/recipe/output \\ | ||
| 4769 | --scan-licenses --discovery-cache /path/to/discovery/cache | ||
| 4770 | |||
| 4392 | # Clean metadata cache (e.g., after fixing subdir derivation) | 4771 | # Clean metadata cache (e.g., after fixing subdir derivation) |
| 4393 | %(prog)s --recipedir /path/to/recipe/output --clean-cache | 4772 | %(prog)s --recipedir /path/to/recipe/output --clean-cache |
| 4394 | 4773 | ||
| @@ -4555,6 +4934,22 @@ Examples: | |||
| 4555 | ) | 4934 | ) |
| 4556 | 4935 | ||
| 4557 | parser.add_argument( | 4936 | parser.add_argument( |
| 4937 | "--scan-licenses", | ||
| 4938 | action="store_true", | ||
| 4939 | help="Scan module zips for license files and generate go-mod-licenses.inc" | ||
| 4940 | ) | ||
| 4941 | |||
| 4942 | parser.add_argument( | ||
| 4943 | "--common-license-dir", | ||
| 4944 | help="Path to OE-core common-licenses directory (auto-detected if not specified)" | ||
| 4945 | ) | ||
| 4946 | |||
| 4947 | parser.add_argument( | ||
| 4948 | "--discovery-cache", | ||
| 4949 | help="Path to discovery cache containing module .zip files (for license scanning)" | ||
| 4950 | ) | ||
| 4951 | |||
| 4952 | parser.add_argument( | ||
| 4558 | "--version", | 4953 | "--version", |
| 4559 | action="version", | 4954 | action="version", |
| 4560 | version=f"%(prog)s {VERSION}" | 4955 | version=f"%(prog)s {VERSION}" |
