summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBruce Ashfield <bruce.ashfield@gmail.com>2026-04-28 18:49:19 +0000
committerBruce Ashfield <bruce.ashfield@gmail.com>2026-04-28 18:49:19 +0000
commitcd15723c5d62bbfa4c07c36eb7ab7bd962bd4936 (patch)
tree0dea471977d0b5c14e1523f2a1a206d9d3fd6137
parenta66c8df6fdc9025d0cbfae76252e12fc530a4824 (diff)
downloadmeta-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.bbclass88
-rw-r--r--scripts/data/license-hashes.csv706
-rwxr-xr-xscripts/generate-license-hashes.py119
-rwxr-xr-xscripts/oe-go-mod-fetcher.py395
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
123GO_MOD_DISCOVERY_SKIP_VERIFY ?= "" 130GO_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
135GO_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."
434addtask generate_modules 453addtask generate_modules
435do_generate_modules[nostamp] = "1" 454do_generate_modules[nostamp] = "1"
436do_generate_modules[vardeps] += "GO_MOD_DISCOVERY_MODULES_JSON GO_MOD_DISCOVERY_GIT_REPO \ 455do_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"
438do_generate_modules[postfuncs] = "do_show_hybrid_recommendation" 457do_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
642do_show_upgrade_commands[nostamp] = "1" 671do_show_upgrade_commands[nostamp] = "1"
643do_show_upgrade_commands[vardeps] += "GO_MOD_DISCOVERY_GIT_REPO GO_MOD_DISCOVERY_GIT_REF \ 672do_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#
683python 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
723addtask update_license_hashes
724do_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
3f667a3c3830a55a17ec3067709f4526c,13b6fe3075f8f42f2270a748965bf3a1,0BSD
43698933bc48f8aa60375d4423f07610f,442cfb32d1bee3d4b1a4c3f4a90ee5b3,3D-Slicer-1.0
5a06b3606273d78257b0e374217de1087,c9c300a27d86ece34c325312a3207327,AAL
67ddd727dfd24eb311bcc7f5fd1f8ff67,c573316c00b0a8233833424212b8209d,ADSL
78fda9a719e1497545e396d0b5d92eaef,d6b15630ef6c74e6600708465caf96ab,AFL-1.1
80cce6826431e2f999d7f42258d77511d,3d476f17938cc1b98d230d658b17bfd9,AFL-1.2
9f01c02e5eac69cff6b8c2cc474b8d468,f752f99c728213244905e05139a5c3ef,AFL-2.0
10e40039b90e182a056bcd9ad3e47ddd71,f470c050800f67eda6525fa31c8e5eb7,AFL-2.1
1112a46e25465f5b0543e1de5823ba3bb3,6b32bf21abe8f4dc5d2ec32eba53ab85,AFL-3.0
1206bcb8ed1dec352d24e92f6f39cd138f,20b0783ec6de4d938539b3e690d34b4d,AGPL-1.0-only
1306bcb8ed1dec352d24e92f6f39cd138f,20b0783ec6de4d938539b3e690d34b4d,AGPL-1.0-or-later
1473f1eb20517c55bf9493b7dd6e480788,087e34aa359b50c351f034bc42c14b65,AGPL-3.0-only
15a4af3f9f0c0fc9de318e4df46665906e,72a1ba88792cb5de00eb1ded96d0f719,AGPL-3.0-or-later
16468af53ba3709485581b835c3144bc47,0f1886fe73f0ba0067694a53e5d7cc92,AMD-newlib
1791501a731d1de5dba677333b7ab0ced7,e2636a60d7b2f3961dee2725fa045ccb,AMDPLPA
1888dfbf7b73c924dc62b8ae9c3bb0337b,5b6d9776cc1fde82c89012b54124966d,AML
19cc1e6525c4033c9f1302a825b390415c,da070a37ba943476fcdb2928220b4ccf,AML-glslang
206c766ae145b1f282b87773c4fa1ecfd5,88143b11b08d721b374ffde1cccc078b,AMPAS
218f131eff08616d0a4bd642e2707aab2d,e02bb3412434ee5aa720bb022bca0826,ANTLR-PD
2290cddeecef52748c37563b99d2ef1fc4,00a71d509597eaae8956312756884e88,ANTLR-PD-fallback
237a08c1d5cc0f8a43d4a02d65fab6e22e,8fde6af5dffce8e93f9e13dfa35c07a8,APAFML
24a85284103c73764f1dc551531a50dba5,5c99ea1be80d62f1f716bcc599f4b2c4,APL-1.0
25c503584d3ffbdc4e2ae2351c20e95783,9228467d1f3ebad0f267693b90c88de3,APSL-1.0
26316c504405600d20049616655cb331e4,1af05c27d7191f77c012328b4c3577db,APSL-1.1
279cf3c6d8e5e6cbe7cdef8bc218adfc8d,889e42519a82dd4440b7fa618d463a3e,APSL-1.2
28f9e4701d9a216a87ba145bbe25f54c58,6ad0886a2db2940c1e0600a8582db657,APSL-2.0
296f51fe8f98ea9fd9ca27dc9646b80079,668f87fb794f46399557d3bc52cc1324,ASWF-Digital-Assets-1.0
30e6101f537c7f36fbd9130d2fdbb932b6,1d38133f222d978a95001af2a5d5ade3,ASWF-Digital-Assets-1.1
31be2715bfed742616b09ed26eddad5ad2,926816b3495b941df924ede8b1231d3a,Abstyles
32b9de10f35b08470f4a70a99db62e6f4c,b79bedcc5eb26871363e84e73bd3e2aa,AdaCore-doc
33abedf927be332ceb1e491cfba353d6e8,608d2fc9fa1ea5401f88a26e11ea4472,Adobe
348bd7e96fbef6cf386505b6dfba6586a2,656ab718401e0489e0fee4911068dad5,Adobe-2006
356a85ad861dee598c6a282125ff5236cd,001ae2e2cac7cc867866bfc4e561d3a1,Adobe-Display-PostScript
36b8fb22ace48b0b589b0cc6c70e50f73c,77fcb64f46a6f7a45b898c5efc85aab3,Adobe-Glyph
37c0cb39e855b6ddbff398561eef7d734c,b1eeb24930e43ac70213510449184773,Adobe-Utopia
38cb0f956653d716234754e8487eee962a,d41939df2a25169b87821b613d63e2b5,Afmparse
39f0549e909c5da7d62703007d82e606cf,4f47ab42ed793ef2b2a667248d462476,Aladdin
409f7a9503b805de9158a2a31a2cef4b70,0a2e95ebd32041781ae902e3da91080a,Apache-1.0
4161cc638ff95ff4f38f243855bcec4317,c6a371ecc71c570929382dbddd7d3d9e,Apache-1.1
4289aea4e17d99a7cacdbeed46a0096b10,89f3bf322f30a1dcfe952e09945842f0,Apache-2.0
430bcd48c3bdfef0c9d9fd17726e4b7dab,9d5d19f6c0926f4aefdf2f645e9976a7,Apache-2.0-with-LLVM-exception
446db49dfe0dcbe847a47d32e6b571e8bf,bef8ae27d57c1fca2fc234cfc5758e88,App-s2p
454555ed88e9a72fc9562af379d07c3350,97b8ea9bea5944640fabf3cfc94bc98b,Arphic-1999
46cda03bbdc3c1951996392b872397b798,c64a104a9b87e9bda1ac605124d8fd27,Artistic-1.0
478feedd169dbd5738981843bd7d931f9f,6b04b99f7f949b489a09d7e923bbec13,Artistic-1.0-Perl
48dea3f591dd4e2a7a6c00644c29d38755,a2cc8d65421a92bf8ec2ae1b4c8581c4,Artistic-1.0-cl8
498bbc66f0ba93cec26ef526117e280266,a06e61dbbd1e9be362a02a8e98742a5c,Artistic-2.0
501a6692cac860780d6ac0fca918330143,7cfc26f87f5c94c55f3daa3e9c047dfe,Artistic-dist
5125d99a06ae6066ed25d7ff7010888263,51273e49a54e521d55c2c710f314bbda,Aspell-RU
52fb195e1b4b5cc0cb2c17c5a4fd793cd8,27e3e0c9e340a731a5a136eb98c1dddd,BSD-1-Clause
53cb641bc04cda31daea161b1bc15da69f,ba87a7d7c20719c8df4b8beed9b78c43,BSD-2-Clause
540251eaec1188b20d9a72c502ecfdda1b,b22e39c77fe5f523c207bbd4c6ac8244,BSD-2-Clause-Darwin
550518d409dae93098cca8dfa932f3ab1b,5f21c51c5e5a4ee1dfa3c1e30c9ace60,BSD-2-Clause-Patent
56adacc2c4dd508d9986cfd9465317cd6a,7dbf7466b669a3cac52b2ae47e232154,BSD-2-Clause-Views
57ee56eac379fa8663a8bc9909ef28499e,572aaa1eabcd2cfe95edb67f2410a411,BSD-2-Clause-first-lines
5832bb6b156d73f9be5f454418ec07363e,9e6061ad558b7c47f533fa731db55846,BSD-2-Clause-pkgconf-disclaimer
59550794465ba0ec5312d6919e203a55f9,7f8892c03b72de419c27be4ebfa253f8,BSD-3-Clause
6093f8b671a4e8b1d10e37898c4662e2e2,699e0c4173414eeaeb8ca866a4ad6402,BSD-3-Clause-Attribution
617a434440b651f4a472ca93716d01033a,6966e6f4f411d8927f81efb6cd9c26cd,BSD-3-Clause-Clear
6251af8a7a67d3863596e975fa408587db,7f46b52863be460cdfbc4b0c9484336a,BSD-3-Clause-HP
63a3ab534f25ad82cb6dcfb470a9b2bca0,610d7e67e6c32f3ee3a0fbdc344cd149,BSD-3-Clause-LBNL
6427b46022df7bdef61a1e404fc3573f83,494097023f05889154d6e51c80c88c3b,BSD-3-Clause-Modification
65c8a6a9be92f163b6c1ed17d533daa86e,e35f81460717b97b13d587b2ae739b6f,BSD-3-Clause-No-Military-License
6617c115db2c7fcf47125deff9367911fb,5a7d71268a704586cdaba930d63656c8,BSD-3-Clause-No-Nuclear-License
67c2a08f01e6d3a42b0942bc5a5a32a3e5,927a10df3d49909a3d126227867a692e,BSD-3-Clause-No-Nuclear-License-2014
6803cfa4f20a1ba9d1744c8c970c64e41e,036fd615ca5e4e2c5d4de2ea776fc611,BSD-3-Clause-No-Nuclear-Warranty
6978a514775377e847ce6058f458fb5972,695c29f1a5a46f0eb213474c9778e1a3,BSD-3-Clause-Open-MPI
70391601a93410f811eeb3d3428fca68d3,8e1c91e0ac446deee276790cd55855e3,BSD-3-Clause-Sun
71d4085d7a29799bd0c871e38b5f7a4823,dd2672f3c8d7581c2b50a0083eb9cf6a,BSD-3-Clause-acpica
72e4742cf92e89040b39486a6219b68067,7481f4985288f83cc75f8ec8c85b7942,BSD-3-Clause-flex
73624d9e67e8ac41a78f6b6c2c55a83a2b,b40062fa7ebfe5e3423b7c6d8d021d11,BSD-4-Clause
74d56cfe8f3043d810b4ea9efec2d443d4,e6f8d6746039278e08972daceeddb30a,BSD-4-Clause-Shortened
751da3cf8ad50cd8d5d1de3cfc53196d01,d0644ee4c26725c165f2280b554ec238,BSD-4-Clause-UC
765186e0001e0e10a46405a3774e3aec28,c5eac023974078f8c0437c4748a20fc6,BSD-4.3RENO
7775f4d72f502ee3b38a52784426b2c3ad,adca8c6be8fd4c06aa0db0fb713fc96c,BSD-4.3TAHOE
786dab7dd78a472fa382d2faf9f040b24a,dac2a15e5631080d42c88c65ed83e5be,BSD-Advertising-Acknowledgement
795dbe4f55844da27a6267da77a0fed10d,eb6612d34ce8109a38ad38fb829f9c70,BSD-Attribution-HPND-disclaimer
80bb6146f667105a7f0480f47c7c6b62e8,876c3b8e8acba55c01ffd89186cf24e8,BSD-Inferno-Nettverk
811fba3066d8be1a052125a4991003470b,bdbf75e1a7550f064e48db2b473c0942,BSD-Protection
82fe8b41221d7524c70688f7d059ff6d87,f2e8ba1e3c97bf8af7af0941c9ae117d,BSD-Source-Code
83b02d94a02374c33001e79575d3e4d054,08cd21554ca6d5e4077c3f63da4ad17b,BSD-Source-beginning-file
84bcd3361e18f1583954dc382b9a600e17,ce34ba25be84758a601cd5d59ef98193,BSD-Systemics
85e3cf7e0cff59ebd1f296c41add6602e7,4eda29ee97287507d41613c66382aba7,BSD-Systemics-W3Works
8665a7df9ad57aacf825fd252c4c33288c,21128c0790b23a8a9f9e260d5f6b3619,BSL-1.0
872e3afbc9f35f84c6c6ca5f21cd16f9a5,c0b39fe553eb6e94f35669661fe35460,BUSL-1.1
8857ddcbf3ed6da6b35d1adc9f4ff4741d,50436e196a7c2fd3ac962da069870108,Baekmuk
892742d70a4d048c85e63db1e64a436726,64532bb93a55d629c800cbb105dad038,Bahyph
90ccfcd635757dbd4a5ba7526aa9d8feb6,f028972050f1cf9756f7f4b29a3c7983,Barr
918db32780d0d8bbbdce0fa415e514cb89,964195e98292692323108eadd7970135,Beerware
92343ae07b73a164814623299eeab1e1d9,a4c0de56e46bad5378b0b10502490ddf,BitTorrent-1.0
9392cedb99d0471a8acd4ecc7c84b5b3cb,e3656988ac598b1c0ae39ce0a1e37eb2,BitTorrent-1.1
946bb125664f82c1853f7d54e98ea922b9,5b2826f750ecebd97e7728c6bce21afa,Bitstream-Charter
958c4328074cf50f27d3efb9aae5a87f4a,6ea6150ebad6abbd3337bd308dc19fd7,Bitstream-Vera
964157c4506f2d3cf0da1dc51015431b0c,c0c23ae2a62168a8e9ef207d86ec651a,BitstreamVera
9795e9f67f2840df3a3a09a77ef3aea34b,15336a64f430636e3f642c0a6e0b982a,BlueOak-1.0.0
98ad03248d75acacddc990f85bb70a1854,c32490734121b24edd7d084093eabc7b,Boehm-GC
9904d80e73d4673eee6158a5b50899f12f,038624ac63ae80b2d4a8db6e6e7196c5,Boehm-GC-without-fee
100b474f10b305d72c6c423807177646dc0,234880273e1b499d5fad3e36cd31655c,Borceux
101e6c1b2a8e1473cb07da49cbf8ee9473d,1510518ccb9b4afa4ebb9409938497a0,Brian-Gladman-2-Clause
102741b0469dbc545c7a47950513ba53911,3ea26a6b2e4284c03d4e54dccd70ce8c,Brian-Gladman-3-Clause
103f894ae2ca273737325e332d44dd5bdf3,a1b056f1f76cf231c441507e70aed6cd,C-UDA-1.0
104a3771b929b1097b53210a4e8da10ed60,ff749ba1869109ecd9c734e2805046fd,CAL-1.0
105a3771b929b1097b53210a4e8da10ed60,ff749ba1869109ecd9c734e2805046fd,CAL-1.0-Combined-Work-Exception
106dbb00b2869645074b4e695aec992df10,c61c34e6739afb33aea56306b9c14adc,CATOSL-1.1
107e1b141d75eb69dca77dedffa72ab8099,998ef758d616fc39a9aa766299d3d6c7,CC-BY-1.0
108b79db37a058b24d186ed078d34982463,55cbfbe8211f458bc478bc34b13166b9,CC-BY-2.0
109bf27f7347b03a9fb6376a71c26d5873e,1230c8d58407a79e86f2e5baedc3c932,CC-BY-2.5
1101490533ce18e36ff799448a8152e5f38,4d4851343a79bb425c80639f2e6df62e,CC-BY-2.5-AU
111dfa02b5755629022e267f10b9c0a2ab7,c688272e7c401d9f8b4447664605b5d7,CC-BY-3.0
112ac16bb7393ecc02c0ad56743f5c7fcd1,e5e94ac9ec877a8754623353c5386f8a,CC-BY-3.0-AT
113f40160ba362231f2f3af8701c9b3893f,dd9f394c3c84e436a77ac3d6d4fdd35d,CC-BY-3.0-AU
1146af0c687e05a9af2d3777291cc10341b,450748b9b751b21be10f1195689920a2,CC-BY-3.0-DE
11523c2e07ef5fbe97fd8d5f05852793a26,b816ca4bf33549806f77c66ad71969d4,CC-BY-3.0-IGO
116c3adfa3c8749946e60510facb64bd6cb,e2ef9a0943d9dc1b9ef315130de147ce,CC-BY-3.0-NL
117e86181756ea84a3a6c838c57187c0e48,5a2d7d5d3217f3366b39c6e02667ac66,CC-BY-3.0-US
1189b33bbd06fb58995fb0e299cd38d1838,988202b5ed1229103539868ed0b8c065,CC-BY-4.0
11960c2ef26ff098732959ecfaca4ee293f,48312559a5efae45f824a5cec0cde571,CC-BY-NC-1.0
120eb459fd0027ee7bd45ddc87041d0dac0,c4bf54074bdb62a3fb98408a95a161c4,CC-BY-NC-2.0
1213fb1f5b70ed355def0c7510f0c3ff868,f2f2b54b10b931dc5cb74b2d75bd2218,CC-BY-NC-2.5
122da665b47544b8cf138600d9e2aeefadd,a6c9b2cdf1bfbfccc0f349376cf1e2f9,CC-BY-NC-3.0
123e937cec4476e354e700e70f8184ba255,7840ddb9e5a96edb7de9b795ab3f2e41,CC-BY-NC-3.0-DE
124de4d02d928802a50f2fe5bc021f81b21,dad42a93ae06c5bc5f6078c2f4816e02,CC-BY-NC-4.0
1251fa0b366e67cd5d33008da416010adc8,afb623d9c270600a64fc1fa3a4f93de5,CC-BY-NC-ND-1.0
12675075c6d5013fdd3248ae5d6f7a98cd5,9b803a8d447ce9f5bf64403d2add9f9b,CC-BY-NC-ND-2.0
127f9339183804ba3d5e9769247477764f7,d51880f3df49ff59dfa7786948b4617c,CC-BY-NC-ND-2.5
128a1038f0f4a3de1fe9e79e2180c40f10c,c190d0225fa82052bc67249c121e0ba4,CC-BY-NC-ND-3.0
129a4448b13b2efa2608ad7372e7e1efd5b,6c4e2dc4e5f42b4be5f64a42685f6c70,CC-BY-NC-ND-3.0-DE
1304985c047ad0e40d607a6407b34f18b9a,ed9feaff618b0c34d89db747f51ffb1e,CC-BY-NC-ND-3.0-IGO
131afe664d64109562c3fa9c309bd7f73bc,dc886895c27bc10ef3baf01738447d3e,CC-BY-NC-ND-4.0
132679365ce5f061c65ce9b2beadb728dc6,796c39fbd77166c12319e04198f00c4a,CC-BY-NC-SA-1.0
13333afa953f9a9ec1c45cff66877723a83,7ef9c59edac34a82543dcd21e9e5ad57,CC-BY-NC-SA-2.0
134a9a70cd0b5ec5150fdb5e7960c0fcde4,d95aee682e5b4fb5cda9583b13fa10f9,CC-BY-NC-SA-2.0-DE
135cd9fd5140672e5f5a7972f261415a4c8,2b1eb511c28786fce581c1100d146bde,CC-BY-NC-SA-2.0-FR
1365390dc64dbc02ea720da9862c2d833e3,b7d268e6e4d616fef6cf74777c1566c4,CC-BY-NC-SA-2.0-UK
13749d7927bc671238531c941f5282a9c62,c0a7726094672e201fa9333c36f94395,CC-BY-NC-SA-2.5
138b285975b5e439d99c95bcba5b5a8cf39,1536d73b2bad5d2f60de0c07fbbbf4fd,CC-BY-NC-SA-3.0
1398c667bd3adc7d359cdfb47f4bbd0080a,d45c8b797b88e41f6ef133a2215cf071,CC-BY-NC-SA-3.0-DE
1401bb6df63159c36c499a4abce384f1035,2aaaad74486351d69fb2c1f6388bc0ab,CC-BY-NC-SA-3.0-IGO
141277261f4a7c6c099822f8f5cb0180da0,547068c75650d124c8a9c791f196e3f1,CC-BY-NC-SA-4.0
1425697702d6857a5ecf98636ef2a8ff46b,86c1668c4bf50ba2ceae38dfd38bbe99,CC-BY-ND-1.0
1432c7b116933227ab8e62498a916bbfa55,bed70c967433a4f16f95dc3bb89c2db4,CC-BY-ND-2.0
144546f3980b6203a38e6315ca736813822,db674ee52bae2d6d22818f995299453f,CC-BY-ND-2.5
145009338acda935b3c3a3255af957e6c14,3275be58076cb0e48f40b8a380d986cb,CC-BY-ND-3.0
146c312e794b0018de67bc843148ecaeea7,4c4e0ac593073cc8aa41d70f37ebd0e4,CC-BY-ND-3.0-DE
147ab85f6aeae6fce4e9ac8d74990974b86,1dc03315c1622881a2b3ce40966648cd,CC-BY-ND-4.0
148681ffad43a0addd90f1bebf45675104e,16b286e5a094b795e6680c5c1fac5d28,CC-BY-SA-1.0
149d91509a59f42bb5341a8af8295f28211,8bc7da3ae5a109b4851c200ab1a5c4e3,CC-BY-SA-2.0
15080d8974849ea3017effd4ad4d2d68a40,39b28cecddfdc9107ba3330bc637c562,CC-BY-SA-2.0-UK
151f6971d785145ff1e92dc69dc4167da07,94c5ebd3f3d0b2f5585a5aa8e4dae1e9,CC-BY-SA-2.1-JP
1525e79ee07b35e45e708fcc631c0df4e1e,afe57e267fccb69dd6722aa5e5e4aeae,CC-BY-SA-2.5
1533248afbd148270ac7337a6f3e2558be5,637026e5987a14499dff2bbae25fa414,CC-BY-SA-3.0
15429bea97bd15f0be0384506ba9aa59a9b,89ef48bc7c12e6ca84398cb24790f110,CC-BY-SA-3.0-AT
155a7741479921adbee9d03dce48364756d,1606c43fde6286480cd57af30ca8f38d,CC-BY-SA-3.0-DE
15616bcb36a8505cc3a17e6205952625c5b,42a7a5d6ea5c7104cf045022debab4ab,CC-BY-SA-3.0-IGO
1574084714af41157e38872e798eb3fe1b1,fa25aa6e5418013ab81c8a90ba7b5b56,CC-BY-SA-4.0
1583b51ba0e7718dfed153b9a6bcd786cef,1cdcbf4ee1cfa642e6ed537b223fa803,CC-PDDC
1594ac4452d08c713576b524e50a7af1717,7269c5b3323f239119f37f05ec02d05b,CC-PDM-1.0
16010b41b3422e2e88d424ce2e6a6a8f63c,e2a59d5c2892d6b57a458a392ffad2f1,CC-SA-1.0
1610ceb3372c9595f0a8067e55da801e4a1,ca1fcf16bf9c23f4d97edb371901b82f,CC0-1.0
162d63dcc9297f2efd6c18d1e560b807bc6,de8c36093b8530c0fa0702057077e079,CDDL-1.0
163c18a2eab9bf440520baecdebd5561fc5,1f8c353703b3fc38f84cb7e9e2235a62,CDDL-1.1
1646945436e301008b0d5bf87b1cc19673e,3b2882ac814bbe62e99f5e19de0f88aa,CDL-1.0
165db8def9d9625b54d39e485d2203a25bf,e7aa41a9e9cf070d22fff9b535ce9ad5,CDLA-Permissive-1.0
166c9fd4fc0f8d1507270a46df37af8e8e4,f1aa0ac13d97532f0cb621f2a54890e4,CDLA-Permissive-2.0
167f6d4e2e69d4b50159124bde6a16a11a9,67b61d27099cd9fccfd6be5a1c2c862c,CDLA-Sharing-1.0
1682e1cd3c142f3ee0c48ac10ad0edfd6a2,24b79a6464e8925c65507c984f864834,CECILL-1.0
1692a288b1ecac1b81b88207d41ed6f62bb,0a4ee7dc6b3e0f194552950e4d5da589,CECILL-1.1
170574109ac4bdff61f9c3e0de892ecbd19,f562a18a3c2e0473caad9b16e051b916,CECILL-2.0
171342660b06b8c7717c974c19366c80e7a,ba41d376f852db14fcec943357cf560e,CECILL-2.1
1726a836b2e19f087226df57a014fb871e4,ff78c16a26b498213f2343bf60c67927,CECILL-B
173de61e8e359a18f44efdb91f6d020e73b,5e3834fb49b1e7a6f4cb8a56f7ec3413,CECILL-C
174f590cf750bd365fdd1b41da8c7d4cd82,d2d494bb86609effc1ecb21ba2274f52,CERN-OHL-1.1
1758830efada678f2f7e6eb7039960418dc,0cfbf6cc54b7ae0a536604d24cdc2c21,CERN-OHL-1.2
176b16f082a74b67070bf552dd5a0a6967d,978217b5ceb086957b2baeaa6691a831,CERN-OHL-P-2.0
177e54c225891056b4b5b9aedf720324c48,f6ac98e130f2549a8d3ddee20fafffa2,CERN-OHL-S-2.0
1789c52a15851488b9d3d4d1ff2ce9ebe63,6cfa1b8c13c1995e3e922149f6425377,CERN-OHL-W-2.0
1793f2e28358fd5878d6c047f3df09593e6,90fbcebf1f3d0fa224d5ba338b5d0cf4,CFITSIO
180cf408d61106c47b36709bc34a6a11b06,baf7144fc1339f0e362ba20660e19885,CMU-Mach
18105889c72562f06247a60566567778858,a746bef491ccd5c5079dd75dd4a261ac,CMU-Mach-nodoc
18273f709359181c00178478e8a3b20cda4,6d022a43817ca2613a8f748735e225e4,CNRI-Jython
183504de64ba3e2c39bb65485686b0e3a33,1b3172bfd79842bbca6216240fa72a46,CNRI-Python
184efc38ad5089e7c3314adca7c4eb8351b,514ddef779190c50b8a328abbd0cc9a6,CNRI-Python-GPL-Compatible
185427bb5cb3253b5fa3fc15b6682f99c0c,5f98956e28603753fdaf349fe5c31a2a,COIL-1.0
1864b571d5d786c50fbe70381b8c504be7d,72bd71fbdd47cb6da39f9f02d6f44213,CPAL-1.0
1875295cd12fc5acc87bf1cf754455a1c56,eb33e9ee7af69908a385ce50cd475df0,CPL-1.0
188634398b133bc1f789f32b278f56fc7df,4e8a42a5254c68ec7a136a47360f6db4,CPOL-1.02
1890bdd9acccdaec449aedffb518252fa12,522ecc170ae6a8a655d32fa5adcbc0e4,CUA-OPL-1.0
1909844d8451b9d4eff66d8f8ef4a55a206,6721e1e4d5902f3fb3dd884c82bb69f6,Caldera
191f4338c70a1bf12fdb343b98f9aed1966,7ffd0f0205518c9d2f71e31d6a3bf1d5,Caldera-no-preamble
1923b9277d8c092ffdd18d853cfade067ff,956099f332e3ecd42eb3c1ed653ef6a1,Catharon
193f633bbf0697ec33066b83adfa9ebe51d,314f1f9be0fe41de44b73949cb6e3ed2,ClArtistic
1944b8ddf96c3c2d1d2195815235b87f8d8,a7f8df3cf4269bdca142418e0c65ec34,Clips
1953aee591f88991b746e1e223889996923,f9753c457b081188a6d94d80276a2a84,Community-Spec-1.0
196fc018a7d79dee1e8498e07e632a83895,914baf15c1ea0e3549988efdc68c32db,Condor-1.1
197d58c4769ee9a05b2cb7769bb6a445dbb,011fdf1ae7e471000f02784d39a1cefa,Cornell-Lossless-JPEG
19833998e7b4461ed0ed0a65aea6479ea2e,59cb0924efe4e943c5ecd6aba177b86e,Cronyx
19960c3fab2573aae2a88d7f8c69462de88,e31560d59cd5692a0c69a37af1eba4a8,Crossword
2008c12e5d3be190fbd04a7b7d8e6f920ed,281b5f359bc97681ef962bcafe41c7e7,CryptoSwift
201d93dee0d11742aa64d04dafeb9ad789d,139f43feb383f71fff152d0b5668ac2d,CrystalStacker
202f60e3dd4c8ecd9ef8c12216ad198b70e,bbcf4c29d9de7192eb76a37880ad8faf,Cube
2031899cb922af9857069381a10e9360db9,c6cd512f3a4f78900dfcccd90642f2b2,D-FSL-1.0
20479d48942e4701601ca9395b06b1b6102,a98b4594d612fe95c2fc325c5bd0c058,DEC-3-Clause
205fc27105efcc01e0c3f5676f688f4954c,822f29bb5ba8de43f39b99f03951ef2b,DL-DE-BY-2.0
20669bed12dd46176896eff39791e329136,7256535c3149013b0218f72ece146412,DL-DE-ZERO-2.0
207ebb580f32931868a8a238b01eeeedf29,cae873e49ab9e9c08471338cda34d570,DOC
208466df5bc4f94b4bad27a2c278fa09f56,675b3f1c3fdcb2fb6f6fcf4425656130,DRL-1.0
209665db44dcb4c03a4090f22fdcc102b35,57b1a620e17174931f9193fe3ac7939e,DRL-1.1
210476efe3fc49aa495b544c2b3da04b8f1,28ad0c16fe32f16593114ec14d43d1bb,DSDP
211b597b18461d4ca652c43297c1e22b80c,0d7e1dba04cda3547619e2ba7499e00d,DSSSL
212a6d8a177c13ec21ed44824a01f44216a,d6d20beadba5b2cbf8837a6e35a5e291,DocBook-DTD
2138d6602a268a9532585452aec0a62038b,8751cb883e5c6855f9450587b1adb12c,DocBook-Schema
21405f0782889d413839663a0f07da997bb,ce03b8f566e53684ee142704fb5b55f2,DocBook-Stylesheet
215a6eeeed43d498c22a835382533356462,9aa82f0382f331b25b8174d489be42ec,DocBook-XML
216ad6660e511dcfe55a177fd53377dea59,db387f3fe9485ca7a9136ff52082936f,Dotseqn
217d63919ac66adfeaf1f51e0c9ea9c19f9,c4abad6b281140a2a765a1a6dda01611,ECL-1.0
21869e416df0eb517ff13bbb9219da29344,0a3bc94a2309ad04c36fd3ebfd9047d6,ECL-2.0
219e06be17b8577bf6e2277a5c3c71b2d05,975742a59ae1b8abdea63a97121f49f4,EDL-1.0
2209ef6c560d1e6dd249eb0a55335500690,4b0a2ca1de6fad7855b64242004df84f,EFL-1.0
221cf203289aa5ab7db7ddf321cafe3d815,104182b0bf415ebe98ad351bdfee11a4,EFL-2.0
22243c7610db53c3693e0ba4467d7874db9,67ddff53c9db82382dce4cdc6aa24d25,EPICS
22357f8d5e2b3e98ac6e088986c12bf94e6,5322cee4433d84fb3aafc9e253116447,EPL-1.0
2242dd765ca47a05140be15ebafddbeadfe,6922352e87de080f42419bed93063754,EPL-2.0
225eb44fbd1496ddcfd5d28b73ee48c849f,087aafe0e6d46b52364dbc7e2f6736c6,EUDatagrid
2269b6186c48020a9763693332dc4998bc0,f6768a63a83b42f5d4fc24b5a8b4a11a,EUPL-1.0
2273f12b8134016fd7ba5a010afd690abaa,790b14a1824859da7282a35a3bd1c7f8,EUPL-1.1
22841fa1e32337666d37d19786aebbf3923,7fe61c6a60890bf5d8a90e5e26369816,EUPL-1.2
22942631b1af161defcf4844fb1e26cfc70,a7fea2446b9707ad986a2bb0084438aa,Elastic-2.0
230569f0c2c33934ff2511e1b129eb4b77d,b6a4a957367eb851c40d7951b77ba1c5,Entessa
2319567c64d58e18a81951c75d00c10fa98,90a7ce5d1cc714db3b3ad6b2205c96b1,ErlPL-1.1
2327c1ad6a95981815dbe65a27eefac6bb3,c2a9f6ef9c05e63ad58e02e2893ba20f,Eurosym
2337fb655591b2698ed9a93ee05acd4f2a7,2b1279c0fdbcf59bb9bf59b26705de14,FBM
234ecb28e9a9909d24005bd1951238ce35e,403edc29888f8ae09a14834014c6bce6,FDK-AAC
23506fadd9ae6adbcd5d8d545dac90b15f6,f8001d7ca41107412666073c94a56f8d,FSF-Unlimited
236232368338ef6dc99de71c2e05ff12176,166e9e93763912d23516372c22cb6b53,FSFAP
2373bdfb6b7141d64fbe01234d27ab9d39f,7c085c03311c4df367ba551f70a53929,FSFAP-no-warranty-disclaimer
238dc74327e8d4dca295527a090d2af4ba4,75cc591499e55d5cd775a1d6cda68b7f,FSFUL
239f0aa4b452548cc5d53a7772a9a90b3c0,f8001d7ca41107412666073c94a56f8d,FSFULLR
24064d4a3ca203a187bd11f47a2c8ddec47,bb577c8ef765114264be58b9b163a81a,FSFULLRSD
241546c2b17f1a20be593935a4babd275f2,00d9bcbcaf63b905cf7b2bed0023be30,FSFULLRWD
2429dc5a21fee2aa3367ed7e5fc5b1df410,d1ba3f1e105ae21f1c6dc8967f3cabc5,FSL-1.1-ALv2
243029bd8c4c146af57c48fd42fcb8a5617,2b47e4f827110eab2052a560b980bec1,FSL-1.1-MIT
244f0bf6b09ee8b02121ed10709d9e49d8b,dc1d5ccd80f76155b44da67ece7065c8,FTL
2454b962f28acfe06428def53679d1161a5,a3cc38e53861969255464508da42e6bd,Fair
246abd020ac7223106584046231a36cc563,5e428a0aea0409f164a1947f10613590,Ferguson-Twofish
247f163acc1f7bf0b7978bb29b2b46dd864,6988d5c25075d9554a6e0c178d9cab87,Frameworx-1.0
24839ac307a6de92199a3ec5ec7e6eeec03,9692e000a1000db174f8a62efb7e8da6,FreeBSD-DOC
249f9cbd56c0b114af37c44d6f127cd9fbe,28711571aec93049406814773976049f,FreeImage
2502db647cc1598d0b3cf6c263350bb59fe,cdf5f0c3c39eb168e595a55690b41fa5,Furuseth
25138686eb1b8e21891cb1111456d58acb9,507a36f9a1771df117a83d79446f069e,GCR-docs
2524640dac12cf15ff1fc48e2d812d20cd9,f69483bd26e53373c699cf3b3b0a62bb,GD
253c9211dab3ae61e580f48432020784324,6ccb3b31e9db9cc08cdab17923a74329,GFDL-1.1
25403322744a1a73f36ebf29f98cced39a4,ad4e9d34a2e966dfe9837f18de03266d,GFDL-1.1-invariants-only
25503322744a1a73f36ebf29f98cced39a4,ad4e9d34a2e966dfe9837f18de03266d,GFDL-1.1-invariants-or-later
25603322744a1a73f36ebf29f98cced39a4,ad4e9d34a2e966dfe9837f18de03266d,GFDL-1.1-no-invariants-only
25703322744a1a73f36ebf29f98cced39a4,ad4e9d34a2e966dfe9837f18de03266d,GFDL-1.1-no-invariants-or-later
25803322744a1a73f36ebf29f98cced39a4,ad4e9d34a2e966dfe9837f18de03266d,GFDL-1.1-only
25903322744a1a73f36ebf29f98cced39a4,ad4e9d34a2e966dfe9837f18de03266d,GFDL-1.1-or-later
26095d7aba50e99d173b2a5f125d24a911a,201945d7c8298e073b6b9d62e1553665,GFDL-1.2
2619f58808219e9a42ff1228309d6f83dc6,d014fb11a34eb67dc717fdcfc97e60ed,GFDL-1.2-invariants-only
2629f58808219e9a42ff1228309d6f83dc6,d014fb11a34eb67dc717fdcfc97e60ed,GFDL-1.2-invariants-or-later
2639f58808219e9a42ff1228309d6f83dc6,d014fb11a34eb67dc717fdcfc97e60ed,GFDL-1.2-no-invariants-only
2649f58808219e9a42ff1228309d6f83dc6,d014fb11a34eb67dc717fdcfc97e60ed,GFDL-1.2-no-invariants-or-later
2659f58808219e9a42ff1228309d6f83dc6,d014fb11a34eb67dc717fdcfc97e60ed,GFDL-1.2-only
2669f58808219e9a42ff1228309d6f83dc6,d014fb11a34eb67dc717fdcfc97e60ed,GFDL-1.2-or-later
2671083add59b39991c748ea70a92166959,8242b0f25d1a8cf93a25a84faa3bf3f3,GFDL-1.3
268e0771ae6a62dc8a2e50b1d450fea66b7,e020ca655b06c112def28e597ab844f1,GFDL-1.3-invariants-only
269e0771ae6a62dc8a2e50b1d450fea66b7,e020ca655b06c112def28e597ab844f1,GFDL-1.3-invariants-or-later
270e0771ae6a62dc8a2e50b1d450fea66b7,e020ca655b06c112def28e597ab844f1,GFDL-1.3-no-invariants-only
271e0771ae6a62dc8a2e50b1d450fea66b7,e020ca655b06c112def28e597ab844f1,GFDL-1.3-no-invariants-or-later
272e0771ae6a62dc8a2e50b1d450fea66b7,e020ca655b06c112def28e597ab844f1,GFDL-1.3-only
273e0771ae6a62dc8a2e50b1d450fea66b7,e020ca655b06c112def28e597ab844f1,GFDL-1.3-or-later
274f241646acc4eeceb4b2d1496385609ef,0c668195597b0bfc75603979588a8b2b,GL2PS
2759c7f16ad544b4c9090db061524c4ecbf,63280a0680046fd0a8525cc7c7fc2986,GLWTPL
276e9e36a9de734199567a4d769498f743d,c27b0005ba6255e7ec1c042c7119b5ad,GPL-1.0-only
27730c0b8a5048cc2f4be5ff15ef0d8cf61,e2bb1703ec21213f3cb9816023711f2e,GPL-1.0-or-later
278676cb7fcf1214ecbe3be420dd5a5b967,ff07743d7307482bfc205231a478a706,GPL-2-with-bison-exception
279801f80980d171dd6425610833a22dbe6,793475baa22295cae1d3d4046a3a0ceb,GPL-2.0-only
280fed54355545ffd980b814dab4a3b312c,ff9047f969b02c20f0559470df5cb433,GPL-2.0-or-later
28114c42911132e8c9008911385aede6449,d9305eec735dceaea89c309651ffee39,GPL-2.0-with-GCC-exception
2820bad96c422c41c3a94009dcfe1bff992,0fc3a2442d23814e3331c2d89b663b4b,GPL-2.0-with-Linux-syscall-note
283d9e4412f125e3e6f14efba8ce7b4604f,8f104356594afcdf60f5d39c00cb5d4a,GPL-2.0-with-OpenSSL-exception
284966c02a95037a9c7ad75a7597aea9c5f,fb135dfeca798ea30289952f491e90c3,GPL-2.0-with-autoconf-exception
2856133e6794362eff6641708cfcc075b80,8f0e0b3085ca64857d15ec776e8d3852,GPL-2.0-with-classpath-exception
286bf93e21a513f6f923474e62fb920434d,8f591c52ed49d95687055100e8959acb,GPL-2.0-with-font-exception
2876e1bac3dc21fcc4fa049cf5c407eb7a2,e79f2b7c71198191a9309a31379e2d37,GPL-3-with-bison-exception
288c79ff39f19dfec6d293b95dea7b07891,ea6de5453fcadf534df246e6cdafadcd,GPL-3.0-only
2891c76c4cc354acaac30ed4d5eefea7245,b419257d4d153a6fde92ddf96acf5b67,GPL-3.0-or-later
290aef5f35c9272f508be848cd99e0151df,ee36936fda28084b11e8d99812bf7606,GPL-3.0-with-GCC-exception
291da26b415cb0faf9bfe6829f0ffa409ec,a101ba086852a854b262050d90a9ef10,GPL-3.0-with-autoconf-exception
292fd68513f06aa6a7152df173ca2ced1d5,eaca5ca8bf7b8d91939c22b10b2e8e1d,Game-Programming-Gems
293842cffb135d8acfd5cd3ef4281efd140,bf305e9ccedefd0e196c24b9e9bffa37,Giftware
29498566c42efca5f49dfd5c8c8f040b419,25e6928ad2d3c32a8cc8074356400a89,Glide
2959e4ccb2a5e3ae7d2c4f2ad3f0a8e18c2,98806bc3501433890cd94e57d1638fa6,Glulxe
296d0aba67ffac27d88e32782a0ddea7781,78a6aeb13283e8188bbb96b962e9696d,Graphics-Gems
297cf754ff71ecba468d1c3dc9c729ec4be,95729d66b82e2d06a07a91d7c2901661,Gutmann
2982349c5ea816e0ff437f3d63e02f948c3,5a6522bf01126336f87bdffd2cf059e9,HDF5
2997667661a039c6408bfaecebb984442c8,902f1a4ffbb8712bec72821c7d49a8af,HIDAPI
3008937760d9189ab9daed685da1c608f55,7316dcd50baca47f8db06568e979dbf6,HP-1986
301b402423daac617956bf39cdd3360d3c9,a7aab32a61cf2d784efe29abc3300746,HP-1989
302faa364b3e3c6db0f74cc0e704ddf6b9c,1afdf224cc65521eb9bf3d6b26bef9b5,HPND
30363c89d6fa93a99237e96b74c6e267778,d4b44a6958001d0f972047218785546e,HPND-DEC
304cb79d2ada1c67f5a36bd6e876701f18f,7b0870801109847f5f7b7ade46ed1361,HPND-Fenneberg-Livingston
3057d73846faf6b89b1700d406e89a3f7b0,ff2cae907bd830a7bb33b8438902baf9,HPND-INRIA-IMAG
3068c2ad6eda88a19cd687fb39b18d2a381,2394e4017d506a8e684e1dae2342965d,HPND-Intel
30735f473deb259d9c059127971d19347d5,62fcf649bcbb6ab7453b9142ba90a7d5,HPND-Kevlin-Henney
3088b90e19491ef78dd7f61037f50c101df,ccb1c31406caabead46d3f1255684fe8,HPND-MIT-disclaimer
3095a1d801548c23958ccd88a8b268884f3,42d2b2a8bfd3f9d3d0aa392f3cd2a394,HPND-Markus-Kuhn
310a81c9a228402dd0f8e07b1aa2c364605,d13853e1fa56edd11683c728ef796be8,HPND-Netrek
311bfbb16faa58cf761542ba3ddd0a56d9e,324ca733ee82f58eff05eae2124162fc,HPND-Pbmplus
3122b0b90a648d2507d043b6bae013fbfbb,d9d74fd1550c50928310c4d51cbe07f5,HPND-UC
31326a25ed7307a326f555b251b670372a0,9bc0c53d6e882fd7ada6978c7257f17a,HPND-UC-export-US
31437a261109f374a8cc8d19431ab6ff677,7d0695133d4790b40c411fe0a2f041c8,HPND-doc
31580b6d5b74043f3112b132d2dff65aa49,4415b77f9b97ac6cadc4885fb9264cd9,HPND-doc-sell
316b6405a09c65be809fe8255dce3147729,96911926b501485d2c0b4bd8cdf81c06,HPND-export-US
3170d0dfdb8d027eefaf2a4a039622e5077,05efccaf36b8162131d10c05a946b15d,HPND-export-US-acknowledgement
318432f6d5a8810035526dcbd74ff2b6c9d,845876f9f225e21c3a2cb9f9aced2059,HPND-export-US-modify
31972c547a8cd0cea28b7dd6357f44e9c9a,2ee2c7a1eb565b3bf943f8d3274d718c,HPND-export2-US
320d948969d402c1792f21b497addfd87c2,8bbdc179d259a5fbd3a12d8eca281204,HPND-merchantability-variant
321584132f8a06ba260c199b5479ac39166,8de0026ec5bca1e0fb9c2455e83e4651,HPND-sell-MIT-disclaimer-xserver
3227cf7171ab01b3841d35a87977644d7fc,f11057f85f40ce9820a174e82c0706c8,HPND-sell-regexpr
3232a45f725f5ea99a831c06aa6be09f368,8f9160bcd3ba3c1fdab16af47c75c245,HPND-sell-variant
32422facf55152762303d6e32eb2fa7fbc2,b20466da2a94a3a02191a239cbc4adf6,HPND-sell-variant-MIT-disclaimer
32543575e76516382681f3d6084e128e5c8,0d397c027669c48ac66cb82531f24d50,HPND-sell-variant-MIT-disclaimer-rev
326d12343a2d67cdff907091c77d9f929af,47a9459e5c5b14c62791b4026cd47a19,HTMLTIDY
32779040043c56d4fef36975020dc270420,834942941d174792d154e0348343396b,HaskellReport
328b80cf26a858bf07912ac604409ff4ffa,67f5b86ada3d96e719e7eda2ce79c071,Hippocratic-2.1
329b55b967482208bb2abce2233534a01a0,075c9413058e22ff1516cced22de4a5c,IBM-pibs
3304d85ad1f393add71dc66bcf78e3ee584,b165b41e6cfcef0ec9375e66a301a940,ICU
331a9a30ea703572ad3ded3a27ee7db812e,988c275bf59f86fd692a612ebd08701c,IEC-Code-Components-EULA
332d9fc5ebaa95c14466091d25e0d34e688,4d58a6f52548a942894366dc3f1dfa01,IJG
333fa85185da21c9f725663fb4ebc6443ed,006e7208f5de4f5a86078c4273eea409,IJG-short
33417b18da2d8b2c43c598aa7583229ef1b,16c1dd9f00cc26013f7d0f34cc47ef31,IPA
335be739b8845e6e98f99e206221fe9293b,a7335747c7c8a4a2aaee3f765448fb04,IPL-1.0
336f3b90e78ea0cffb20bf5cca7947a896d,228737f4c49d3ee75b8fb3706b090b84,ISC
337250ec29b2decd76847fe880e5c0e83e4,92dcd74b1c6e1192b95eaeb67ab9e25c,ISC-Veillard
3382c2cb8af4def8c0bb0c3046ac2c8d514,a3807e85727837044f74ee39b3bd61dc,ImageMagick
33907eb6510e14fe74a376fb67157b806a0,54cdb66df90551c99448cbf7510ab07f,Imlib2
34083a1c8ea099b3b58beb6e55dcbe4c15f,116555e799b5729c931406ef4f7d18a8,Info-ZIP
341f179e6175372e6e2c06b6c2794a1a478,9283974f12be64e59e2f1da04f9390ad,Inner-Net-2.0
342a8c11f520c3973e3300d40dc6d03c38f,3fc661a4a5544ac1545c9fab21f43d30,InnoSetup
343ced5efc26449ecac834b4b71625a3410,ae1e23cc7f6d863e9b20452462c66938,Intel
344127b1c00c0dad2b0296f4e909cc4a547,ad4776027f8e917638f6e0bca98df66f,Intel-ACPI
345f65304bc0e87e6700fe1e4ab5affdc6f,afcf0a4d2eedb2529114131814518f78,Interbase-1.0
3460a034e5200a8faf192d1e5e0db32fa7d,fe456b995e55bfe380a447dadfc4a45d,JPL-image
347bb17eba7b7f83e0c108c4df52fdd7694,7b2329becc6c1238c3ddec866c080f9e,JPNIC
34808ae6a95b08b6b8db33b3ac4700fbeb1,c483afb48acffcb070371040e1c07bf4,JSON
349cb964db04e8da9aac4241e724d1379eb,a12b7d87a502886df11c840ddd522e03,Jam
35094c046e511122aa69212ae137b55eb9a,6b5bb294d85f068526fbbf2c6cd2e7bb,JasPer-2.0
3517ce1c908ca53cfa7e691c53187e8545a,3beac04eab762762063d24aa63bbc80d,Kastrup
3526a55d5ad80645ea24fea8e179d3fb6c8,7d4157ad58423aa23dc08fc9e348da46,Kazlib
353db688c4a804ef41ca3cdd97955696309,a25648a10131b683522a86e38777e16a,Knuth-CTAN
354af880a0f040cb16dc39e66580e1ef6e0,c4a0cfd79e0ed8687144313b78eab474,LAL-1.2
3553728762dff91f7fc2c26e5470e4fde9d,921d527d62ea5e95202e412ed7144d6f,LAL-1.3
3569427b8ccf5cf3df47c29110424c9641a,c6a782e826ca4e85bf7f8b89435a677d,LGPL-2.0-only
3576d2d9952d88b50a51a5c73dc431d06c7,32d8f758a066752f0db09bd7624b8090,LGPL-2.0-or-later
3581a6d268fd218675ffea8be556788b780,4820937eb198b4f84c52217ed230be33,LGPL-2.1-only
3592a4f4fd2128ea2f65047ee63fbca9f68,db13fe9f3a13af7adab2dc7a76f9e44a,LGPL-2.1-or-later
360bfccfe952269fff2b407dd11f2f3083b,d7a0f2e4e0950e837ac3eabf5bd1d246,LGPL-3.0-only
361c51d3eef3be114124d11349ca0d7e117,abbf328e2b434f9153351f06b9f79d02,LGPL-3.0-or-later
362d5311495d952062e0e4fbba39cbf3de1,07f35905b113e04930aad2aff9723f5a,LGPL-3.0-with-zeromq-exception
363159ff0ac8f0ae99f92b7e604b3bf02b6,96fe3af8ff2e20d3e293457aee82509c,LGPLLR
364e31cf1d5021bea3d57e59f2e4c6e190f,d65bad62db49062b508c3b44101db0ae,LOOP
3656f9bcdb850aa1a5381465dba316c376e,ce2db32c90337bc63b5e86855e3d28e5,LPD-document
366efd7b41ec0e3fde64acd215334ac4436,1629443a4a86cf39203d8963d43d6ef3,LPL-1.0
3677000797b47d74a5ce02dbae91e4814c9,113e0b34c63436e74dcc4f2150eddc7e,LPL-1.02
3689263bb4eebce865da8626ad537b97d8d,93dfdf04dd7f65c48485b319aa274834,LPPL-1.0
369d9f6cdb08c684151d839756e8b04e8db,fcfb3e07821a8a6f768ccdeb870d73d9,LPPL-1.1
370417075eb69f70fcf5a50388bb516af12,102b904cc2fb5229d116216f71c6054b,LPPL-1.2
3718e2e8e1428b39cd78927c2ad28734ff7,8f8ac6a78d20d416083ed0bace5156b8,LPPL-1.3a
372ba2fa6fe055623756de43a298d88a8b3,68c72d314d70e00c96d26db2c15e8ab1,LPPL-1.3c
37343613958980fd00a6ecdda51d9b9b05d,dfd1f6c25f342a7216540f47c65da12b,LZMA-SDK-9.11-to-9.20
3742de42ec1dbd0879189e37f6fea6c4b63,ad9adfe69bcb5f8c1119fa6f4110937c,LZMA-SDK-9.22
375ef91d258f6a8d4d7f4db4d30adf38598,9940c96b64f7641f186c2fbfe35435cd,Latex2e
37630a98f811094c3dded653a205007d9a6,aac45216f806050f7402f5c351a9ba2f,Latex2e-translated-notice
3773da0ce0907d870523c2cc5d94d32fad1,1f5cdc76245a7fab79b99f0aa842d2ff,Leptonica
378503577dcf1b97fe29e64519f3eb52f93,5facc5f182ef3150d49a7fe98e649dde,LiLiQ-P-1.1
379faf775436c2359467177f2e0dbd891c4,54067345da0e2a4071a79b3a62792bc5,LiLiQ-R-1.1
380bd6163c22201a119540db4a2606b3e1e,928c006aeebdb50d230f20b5a9f623f5,LiLiQ-Rplus-1.1
38112b4ec50384c800bc568f519671b120c,eaaab67e38179d6db00282c6956e446f,Libpng
382448c42d4ca4be6f8fb40e0620c8b145f,06dd6dddc4d1288fad4499693c0a4052,Linux-OpenIB
38397ab07585ce6700273bc66461bf46bf2,1852b2dc3e92e45c8bb8e318aa03ee7a,Linux-man-pages-1-para
384173b960c686ff2d26f043ddaeb63f6ce,97d9f6cd25bfe015b264d09db6fcef2a,Linux-man-pages-copyleft
3851cafc230857da5e43f3d509c425d3c64,62270e2b08f88dc1aa0f2f34fccdc16e,Linux-man-pages-copyleft-2-para
3863853cd62795903a9ebd1357f6a3a66b4,34e81d1d85bc989095be7c7099d28944,Linux-man-pages-copyleft-var
3873c79a4d5128d4a7beecf641abc8aa884,228ee80599a32d49542864cf4eb1af4e,Lucida-Bitmap-Fonts
3881e0b1b77c8b70630131c95bc4ef4befa,ad2e22456f120d08609476d3398650b4,MIPS
3890835ade698e0bcf8506ecda2f7b4f302,eecf6429523cbc9693547cf2db790b5c,MIT
390f41b3a5f969eb450434cf0e4f33449b9,b218b0e94290b9b818c4be67c8e1cc82,MIT-0
39191b70218e0db8e063ed88cd532cb801d,9fabe195ee00170406314047681a3a37,MIT-CMU
392908396cd67049b226422ebfd4f38ec17,393b77944c64e8e6b57a32095a101a5a,MIT-Click
3934bdb3f94d7a2b2cf7cabfae18f2bfee3,a86f382fe8fe6624c740d6623cd3fdf7,MIT-Festival
394a81aa9fd63b8e618b46e566919afa6a5,5d702953a49b9b274d7718d3e1d11eca,MIT-Khronos-old
395272dea2b67586002978254bc04648ab2,ea216f8e73afc6a62c197a783f12ea2c,MIT-Modern-Variant
3963ffdd0306405414588d867600cdd79f2,995eac9ef87f818acc85a617cae3c505,MIT-Wu
3970f358dd6677661d482934070c7eeaeec,1b07faa3e6bc37da8eaafa4cb8e02eb4,MIT-advertising
398837570c48d6e224a531b1c5cb31f6831,a83af35d24e8345619cec33e7909c86c,MIT-enna
399031c73abe1c92133bd0f02f41a6a5d11,b5e1a9ec68102001c88281d3a5e4d9d6,MIT-feh
400a7c50bba311e4b09d48a526eedcef837,9e56ce99bf8947fbb0e932dabf9a0feb,MIT-open-group
4016a0fffc30c6eceeccaf346c1dc6abd90,00dccaf97d73308b84ebae69588892c8,MIT-testregex
402ae098e6f49fc0720cbe27319dffe2f48,38adb0ba29e5fe703751e35bf3b3f27d,MITNFA
403463c2e5794b2f441e7f95face33e16f5,0237a20a33f53115dc0d0d59734904a7,MMIXware
40462b024ad4b594e88f24a034e38e9aede,3e875d5b00a960c5c02b8f7113b14f21,MPEG-SSG
405781b4a0e6dc50518d9b876a0877d22f1,255eb25fc840e4ad830d011f7482e990,MPL-1.0
4061d38e87ed8d522c49f04e1efe0fab3ab,286c1572b85ed9d72ca197186e6432b6,MPL-1.1
407815ca599c9df247a0c7f619bab123dad,7a8d6f143302141f49951cd709dd9120,MPL-2.0
408d266657003c8e2b02f66ac8bdd9a2d03,0c46cc29565c1dc91b4ffd3ff52de4e4,MPL-2.0-no-copyleft-exception
4094f9912faa1c88c40a29bd2809f60a827,62d4f17144c48571005861d8b6e3babf,MS-LPL
410b9cbca4f1a399b0c17b3521736e67848,aa257edc58d2d332711fe025b51bec53,MS-PL
4113535ded4dbb8b9b8c08d529cfd963c83,26acec6d75a906b7355aa889e588ff70,MS-RL
41209c3ec64e4c518cd72657a2cb1e85095,db441307b31144afd10e5652bdb40a44,MTLL
4133082b840a28d09e16b50bee0de9ccb28,b34f8f5c992307b038634b57134e29d3,Mackerras-3-Clause
414ae070b893d5d0d64355fe41e204250d3,5679609003e3370e65e4423dbd8568e4,Mackerras-3-Clause-acknowledgment
415430cb4ba3b3436686366675e95e88673,5e575086ff5c4ed9588ebf6786289060,MakeIndex
4161dc046ff04588295cd034dc8d8aa1c29,a5d3293ef8c03e04deefdef97df25ee4,Martin-Birgmeier
4171426c0b56aec1c7d0a56ac51a5e9299e,42c995ceedd53df416a9df9901f2abbe,McPhee-slideshow
41871d91b0f75ce79a75d3108a72bef8116,33205dd255fd6717a80fcba9c3d2a7e6,Minpack
41992710048faf09c7db6fbab0b5c68e722,4d8941b1a4876037eb67efdbf5ebd8cb,MirOS
4208f45290f66a01a2bd7d3c1a1bee379e5,2335e8b3dbf03716ec7d673e0da7ad79,Motosoto
42122c9d6c03512270a0c604dfbbe6c2fe1,871c4d513e90886c462f7fa61fd525f5,MulanPSL-1.0
42274b1b7a7ee537a16390ed514498bf23c,b1cda2381467fa0f7d2eda841e8beab6,MulanPSL-2.0
42391fdbe190a1f86c68e25bc9b1b1893ce,f41c017da81e6b06b1e45a9c7cbd6f98,Multics
424fd1a6fb4c99f4f8f014b2c4aa2e0010a,af88f0bd68e822e8533635fba7b8b07a,Mup
425980c7c3833ef8c21d425cb30a71cf41e,c7625db8390483c97cf88a48cc63c79a,NAIST-2003
4261a69b36c2473705eb993f4d259f7023a,c8b83d71e6d6c063e10768375ab9b7fc,NASA-1.3
4270639f02ead7321f9b56065a4c82ab0dc,64cc9f22b5a4c87dee3e32ad1db8b9fe,NBPL-1.0
4288dd4edfde7df98d9121a4863c39e80d8,aed33247718c6260dc8df3a1a28a34ef,NCBI-PD
429818e598c8efea97a0f3b1c1b106512f9,079bd358582e3e8d52a72cbb09f9e8bc,NCGL-UK-2.0
430159ba93fd6e804f4b33403b703faef26,b6f755bf6795211e1a73ebb19f6437e3,NCL
4311b5fdec70ee13ad8a91667f16c1959d7,1fad5c4e03d39de7009fe66ff4a0f457,NCSA
432eba216effbb501d5a27143374c96cec2,1e85789cc507736363423b6988ec6713,NGPL
433e840fe304e3b95c4492a451e3eb6ebae,398205163ffe928edfe0d6229dd93e9d,NICTA-1.0
434e3cdd21422615e65cfb61d66efb6695b,7181344621ab66eb950bc3b8dd7a6623,NIST-PD
435d4316699a62681192cd0a75a136e47bc,504f9bf061d442035ba6f45efc951673,NIST-PD-fallback
4360fda83722f4b845d0a9026ce1c3be556,869fb90ee76f6f74a3c64fc1150f9302,NIST-Software
437da42cb2460f2c6eea098e6705ed1c103,0a5665a111253e2657d72a2afe00af80,NLOD-1.0
4383d2da0636f9877a48662c3d180b642d7,35b1e7fccb90d4365e5a86ef9ac9b135,NLOD-2.0
439b05ce303130dcb84b2c437d439bedc2d,684c59c3ca8157b5b27aa6bff9ccaa58,NLPL
440470951e1489bb4c347db388f7202c8cc,e4a8f5cf1ec97c262a58169b8b019a61,NOSL
441fb9ceca80dbcd24694c510c689a6e19a,aec044b7b12668bd9750acc438ab4dcb,NPL-1.0
442f9c017c062c1b02462efb915d9f2cb63,40f46c1f2cb553217e7a111cd759aca7,NPL-1.1
44342f47bd574b2eb4a27f42dde3f85d0b2,737304afb49064c9211660f0fbee9809,NPOSL-3.0
4444eec9c9b063500c9dab38ae621d0b2d6,9a87495c7e540b7e54ae83aa9ce34168,NRL
445c661c75f283d2703878599ec5b178106,4c6b56242ad743f4b72b59eda8396389,NTIA-PD
4460926fd147301b2a65e45e21adb3a6f14,9a69d5a11c0d5051f525c1430f29bb40,NTP
44771be4bd600c03804e058629b45707e56,1405d91914c4591647360b3e42deca35,NTP-0
4489803b6df768c3b9adea1260c48449bcd,c7a5d5f30e53388ea8b4f89a6a5005b8,Naumen
4492b7c132b054e26675ec8644159bfe90a,23cf192dc2d29c9825f0de07c245ac8e,Net-SNMP
450645ff84670453dc664c934a11b9fd001,384fcc45a17714cce879b62e7fbc9eaa,NetCDF
4517f208af1ee34d97c36ae4ba616d99b15,a01081fed8469acef866950bf69b0834,Newsletr
4521d63716e5a0d424380c8c275b38a684d,b59007c2ce90dc1d3f296193d5259f11,Nokia
453c5aab02dae304462b39031effdbc3e5c,e7f5c6815874e0923413614aad2fc821,Noweb
45438534e9743a6e7d2e4d5127d8868e92b,fcd757b0f438e0885b14218a141e9611,O-UDA-1.0
4552574c2cdf097d0fab1203762469ea2ee,30f6d1b17930ca095591fcc06ad07be9,OAR
456661853fdec2fe9c75df5e7019d349e8b,61775fd08ac4e3e02291d3a2f7813f78,OCCT-PL
457911d82bafafd8b8f2f65d02b6c5dad22,284f358286240566c57c0746d712f157,OCLC-2.0
4583f2f9df7619f1e43eadba2b5c617542e,ec144f3f0d8414b6c40b332ab497a170,ODC-By-1.0
459498d26a501c10739d57fca1c9d80bbc2,496db8abfc10a14cf61e62a3b763fd6e,ODbL-1.0
460c412607763e2c9576869d9a093d1541d,6c80cdbf0dbe4d9a8bd543e33724f348,OFFIS
461147016579566640a7c38f035cf962d40,956f71fa678c3002682d6b1761d1d119,OFL-1.0
462147016579566640a7c38f035cf962d40,956f71fa678c3002682d6b1761d1d119,OFL-1.0-RFN
463147016579566640a7c38f035cf962d40,956f71fa678c3002682d6b1761d1d119,OFL-1.0-no-RFN
464fac3a519e5e9eb96316656e0ca4f2b90,c5c06d912054460684f24d91cd18632a,OFL-1.1
4652680fce30f17e5fed9bcebd9336e5b78,82d34fe1270488e4c3d2a72293a6b690,OFL-1.1-RFN
4662680fce30f17e5fed9bcebd9336e5b78,82d34fe1270488e4c3d2a72293a6b690,OFL-1.1-no-RFN
46792be1547ea59dfa6f5fa3eb511436611,1a8c364b472f01eb4800245eddc2bc04,OGC-1.0
4686b7695daeb4ad458f48d002b1db4bb30,9976e0400318e1ba7ba393828628e448,OGDL-Taiwan-1.0
4691186cebccc11532af57c2bc2e3a2de4a,9009d261f9b3a06e15360135950b6813,OGL-Canada-2.0
47011478da101cc77bf8e09ff33b315c3c6,700246a719276212b6522d4b75d19d38,OGL-UK-1.0
4715efb1ce72bf097f37048e2f1ad8d132c,9dbad9a6fe3304cbfbc65e34e53a1751,OGL-UK-2.0
472dbb49d86a7b9dd0868cf565a3cdd90bd,40b77d7b03a7fed9bedf693b506f44d4,OGL-UK-3.0
473c610791f6155b203309becfa6f6f3795,269071c94c9913659b010cf914a92d27,OGTSL
474edf587adfe362e8571448b184e222baf,0348b1bb1566b51edab2286549b7f00f,OLDAP-1.1
475009f8a570c2c8e46e505ce6907e4a6e0,9a9ee3414752003a5a47f98d9eda9f2b,OLDAP-1.2
4763e11ab81fc86be2c56da7edcb522c967,fc7b247545dbbfbff7764fee57186f64,OLDAP-1.3
477da1851bbe489fa73c523fe36236086a2,2777fb9dc95f898cb2093a4f48267522,OLDAP-1.4
4787afe16775d3dbf5b387812e43d12e235,91dc598c461f4e8ec58b3bda2080e466,OLDAP-2.0
4799bc4bd6ef1047c3135cb0b38c17b5f1f,cfe602b3f2a4268b50724a9758acda54,OLDAP-2.0.1
480a297b240f382dcdad5bb563a6fa7c3c5,c8582ccaa7187894df11b4af65187d98,OLDAP-2.1
481b99c5ef67fc401e28669fc5d3fe2270e,bc574f37161c5f548a427848f3caf006,OLDAP-2.2
4825eb5f8dea32c3a159c3a108c7cba0d59,48f9d7f741e391a9c7686ab3c18c15ce,OLDAP-2.2.1
483da4dd8d7a88833faa0c3253f951da0ec,9562a63fd2a4d029209e15c4d795477c,OLDAP-2.2.2
48447f8ee5890ce16863a73c26ea20ea500,4436983adc031646c1067041a5170a4a,OLDAP-2.3
485ed1e505c4fc33fec82d32064c8aeb15b,51c760a7e3992978d221dd556b02efed,OLDAP-2.4
4866f6d3079515dea35945b13250baf4eff,55b591a274d1af4930edcad092ab6d9a,OLDAP-2.5
4871ec0cd6f3f76fe56633e150ff591eefe,3bd7a35a90bb960d3c84453f2a725945,OLDAP-2.6
4882db9c02b79795b5997be787ab4e3b130,eb7e9dbf3d13428d80853ffabb54f04c,OLDAP-2.7
489bb28ada4fbb5c3f52c233899b2e410a5,62cc81470d2c909a1f142f595d2588d3,OLDAP-2.8
4900ea211599981d34919e725ab3b7fb70e,a41f9334c1157898b5bddd5832867a34,OLFL-1.3
491a1cf4d4c2be36962b02896f7f49175f6,e9c142ba1f31a9fba550d43c657d537e,OML
492acdf1e4398bd93dc137e271c50316324,875031f5496ce3613d6947d886409a3b,OPL-1.0
493bcf5928152ba0de1f2cde3e2d84c6e02,66754a9a53b8b0e4e3370b4dfb01d0a3,OPL-UK-3.0
49499367d4750dbf0ae6cc74209ddd52f6d,2a228838eeed3f407c26fb079c2b53b7,OPUBL-1.0
495233c45084b5126b70b8cddbe0852754b,4deaabfd6040e0280f64dc4c5ed74c2b,OSET-PL-2.1
49642d04076301ef38862a32199ac00734c,39f43284d2ffbd8144f040f3ca1018b4,OSL-1.0
49704ba39e3fcdbb1e46c78d56ebc24bcf1,4e53296759165a7e167694932efb0478,OSL-1.1
4986c74c6bad0b7f7503f1b80a33c6d6079,c670fad4fb2b81f3c65de19dd5e439e9,OSL-2.0
499c8f36cbbff0b620fc60e775f65b478ac,c0af45d93daa7d5b7c0b07f589ea6e7d,OSL-2.1
500438ec6d864bbb958a49df939a56511cf,65786c4f715c8a60fe3bc8a50af1f3d8,OSL-3.0
50121840569278bd0abb97e907632c71391,b86f19ef734216aea23ee774cdec9ce2,OpenPBS-2.3
5024eb1764f3e65fafa1a25057f9082f2ae,8dd050d5558743da537d1d70a8b4877f,OpenSSL
503a2f51dd2badb478cfa5864e1c7971229,6090c35ed4c627f6ebf3352abf94e875,OpenSSL-standalone
504af6d886f4117da60c562b07a4d1525a4,6bb7de83993e3aabd957f76f9ccad42a,OpenVision
50599861d2ee92af29a001caef7a90a4098,68a46aee72fe3edb156b6e8541219575,PADL
506b3597d12946881e13cb3b548d1173851,e59545114390e59f615ec8618dc766e2,PD
5073d473a68d189d64108d78e13c464dd04,40a45da70b3e0fa01629ea47e79cea9d,PDDL-1.0
508a4f510523c0a44fd4335cbdf941adc9d,d56bb8e36249baa2e6b99a35d2ece7dd,PHP-3.0
5093363e286b5882ec667a6ebd86e0d9d91,4a33a7e642e918e6bf52b3c216aaa7dd,PHP-3.01
510a742df783d74542def22bf228e19e878,b8a8ac37a7318e7831ae4e5b2379cb8a,PPL
51176c1502273262a5ebefb50dfb20d7c4f,7cbce15241d6de0c675b1e876b4efb0b,PSF-2.0
512405086898d0a61076de2337982808055,e7a66d6dc2dcb0e6ab703ab6962fd14c,ParaTypeFFL-1.3
5132a2abdb5818c49e694d97e402f5fc312,ec112146199cc17f6af8e10eea3ad326,Parity-6.0.0
514914d6ca25a35f8c9ee454b52c4e91a3b,7ae19ad16bacb314460a57f3bcaa83ec,Parity-7.0.0
515973fbf9f6e09fb6f164d2887dfb0fee6,aa56683d8da3248397510df9034a3f5e,Pixar
5161a4b0fc1c32cee1fe94f3751b6ccccf7,b4ab148fe7a709642afed226ab045dc6,Plexus
517fa4f6eb8206bcfb6954542687e669418,cec397d544d2fc9c585e99943ed7da1f,PolyForm-Noncommercial-1.0.0
518e892ccb8a79a01d14b523fe6d902e1cd,fa94f027ec7ddaa56f8f8e19a5fe24cd,PolyForm-Small-Business-1.0.0
519a9c78964f52e27f4c01140a1a16da8e2,0ee2f2bd4e2f42da5d41d624e7ff4fc4,PostgreSQL
5200557f9d92cf58f2ccdd50f62f8ac0b28,d41d8cd98f00b204e9800998ecf8427e,Proprietary
521a5c8025e305fb49e6d405769358851f6,49f9f7282f1fe4dcae4afe86f844b8a0,Python-2.0
5228be2c269848c9d3043b76f2367c5c18a,eec6ca50c01adbf399d9a61a6bc48ea2,Python-2.0.1
523824e3ef3ffe56fe63fd0be5fadca32c3,8dc47edb2437a9e5d46c1bcccf35da04,QPL-1.0
524c14a5cf549e88da791409f5753801956,310c16690bb6e426a02f32ebba66690f,QPL-1.0-INRIA-2004
525ead0c25f1f54544531a30118cf0f1c0a,58a0327d9d8785c3e524fd0ed853e5df,Qhull
526188c8d0bb34589c566accc8322a90f28,e606e4762cac6d50e89d078e745d3a86,RHeCos-1
527e1ca9c263e0eb0d888ee6679bf8e8b14,1af44811172d3804915d838e30103c1d,RHeCos-1.1
528c59681d408c615434d0a6e492a7bddc7,d29df77122c12775a429b31186d9ddcd,RPL-1.1
5296e55b9520d6dadbecd149143b00455dc,6db57cb8ee9a94718fa91ebdb42f60b4,RPL-1.5
5305caf8a85d16fc7c611f34630a69540a0,87203daef2a7af15fb8fab37e5e7b8fb,RPSL-1.0
5319342e66a3fb8ddeebe449a85366f4acc,e3555909e0f98b734a5f3d12e7d06ea9,RSA-MD
5324e467e07f5ace155ec63e5c9b1f0ecd1,0e8aeecc25c085da3264d7eb5b9ad9b5,RSCPL
533d20ec9a5ed8bbd938bad4415b18f5596,0e5bb85604d88281e599f721d1a5a1c9,Rdisc
534105fc57d3f4d3122db32912f3e6107d0,8c29e44b4e22dbd92263adee7c429d3a,Ruby
5359aaa46b47300ef46019f32aa0f712863,8d60c1af906ce8087bbd9dd16d59b74a,Ruby-pty
53681ff49c3141b3ab7cd5e5ae49ecbc6a6,e95253f180e6e5214a894d15b261bea0,SAX-PD
537512c3addc6134e0d7f52d401f46c5da3,a5217487c4f69b0a9071a3f6ee371de4,SAX-PD-2.0
538116ebacb8f62900f2668fc68520b23da,83fc1994aa37501447b4aa6566deb605,SCEA
539269cdab4af6748677acce51d9aa13552,24f3435c81336185096b07ff97161689,SGI-1
540485f57c05469db83127ef16446766d4f,477969ebae2231d0a50c4315e0b31799,SGI-B-1.0
54197a5de7e45c7791fed51f0430da5e021,9dbc24f4bb94462b90e04e8cd634d678,SGI-B-1.1
5425f5dd7bd973dff1594131b1e9c7981f1,916d4009aa80c7ac430206c93b81e3f2,SGI-B-2.0
543ad615b66c99e4c238af0b584f7afcff0,24f3435c81336185096b07ff97161689,SGI-OpenGL
544cfc797903eced5f2dbc18b4ca5c661ca,f158d8930d5aaa7c45aa02e5fe7d9752,SGP4
54570f2c3d8942e777809af967d95c66876,2cb7aa611d5802bdf20459612a9e3dc6,SHL-0.5
546c29f611ea2c44bddf31d68a885cc5d9b,3fc3ce0e3f383601175b9ece8991541d,SHL-0.51
547fded06bff75eb4a2899bd051e2e128f5,3c2d54a5545454317b12dc598840124c,SISSL
548aa229f2c4e4966e222a3f04ff7a8083c,af9237b3cc8d0140afdd1b216be19e10,SISSL-1.2
549c003a0afa50574c0e5d8ef15db47f485,cfc5c171aaaa1b15bae2091431293376,SL
550785f3688caca0adb413cd39878d0411f,e6f0bbe09a360be66a8f4c7a8cc5b6ca,SMAIL-GPL
5510a05801c8261ddd5a92e1d9b764d5ad3,57279658cff1c854b4dcc351db8911e8,SMLNJ
552cde69c935d39daae103c6ca3bd5f759d,c55513ec50471ff59e7c5094d18b961a,SMPPL
553e0a34c06921abf8464e4e60b7097fc64,fcc142f831cd339a48df42832e750bf7,SNIA
5547bd50a8db20e7709b9d8b2b5cd7a976a,175baeadc4129618349c094cad51f656,SOFA
555ecfc027911d191ac143b128048e03420,61b62ce91f6b85009f42c32a933d16a2,SPL-1.0
5563af632aae8cf01feb6ce2ed44bb7ed2e,56532bf496acc335f976de368efa7abd,SSH-OpenSSH
557b73783010a430cadaabdc8ec0c0748f8,69f1b33406f2d92decf5956fdbd638d6,SSH-short
55856e74f394dd55a69ce0b057350fa5304,7f7ef97af947beb41fa9ab12e57f8f93,SSLeay-standalone
559684260b3c3c7bf281830da24273d7401,04807169fce241fe8dda04adc443b42b,SSPL-1.0
560f17a4211b3230b802f938ab9501621da,360efa92bc80dd9626c69329c826b575,SUL-1.0
561e332583a335d1c483a9a765eda62ce51,01b2a4f570834a8b51d67174a689832c,SWL
562d8cb48d540d878b981f2f6b8c09f8107,8a411c74a4ab26891711e54cb8ef8852,Saxpath
563dfeb820efcbad7d8e6989cb325cb248d,2443746cf43e547f1583f312dc61bf39,SchemeReport
5648037c42e05a5d4bfce06a44729fb6f1a,0d84f0dcecbbf49629343abd425d6302,Sendmail
5659e4f9cb55403f300a83fb063d1bf1833,3ef30ef6c7f915f6e3654db4fbe185c6,Sendmail-8.23
566fdf91f1d73bf4ec43ffdf7ad17fe94c5,f400482ec76bc2156403267812ea936e,Sendmail-Open-Source-1.1
5674867a4ecc3b7a760c1e7808a34a58587,56ff0af4b830578ed24ac0cb1dd90cdf,SimPL-2.0
56815fb3db10a51d0e9ab512a93c9f62925,0f11a1d66eed5c430f1ed0e3b0136b42,Simple-2.0
5691cbb64231c94198653282f3ccab88ffb,059330d234201d2a4b2d1b738c8e1469,Sleepycat
570177c45ca43174182b737695c6e52155f,660c269baa9d03cfa328507b5af52a45,Soundex
57197ba797de74f88a17676473fab224843,46ca8e5422d3b7b20ae0160864697b64,Spencer-86
5720e15cb5da9d4f3d5fa9cfa353c837150,c9699cba21831920edefc06fd6989400,Spencer-94
573ddb159145fcbc01a88734aab1cb59174,52de446c91fed673521a04fbb2a90e96,Spencer-99
57440588981e1072d3175e79de8e95d3fb0,6867e4c02d47fd828e5b968ab7f36dd8,SugarCRM-1
5756c0ff3dae045b3a23cc028a090a7e5b8,d7a07cab76bcd7eea3280665947dd1dc,SugarCRM-1.1.3
576c5e1a3a8067021f96be2ccb79e3459a7,b15d93816251f22593cd6eb6eeabe0ac,Sun-PPP
57779a54221d7746e702773f0b6ebebef59,d7a2fdabc12a2ee0027e08827993eff9,Sun-PPP-2000
578496178eb098fe34dcf2e5226de2933cc,d77f34e7d946740c87c9ba032ab7492c,SunPro
579fecccd8da2021ad4a4f54e86236452f2,0adcd10fd66b3342b4aa329e5d90be19,Symlinks
5808fce5ee68aa617ceaffa5fe6aa788492,68590670f8b00607e54f6530adf30cc5,TAPR-OHL-1.0
5815f7b23ac10d8f7cde16737bc896bb6fb,7abe1bfad7b02e80b9d3459ad4b76c7d,TCL
58283b1f59c3c52689f5652193e0cd5b1cf,a350ee7368673c19e2dbe602475bf205,TCP-wrappers
5831be547628b0c0cf4022622da86257bce,285e050ac62fa1ec1a9ad97db7c3a82a,TGPPL-1.0
58426811b5196ae54d9ac179032300a411e,3187b61256e142f83efa506a030b72f0,TMate
5854c6793f966f41313b86a41f9322ee887,c7e90419a67270dcb5adba0f022b02a4,TORQUE-1.1
586d91547d52af2576c8050a25f4a8cf296,e3649062502ed323eae700825dd7e8a1,TOSL
587beb969cfda4b6aeb68e2593b4ee7fd1a,6e1f5eedd2966c256e160d9fa3f49702,TPDL
588b7b790a5ab275fdfba45d3cd0015ba90,5d23d55a60f44af9868ea5ae0b10a5e8,TPL-1.0
589914672cc1a5dfedf2d03c57103b9d90a,c083506793bebd54fd2d308d48825e48,TTWL
590a09524fbcb4492566d267eb7a2e51dba,30ebde21ca8106eab1275b4a18f897ca,TTYP0
591919f113fcb44c5df8b732d335ebb2797,0d5c9d71df8966b26bed102b4bc7a87d,TU-Berlin-1.0
592db8d48938582bc7b10c608728da229d1,8387ce0bdb75baf0759248dab06472a5,TU-Berlin-2.0
5938b2cac5e826b2ba6648efa311c1b976a,2f6ee08d9d977a4291f9c825f507de9a,TermReadKey
594812fa71c163a43fc2e72e5607f66743e,6f545babeeb59324d1d98319284baa01,ThirdEye
5950812f8cbc63a5d6e49171080528f0b7a,de9cae2717dfcbf8dd7d19ecbf80d06a,TrustedQSL
596556bf12c00de0a86f7ea8a6c553e648c,cb6e062b5ffcb133dcab427dfb6f9bac,UCAR
5976363734dbce8fd58d7c497ae65b16cdf,a3ea42560c645e3803e67a48e6ebfacf,UCB
5980ce1025be0c66b99b205fe41dc9a623a,3343b2387459d7cdfdcfbe257706d123,UCL-1.0
599162895d33fd19ceb38742c7aa1d23253,74f157fce158966f1f964de7c89467b7,UMich-Merit
6008189d67787b0c83874474b40ecec6262,ccf6b8a878dc3bdaf510fc8aa0f3da0f,UPL-1.0
6011402eb536be28a7f8efc4ad70d31650a,a55cd5644056d33549f5f40616964b73,URT-RLE
602325a1a9029112a2405e743c7f816427b,e5a547a862bdbf75d41a25167555cdac,Ubuntu-font-1.0
603548c7e11b6a9486e064814cf1c708e5b,c190ea42bb0b4dd088e2767c2317bfd5,Unicode-3.0
6040cf627bfee18ca2ff60e2988ac0feab0,a5c0362e7ae64779bd6258c1fdf9bfd0,Unicode-DFS-2015
605907371994d651afe53e98adc27824669,304930a2d54dd38028d513e52d9b8e93,Unicode-DFS-2016
606666362dc5dba74f477af0f44fb85bd22,3727b08671585f198cf22357c531fd5c,Unicode-TOU
6077d7d190ed3392030968ff6df8ac2d8f3,3b87cf93a1b2b0e0f44f0c7e5d24684f,UnixCrypt
6087246f848faa4e9c9fc0ea91122d6e680,ddc18131d6748374f0f35a621c245b49,Unlicense
609cf57633109a7eb219c619567dc61e6e3,258334b7f4a998970b221c514c4749c7,Unlicense-libtelnet
610742d768a9074ca92905222e6e1490bd4,0b1c173586d60ca6038206752335bc6f,Unlicense-libwhirlpool
611d97a6df8bcb5a3ffd6932e9ad9e3f6b6,711538e1db373d2dc8a17f0441a6b504,VOSTROM
6125569e16f406c52cda34c6707068fd2da,94b151cdf8db5791e7b051da538fb01e,VSL-1.0
613676d28582e2dca824e7e309a9865eeb1,69bc575ac94ecd5d7b713110c86300db,Vim
6144b1d0384b406508a63e51f7c69687700,2acd38e47489dc47bf5740438c7f3063,W3C
6158e1670967a54b3eb1c60afea27ad2837,1ce603391ed10773b1e3765ff78ab232,W3C-19980720
6169ff23a699fca546a380855dd40d12d4f,714b5db7e02b76c0c01518e854e06734,W3C-20150513
6177993e3336259bdb618ad5a1afc872165,51f9570ff32571fc0a443102285c5e33,WTFPL
6189cd2300481960fbf3551fee571e0df12,470c88534a79e1a705309aad3aa400a5,WXwindows
619f84539e411677753163564553d0314f4,b780b12627c7975a418d3aa1218ceb49,Watcom-1.0
620bf6a2f5cba0ff0204ace681719b582e9,b450ff15de997bb5669f2d24491825fd,Widget-Workshop
62158d6eb73a04d4011a4dfdded022807e9,f174faaef2b124b6c1250ecb0c37ee16,Wsuipa
62287f08485cf6ba3c63a00eda8ecba7f1d,b45f72052756cd307ce6ba872b785eca,X11
623c2e3edd9db5f153aea61684e5b37cfbf,165ac1e8caf2ef3eeaf005491be4cc41,X11-distribute-modifications-variant
6249f4e3e1a80d1e82f127d109fa4805c66,96e33e29fceea65b19c73ed2f4120181,X11-swapped
625a7f2ef6cf86decfa93ef9f759b59d566,05ee2828345013f055526a766ed6d2fa,XFree86-1.0
626eabd0ee63562be8b63dcf842f2ff7932,b8c4ae332dced1096574e73c1b979a3d,XFree86-1.1
627a6eeeed43d498c22a835382533356462,9aa82f0382f331b25b8174d489be42ec,XSL
62889cdf2938f9fba06ef01be9d75801a54,539b4296e726bf27fd6014ce94adb939,XSkat
629afd6ce4aa04fdc346e5b3c6e634bd75c,8baca7df3c92fcee1e34874659db5611,Xdebug-1.03
630a3bc2710d63fa2d3b31618271833da3d,a067f7bee147ac22bc8c18d1398d2ddb,Xerox
631a8ef97bc6fedc2b816a4bd3207cbb46d,616c2dac252df4b20c67d8da04d53caa,Xfig
6321d7133ce407ae41a40678ce53fe146cc,d698f7a4c891a71ffb35cb8526c6aa9a,Xnet
633f89765972ccf05ec2c6727775bbd35e6,38b6cc7f7f20031beb631eb2d1dcdc34,YPL-1.0
634f4abd544e57b717e3211a8f71fb78051,b64449fd75b91c7d8d6d660af6ad14c9,YPL-1.1
6351773e417ed280d37fb3d4ecadb61d2c4,b1b030703b19f3a6623ef902ae917026,ZPL-1.1
636292e8c58674d178944fa3c553a574ab3,4717ee4f01eb9b3fdba8a26e581e5acc,ZPL-2.0
6375166e505dd5e2073ab1f97b1a6b31755,23537d8718f7272035c42e7d1252ae98,ZPL-2.1
638d7f86b208ceac65fdbe19b2b9fcf4b28,49a13756a1f1837270d2ac563da967d3,Zed
63947e13823470b439985e7fa80cc85c6b5,b1330e9ebd1acfb5a815acf766f3def6,Zeeff
6401862e5c7c0a6fc7198e4e11f1d58a8ed,3259a4952ae58ea6e6bc012c2ca5be29,Zend-2.0
641fe2ad80d298893f7c3958dc8cd5560b2,dc9897ce050c3b3322ec5ca7d30ce431,Zimbra-1.3
6421d4b5ff798479b5b920b5a2d19a65efd,c7351735a3495e187b4c9e0b3a6cf6ca,Zimbra-1.4
64387f239f408daca8a157858e192597633,54c4ac0824d6ba7e86f0b7bfd1ac18df,Zlib
644fa23c7c35cf60c445d692b5f2b9bebb4,f4b560e7179176736751c1315622239e,any-OSI
6452e3ab8ad22a14baf7f2cab05491e90df,041aee3e6d508e2f06b3cea232a0e654,any-OSI-perl-modules
646932d525edeb2c77749ad6e52cbaeee78,96beca5c7a6f235808dc4aba12347722,bcrypt-Solar-Designer
647d5407b61870d6dc19d0bdc04ae4cc654,d8cad04905f692aed0b29aca3e83472e,blessing
648452e1b423688222dcfc3cb9462c92902,b2b9a3d407940d88d2bcc5e7fd423c46,bzip2-1.0.4
649ac3866fa352ea7b071a9e93172e66dd5,55b9555f2b7511628387c79696346c45,bzip2-1.0.5
650841c5495611ae95b13e80fa4a0627333,857893777f97291378fd06dffa465401,bzip2-1.0.6
651ea85d39f14acb58cd6aaa3f2acca1ae7,146a15645c6ae9d856e1d0150e54f7d6,check-cvs
65284745a13ba01ae1b167be3ab2140d6c1,3baa9ccec750a8af7da86a36d610d454,checkmk
6538743a2c359037d4d329a31e79eabeffe,79a4d3a605479f92b18359dd5c3c19c1,copyleft-next-0.3.0
654963c6a9e5347d93674eda37494dee7f8,8bfb8ae9e5164b7fb0518487928c1226,copyleft-next-0.3.1
655f7adb1397db248527ffed14d947e445c,e927d8f7ba623c521404737eea89cee5,curl
6564f7e96b3094e80e66b53359a8342c7f8,e7877095b81f07f56437c387ce9d79fe,cve-tou
6577726eda4b16466f32b70b16bfdb5eb0a,a074419f000fb52c1903f2bcb969b46c,diffmark
658be6fc1d823096aae1cf8ef94b3993684,962022e6afd1efc211de4a546d2babbc,dtoa
659b0566961d94a087aad56740181a35527,fe0f64c32d5cf023cc4b70d77ba401e1,dvipdfm
6608c3ea41d02fa9c9253c692351e5940e7,57889afa060098497c6ed55d716d57a1,eCos-2.0
6611d1e8bc7e9a4c17f74f873850b116618,a0531496681c23f1049f467da1d12308,eGenix
6627cbd681f5f0006d6611ac0ebb9ef1816,de29885911779edc8d7bc9b80db20663,etalab-2.0
6631229543e58da3aa29640175d8ca83708,099856300d10b40a8ae99d741f30cd09,fwlw
6640e617697318e3f050743deb4b9b817da,3aa6d4a31d3f3efed7fc2fbdd84e1e30,gSOAP-1
665530c4ffdf84728fd9a65f868ad4ea7ba,0d9fdf1c0bdddd82518f8a9f84c36ddd,gSOAP-1.3b
6662b3268bea8a42f8709165b74ceec4e5e,c7c8bb01f857cf64a834cc4be270a0f4,generic-xts
66762bdcd9066e57359cd473e6b7cf69bd3,a9c439da80f7bc78603e1a2fdea6c246,gnuplot
6684ca4cbd038f22426bb727ae95d96ba2a,dc3651e0ba376a5b47144c24d9f31646,gtkbook
669910a8a42c962d238619c75fdb78bdb24,94029bef242b1756062d249fb6f551a5,hdparm
670bf8e6fec4cb56805c785ffff285cd21f,5ef6c94654dfd428bcd3f9c9c4182846,iMatix
6711644bdf53b9cadfd00f3d6ba15d2f545,000295cba6d64a343fa634e19c5b918d,jove
672262530e5f891393eebc9d07985d53069,64ef8758829e73955cf90b219d3bfdcc,libpng-1.6.35
6739a1fb0fb6574c976ad51dfe77a0b89a3,1e9b7704d6bf72ab4d614ae76f7a8229,libpng-2.0
67484b4d2c6ef954a2d4081e775a270d0d0,3aed74ef626d859f44cfe6987e28a04c,libselinux-1.0
675b99383975855adc28712577c9cd56485,5dd33ac6c9b110cadd0c990592c7f88e,libtiff
676fb531b96a550524e6a1d48b47aef72ff,b92fcc0c7448f2e19478b4a28ba5c8a5,libutil-David-Nugent
677a48ac97a8550eff12395a2c0d6151510,1cbd5dda4c51217dcf2593cceab59ce3,lsof
678593383ab37318cb9c75643ca3e97f559,f7608c1f0f4a4ea415c25e8e53ecc470,magaz
6795efe0bed4acb0678f1a1f5fd07ae5293,a6bd6d8635ae64a314bca301427314f0,mailprio
680ad44af994f0cb873fd44f7a856acc853,ee9c6a714194739a34edfea11b57aa6d,man2html
681da4ff3fe2e916d13df8a0b14de6388c2,3f2f9d00bd7b898edd31f8096b9beff6,metamail
682a543f980b9fb80af227a3fa03c241905,df10b60c029462b2ded6858e3e197845,mpi-permissive
683f30403bda2a18f780f897079cd662d57,3046c3d3920a545e68856f49fcd53c52,mpich2
6842652a6ac3cde957b21368aa25b1a576e,183500e9955e364fef6a25c3b277abef,mplus
685eaf9fb42ed6abba6bdc21715b8917b4d,9977302a1d5a1a5d64185965820699a5,ngrep
686548a9d1db10cc0a84810c313a0e9266f,ecbc678102cf1a2d61cb21006956e17a,pkgconf
687e14886beeaa5ab2e4c00b878baf40ce2,b1ab7faf11a78808cb4e2ad833bd0b1f,pnmstitch
688512a10c9665b4efb9a18d0591d0d2295,b9fe28fad09b7c8c4aa7e08ac667deac,psfrag
68929046009c1f269661e7b74196fb8f6a0,81f1bbaa03a54120cced4dd994e6b33e,psutils
690782dd6656b46553a0e38348499af3767,dc12176d21fb329f5c30c989f7377561,python-ldap
6914e5d572d355f0baae973d1310e8e6a61,3017374c8c99e54706b4048868292d6c,radvd
692ae60d0d87ae6c850a95fa29d55a70fde,b8dca745a483757c28e03af215c4e3ad,snprintf
69396f1b00888f013ce243609e19aeb8c5d,06072a97f481fdfb0a8c36e3636a6698,softSurfer
694b195ba35061e1e01334392047ccb0da5,9447b52005aad52ca2e210001807f42e,ssh-keyscan
695a96f3252d1c7fbb544b2ff8d228c8003,242c5479dd98eefecfec4d9415be5d36,swrule
6969a10f2bb34f06910a4c70916c9eac9b7,556b686b959bb8b8a9ed27eaa9c3fc8c,threeparttable
6976c33c3447b7881c3014750de6da3e896,2016e16a5f4bfb54f64f2f7586c02ef5,ulem
6989475885294e17c0cc0067820d042792e,d285c1751e33a2766d3efd0dc86b1dc7,unfs3
699741f8e7f6c137991b5753284d52e855e,aadb0e8bf5e30a82d203b151dfda00dd,w3m
700255e0b146f0de41a5845a093a98e12b1,8e91d527b31c7e66fe3fb31549ff9811,wwl
7012f1142c57bde236bb44607b0207636a9,8fcf095dd512fdffd1198ab597089112,xinetd
702198b03cbacc6a6d98e82baa0b589daa9,7eebfa2414401417a986930f81d82122,xkeyboard-config-Zinoviev
70310b126d9261b563f2dfb8edf14db9876,ed0b21d166e2bc93fcbff3be1adfe0b5,xlock
70447ed22fa8e5b1ca0cc42ea9c1c1f3aee,4d443e8b2516b6c0d36849888d029844,xpp
705a9a8ccd7329608692e82ffeeb8e48257,fafdeee0fe31adf25821fb08ea790702,xzoom
706c76c64e2cf99efcfb5e2b26aa86b12e6,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
12import hashlib
13import os
14import re
15import sys
16
17
18def squashspaces(s):
19 return re.sub(r"\s+", " ", s).strip()
20
21
22def 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
77def 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
85def 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
98def 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
118if __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
56import argparse 56import argparse
57import concurrent.futures 57import concurrent.futures
58import csv
59import fnmatch
58import hashlib 60import hashlib
59import io 61import io
60import json 62import json
@@ -66,6 +68,7 @@ import sys
66import tempfile 68import tempfile
67import textwrap 69import textwrap
68import threading 70import threading
71import zipfile
69from pathlib import Path 72from pathlib import Path
70from typing import Dict, List, Optional, Set, Tuple 73from typing import Dict, List, Optional, Set, Tuple
71from datetime import datetime, timedelta, timezone 74from 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
4398LICENSE_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
4403LICENSE_SKIP_EXTENSIONS = ('.html', '.js', '.json', '.svg', '.ts', '.go', '.sh')
4404
4405
4406def _squashspaces(s: str) -> str:
4407 return re.sub(r"\s+", " ", s).strip()
4408
4409
4410def _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
4461def _md5_bytes(data: bytes) -> str:
4462 return hashlib.md5(data).hexdigest()
4463
4464
4465def _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
4486def _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
4504def _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
4515def _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
4542def _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
4552def _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
4557def _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
4615def _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
4627def 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
4665def _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
4670def _tidy_licenses(licenses: Set[str]) -> List[str]:
4671 """Sort and deduplicate license names."""
4672 return sorted(licenses - {'Unknown'}, key=str.casefold)
4673
4674
4675def 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
4752License 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
4388Examples: 4763Examples:
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}"