From 73037a404821a9aa8daf5437e98e9d10f1d0ab8d Mon Sep 17 00:00:00 2001 From: Enguerrand de Ribaucourt Date: Mon, 25 Aug 2025 15:29:47 +0200 Subject: [PATCH 1/5] add support for BitBake language BitBake is the language of the Yocto Project, used to create Linux distributions for embedded systems. --- README.md | 1 + cloc | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/README.md b/README.md index 2a8f6adc..3e516f79 100644 --- a/README.md +++ b/README.md @@ -1066,6 +1066,7 @@ Asymptote (asy) AutoHotkey (ahk, ahkl) awk (auk, awk, gawk, mawk, nawk) Bazel (BUILD) +BitBake (bb, bbappend, bbclass) BizTalk Orchestration (odx) BizTalk Pipeline (btp) Blade (blade, blade.php) diff --git a/cloc b/cloc index 54bf215a..481a06c8 100755 --- a/cloc +++ b/cloc @@ -9765,6 +9765,9 @@ sub set_constants { # {{{1 'zig' => 'Zig' , 'zsh' => 'zsh' , 'rego' => 'Rego' , + 'bb' => 'BitBake' , + 'bbappend' => 'BitBake' , + 'bbclass' => 'BitBake' , ); # 1}}} %{$rh_Language_by_Script} = ( # {{{1 @@ -11667,6 +11670,10 @@ sub set_constants { # {{{1 [ 'remove_matches' , '^\s*#' ], [ 'remove_inline' , '#.*$' ], ], + "BitBake" => [ + [ 'remove_matches' , '^\s*#' ], + [ 'remove_inline' , '#.*$' ], + ], ); # 1}}} %{$rh_EOL_continuation_re} = ( # {{{1 @@ -12269,6 +12276,7 @@ sub set_constants { # {{{1 'Yang' => 3.00, 'Zig' => 2.50, "Rego" => 1.00, + "BitBake" => 1.00, # aggregates; value is meaningless 'C#/Smalltalk' => 1.00, 'D/dtrace' => 1.00, From 74488435a510b87de8dcaac8564b54d9b43e4a37 Mon Sep 17 00:00:00 2001 From: Enguerrand de Ribaucourt Date: Mon, 25 Aug 2025 15:41:11 +0200 Subject: [PATCH 2/5] add bitbake test files Add the hello recipe from meta-skeleton and ensure it is properly counted. --- Unix/t/00_C.t | 5 +++++ tests/inputs/hello_1.0.bb | 18 ++++++++++++++++++ tests/outputs/hello_1.0.bb.yaml | 20 ++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 tests/inputs/hello_1.0.bb create mode 100644 tests/outputs/hello_1.0.bb.yaml diff --git a/Unix/t/00_C.t b/Unix/t/00_C.t index eb6f4e5d..78794d53 100755 --- a/Unix/t/00_C.t +++ b/Unix/t/00_C.t @@ -102,6 +102,11 @@ my @Tests = ( 'ref' => '../tests/outputs/BUILD.yaml', 'args' => '../tests/inputs/BUILD', }, + { + 'name' => 'BitBake', + 'ref' => '../tests/outputs/hello_1.0.bb.yaml', + 'args' => '../tests/inputs/hello_1.0.bb', + }, { 'name' => 'BizTalk Orchestration', 'ref' => '../tests/outputs/ProcessPO.odx.yaml', diff --git a/tests/inputs/hello_1.0.bb b/tests/inputs/hello_1.0.bb new file mode 100644 index 00000000..f286e62a --- /dev/null +++ b/tests/inputs/hello_1.0.bb @@ -0,0 +1,18 @@ +# Hello world from meta-skeleton +DESCRIPTION = "Simple helloworld application" +SECTION = "examples" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +SRC_URI = "file://helloworld.c" + +S = "${WORKDIR}" + +do_compile() { + ${CC} ${LDFLAGS} helloworld.c -o helloworld +} + +do_install() { + install -d ${D}${bindir} + install -m 0755 helloworld ${D}${bindir} +} diff --git a/tests/outputs/hello_1.0.bb.yaml b/tests/outputs/hello_1.0.bb.yaml new file mode 100644 index 00000000..2ff8b9ad --- /dev/null +++ b/tests/outputs/hello_1.0.bb.yaml @@ -0,0 +1,20 @@ +--- +# github.com/AlDanial/cloc +header : + cloc_url : github.com/AlDanial/cloc + cloc_version : 2.07 + elapsed_seconds : 0.00875091552734375 + n_files : 1 + n_lines : 18 + files_per_second : 114.273757628596 + lines_per_second : 2056.92763731473 +'BitBake' : + nFiles: 1 + blank: 4 + comment: 1 + code: 13 +SUM: + blank: 4 + comment: 1 + code: 13 + nFiles: 1 From c7f266411f42cdf3626f65523c01cdaa89fc5bcd Mon Sep 17 00:00:00 2001 From: Enguerrand de Ribaucourt Date: Mon, 25 Aug 2025 16:33:20 +0200 Subject: [PATCH 3/5] add BitBake to .inc multi-language disambiguation BitBake shares this extension with other languages. Add some logic to distinguish them using idiomatic markers. --- README.md | 4 ++-- cloc | 55 +++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 3e516f79..49c7fe5e 100644 --- a/README.md +++ b/README.md @@ -1260,7 +1260,7 @@ peggy (peggy) Perl (ack, al, cpanfile, makefile.pl, perl, ph, plh, plx, pm, psgi, rexfile, pl, p6) Pest (pest) PHP (aw, ctp, phakefile, php, php3, php4, php5, php_cs, php_cs.dist, phps, phpt, phtml) -PHP/Pascal/Fortran/Pawn (inc) +PHP/Pascal/Fortran/Pawn/Bitbake (inc) Pig Latin (pig) PL/I (pl1) PL/M (lit, plm) @@ -1415,7 +1415,7 @@ These file extensions map to multiple languages: * `fnc` files could be Oracle PL or SQL * `for` files could be Fortran 77 or Forth * `fs` files could be F# or Forth -* `inc` files could be PHP or Pascal +* `inc` files could be PHP, Pascal or BitBake * `itk` files could be Tcl or Tk * `jl` files could be Lisp or Julia * `lit` files could be PL or M diff --git a/cloc b/cloc index 481a06c8..d311dbe6 100755 --- a/cloc +++ b/cloc @@ -822,7 +822,7 @@ my %Extension_Collision = ( 'Pascal/Pawn' => [ 'p' ] , 'Pascal/Puppet' => [ 'pp' ] , 'Perl/Prolog' => [ 'pl', 'PL' ] , - 'PHP/Pascal/Fortran/Pawn' => [ 'inc' ] , + 'PHP/Pascal/Fortran/Pawn/BitBake' => [ 'inc' ] , 'Raku/Prolog' => [ 'p6', 'P6' ] , 'XML-Qt-GTK/Glade' => [ 'ui' ] , 'TypeScript/Qt Linguist' => [ 'ts' ] , @@ -6809,17 +6809,17 @@ sub classify_file { # {{{1 'failure in matlab_or_objective_C($full_file)'; return $language; # (unknown) } - } elsif ($Language_by_Extension{$extension} eq 'PHP/Pascal/Fortran/Pawn') { - my $lang_F_or_P_or_P = ""; - php_pascal_fortran_pawn($full_file , + } elsif ($Language_by_Extension{$extension} eq 'PHP/Pascal/Fortran/Pawn/BitBake') { + my $lang_F_or_P_or_P_or_B = ""; + php_pascal_fortran_pawn_bitbake($full_file , $rh_Err , $raa_errors, - \$lang_F_or_P_or_P); - if ($lang_F_or_P_or_P) { - return $lang_F_or_P_or_P; - } else { # an error happened in php_pascal_or_fortran() + \$lang_F_or_P_or_P_or_B); + if ($lang_F_or_P_or_P_or_B) { + return $lang_F_or_P_or_P_or_B; + } else { # an error happened in php_pascal_fortran_pawn_bitbake() $rh_ignored->{$full_file} = - 'failure in php_pascal_fortran_pawn($full_file)'; + 'failure in php_pascal_fortran_pawn_bitbake($full_file)'; return $language; # (unknown) } } elsif ($Language_by_Extension{$extension} eq 'Pascal/Puppet') { @@ -6934,6 +6934,9 @@ sub classify_file { # {{{1 } else { return $language; # (unknown) } + } elsif ($Language_by_Extension{$extension} eq 'Text/BitBake') { + my $lang_t_or_b = ""; + return Text_or_BitBake($full_file, $rh_Err, $raa_errors); } else { return $Language_by_Extension{$extension}; } @@ -9108,7 +9111,7 @@ sub set_constants { # {{{1 'ig' => 'Modula3' , 'il' => 'SKILL/.NET IL' , 'ils' => 'SKILL++' , - 'inc' => 'PHP/Pascal/Fortran/Pawn', + 'inc' => 'PHP/Pascal/Fortran/Pawn/BitBake' , 'ino' => 'Arduino Sketch' , 'ipf' => 'Igor Pro' , #'pde' => 'Arduino Sketch' , # pre 1.0 @@ -10818,7 +10821,7 @@ sub set_constants { # {{{1 [ 'rm_comments_in_strings', '"', '//', '' ], [ 'call_regexp_common' , 'C++' ], ], - 'PHP/Pascal/Fortran/Pawn' => [ [ 'die' , ], ], # never called + 'PHP/Pascal/Fortran/Pawn/BitBake' => [ [ 'die' , ], ], # never called 'Mako' => [ [ 'remove_matches' , '##.*$' ], ], @@ -12284,7 +12287,7 @@ sub set_constants { # {{{1 'Fortran 77/Forth' => 1.00, 'Lisp/Julia' => 1.00, 'Lisp/OpenCL' => 1.00, - 'PHP/Pascal/Fortran/Pawn' => 1.00, + 'PHP/Pascal/Fortran/Pawn/Bitbake' => 1.00, 'Pascal/Puppet' => 1.00, 'Perl/Prolog' => 1.00, 'Raku/Prolog' => 1.00, @@ -12557,7 +12560,7 @@ printf "END LOOP obj C=% 2d matlab=% 2d mumps=% 2d mercury= % 2d\n", $obje if $opt_v > 2; } # 1}}} -sub php_pascal_fortran_pawn { # {{{1 +sub php_pascal_fortran_pawn_bitbake { # {{{1 # Decide if code is Fortran, PHP, Pascal, Pawn my ($file , # in $rh_Err , # in hash of error codes @@ -12585,6 +12588,13 @@ sub php_pascal_fortran_pawn { # {{{1 # lines ending with ; # has /* ... */ style comments # writeln + # + # BitBake: + # some lines start with variables: SRC_URI, SRC_REV, SUMMARY, LICENSE, DEPENDS, RDEPENDS, LIC_FILES_CHKSUM + # some lines start with tasks: do_compile, do_install, do_configure, python + # some lines start with include, require, inherit statements + # contains .=, =., ?=, ??= operators + # contains :... = assignments ${$rs_language} = ""; my $IN = open_file('<', $file, 1); @@ -12600,6 +12610,7 @@ sub php_pascal_fortran_pawn { # {{{1 my $php_points = 0; my $pascal_points = 0; my $pawn_points = 0; + my $bitbake_points = 0; while (<$IN>) { if (/^\s*<\?php/i) { $php_points += 100; @@ -12638,13 +12649,25 @@ sub php_pascal_fortran_pawn { # {{{1 /^\s*(end\s+)?(interface|type|function|module)\b/i) { ++$fortran_90; } + if (/^\s*(SRC_URI|SRC_REV|SUMMARY|LICENSE|DEPENDS|RDEPENDS|LIC_FILES_CHKSUM)\s*=/i or + /^\s*(do_compile|do_install|do_configure|python)\b/i or + /^\s*(inherit|include|require)\b/i) { + ++$bitbake_points; + } + if (/\.=/i or /=\./i or /\?=/i or /\?\?=/i) { + ++$bitbake_points; + } + if (/^[A-Z0-9_:-]+:[A-Za-z0-9_-]+\s*=/) { + ++$bitbake_points; + } } $IN->close; my %points = ( 'Fortran' => $fortran_points , 'PHP' => $php_points , 'Pascal' => $pascal_points , - 'Pawn' => $pawn_points , ); + 'Pawn' => $pawn_points , + 'BitBake' => $bitbake_points , ); ${$rs_language} = (sort { $points{$b} <=> $points{$a} or $a cmp $b } keys %points)[0]; if (${$rs_language} eq 'Fortran') { @@ -12655,8 +12678,8 @@ sub php_pascal_fortran_pawn { # {{{1 } } - print "<- php_pascal_fortran_pawn($file: fortran=$fortran_points, php=$php_points, ", - "pascal=$pascal_points, pawn=$pawn_points) => ${$rs_language}\n" + print "<- php_pascal_fortran_pawn_bitbake($file: fortran=$fortran_points, php=$php_points, ", + "pascal=$pascal_points, pawn=$pawn_points, bitbake=$bitbake_points) => ${$rs_language}\n" if $opt_v > 2; } # 1}}} From 45d7651d1b0dde97ca8fee16ddcc9561abb4ef6f Mon Sep 17 00:00:00 2001 From: Enguerrand de Ribaucourt Date: Mon, 25 Aug 2025 17:22:07 +0200 Subject: [PATCH 4/5] add BitBake to .conf multi-language disambiguation BitBake uses conf files for layers, local and machine specific assignments. If we don't detect a BitBake marker, we leave it as unknown (the previous behavior). The detector function uses the same markers as PHP/Pascal/Fortran/Pawn/BitBake with a few added variables specific to layer.conf: BBFILE* and LAYER*. --- README.md | 2 ++ cloc | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 49c7fe5e..4a3e9654 100644 --- a/README.md +++ b/README.md @@ -1341,6 +1341,7 @@ Teamcenter mth (mth) Templ (templ) TeX (aux, bbx, bib, bst, cbx, dtx, ins, lbx, ltx, mkii, mkiv, mkvi, sty, tex, cls) Text (text, txt) +Unknown/BitBake (conf) Thrift (thrift) TITAN Project File Information (tpd) Titanium Style Sheet (tss) @@ -1409,6 +1410,7 @@ These file extensions map to multiple languages: * `cj` files could be Clojure or Cangjie * `cl` files could be Lisp or OpenCL * `cls` files could be Visual Basic, TeX or Apex Class +* `conf` files could be BitBake or plain text * `cs` files could be C# or Smalltalk * `d` files could be D or dtrace * `f` files could be Fortran 77 or Forth diff --git a/cloc b/cloc index d311dbe6..dfe01dad 100755 --- a/cloc +++ b/cloc @@ -831,6 +831,7 @@ my %Extension_Collision = ( 'Scheme/SaltStack' => [ 'sls' ] , 'SKILL/.NET IL' => [ 'il' ] , 'Clojure/Cangjie' => [ 'cj' ] , + 'Unknown/BitBake' => [ 'conf' ] , ); my @Autogen_to_ignore = no_autogen_files($list_no_autogen); if ($opt_force_lang_def) { @@ -6934,9 +6935,9 @@ sub classify_file { # {{{1 } else { return $language; # (unknown) } - } elsif ($Language_by_Extension{$extension} eq 'Text/BitBake') { + } elsif ($Language_by_Extension{$extension} eq 'Unknown/BitBake') { my $lang_t_or_b = ""; - return Text_or_BitBake($full_file, $rh_Err, $raa_errors); + return really_is_BitBake($full_file, $rh_Err, $raa_errors); } else { return $Language_by_Extension{$extension}; } @@ -9771,6 +9772,7 @@ sub set_constants { # {{{1 'bb' => 'BitBake' , 'bbappend' => 'BitBake' , 'bbclass' => 'BitBake' , + 'conf' => 'Unknown/BitBake' , ); # 1}}} %{$rh_Language_by_Script} = ( # {{{1 @@ -12296,6 +12298,7 @@ sub set_constants { # {{{1 'IDL/Qt Project/Prolog/ProGuard' => 1.00, 'SKILL/.NET IL' => 1.00, 'Clojure/Cangjie' => 1.00, + 'Unknown/BitBake' => 1.00, ); # 1}}} %{$rh_Known_Binary_Archives} = ( # {{{1 @@ -13396,6 +13399,46 @@ sub Clojure_or_Cangjie { # {{{1 return "Cangjie"; } } # 1}}} +sub really_is_BitBake { # {{{1 + my ($file , # in + $rh_Err , # in hash of error codes + $raa_errors , # out + ) = @_; + + print "-> really_is_BitBake($file)\n" if $opt_v > 2; + + my $lang = undef; + my $IN = open_file('<', $file, 1); + if (!defined $IN) { + push @{$raa_errors}, [$rh_Err->{'Unable to read'} , $file]; + return $lang; + } + my $text = 3; # Text is assumed if no BitBake markers are found + my $bitbake = 0; + while (<$IN>) { + next if /^\s*$/; + if (/^\s*(SRC_URI|SRC_REV|SUMMARY|LICENSE|DEPENDS|RDEPENDS|LIC_FILES_CHKSUM)\s*=/i or + /^\s*(BBFILE|LAYER).*\s*=/i or + /^\s*(do_compile|do_install|do_configure|python)\b/i or + /^\s*(inherit|include|require)\b/i) { + ++$bitbake; + } + if (/\.=/i or /=\./i or /\?=/i or /\?\?=/i) { + ++$bitbake; + } + if (/^[A-Z0-9_:-]+:[A-Za-z0-9_-]+\s*=/) { + ++$bitbake; + } + } + $IN->close; + + print "<- really_is_BitBake($file: Text=$text, BitBake=$bitbake\n" if $opt_v > 2; + if ($text > $bitbake) { + return undef; + } else { + return "BitBake"; + } +} # 1}}} sub html_colored_text { # {{{1 # http://www.pagetutor.com/pagetutor/makapage/pics/net216-2.gif my ($color, $text) = @_; From 7d2ba6038bc040a83d849d2621fe55cf3a539f4c Mon Sep 17 00:00:00 2001 From: Enguerrand de Ribaucourt Date: Mon, 25 Aug 2025 17:19:19 +0200 Subject: [PATCH 5/5] add multi-extension tests for BitBake language Add .inc and .conf files, shared with other languages to the test. cloc should properly categorize and count them as BitBake. I also ran the test with the pre-existing .inc files to make sure the previous languages were still properly detected. I added an "Unknown" test to distinguish the .conf extension. --- Unix/t/00_C.t | 13 +++++++++++-- tests/inputs/cpp-example.inc | 24 ++++++++++++++++++++++++ tests/inputs/layer.conf | 17 +++++++++++++++++ tests/inputs/xattr.conf | 22 ++++++++++++++++++++++ tests/outputs/bitbake.yaml | 20 ++++++++++++++++++++ tests/outputs/hello_1.0.bb.yaml | 20 -------------------- 6 files changed, 94 insertions(+), 22 deletions(-) create mode 100644 tests/inputs/cpp-example.inc create mode 100644 tests/inputs/layer.conf create mode 100644 tests/inputs/xattr.conf create mode 100644 tests/outputs/bitbake.yaml delete mode 100644 tests/outputs/hello_1.0.bb.yaml diff --git a/Unix/t/00_C.t b/Unix/t/00_C.t index 78794d53..b54efd34 100755 --- a/Unix/t/00_C.t +++ b/Unix/t/00_C.t @@ -104,8 +104,10 @@ my @Tests = ( }, { 'name' => 'BitBake', - 'ref' => '../tests/outputs/hello_1.0.bb.yaml', - 'args' => '../tests/inputs/hello_1.0.bb', + 'ref' => '../tests/outputs/bitbake.yaml', + 'args' => '../tests/inputs/hello_1.0.bb ' . + '../tests/inputs/cpp-example.inc ' . + '../tests/inputs/layer.conf ', }, { 'name' => 'BizTalk Orchestration', @@ -1406,6 +1408,13 @@ my @Tests = ( 'args' => '../tests/inputs/fractal.um', }, + { + 'name' => 'Unknown', + # No result will be produced, result.yaml will stay like the previous test + 'ref' => '../tests/outputs/fractal.um.yaml', + 'args' => '../tests/inputs/xattr.conf', + }, + { 'name' => 'USS', 'ref' => '../tests/outputs/USS.uss.yaml', diff --git a/tests/inputs/cpp-example.inc b/tests/inputs/cpp-example.inc new file mode 100644 index 00000000..ad374be9 --- /dev/null +++ b/tests/inputs/cpp-example.inc @@ -0,0 +1,24 @@ +# +# Copyright OpenEmbedded Contributors +# +# SPDX-License-Identifier: MIT +# + +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" + +DEPENDS += "json-c" + +PV = "1.0" + +SRC_URI = "\ + file://cpp-example.cpp \ + file://cpp-example-lib.hpp \ + file://cpp-example-lib.cpp \ + file://test-cpp-example.cpp \ + file://run-ptest \ +" + +S = "${WORKDIR}" + +inherit ptest diff --git a/tests/inputs/layer.conf b/tests/inputs/layer.conf new file mode 100644 index 00000000..0414fb51 --- /dev/null +++ b/tests/inputs/layer.conf @@ -0,0 +1,17 @@ +# We have a conf and classes directory, add to BBPATH +BBPATH .= ":${LAYERDIR}" + +# We have recipes-* directories, add to BBFILES +BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" + +BBFILE_COLLECTIONS += "skeleton" +BBFILE_PATTERN_skeleton = "^${LAYERDIR}/" +BBFILE_PRIORITY_skeleton = "1" + +# This should only be incremented on significant changes that will +# cause compatibility issues with other layers +LAYERVERSION_skeleton = "1" + +LAYERDEPENDS_skeleton = "core" + +LAYERSERIES_COMPAT_skeleton = "scarthgap" diff --git a/tests/inputs/xattr.conf b/tests/inputs/xattr.conf new file mode 100644 index 00000000..1affac56 --- /dev/null +++ b/tests/inputs/xattr.conf @@ -0,0 +1,22 @@ +# /etc/xattr.conf +# +# Format: +# +# +# Actions: +# permissions - copy when trying to preserve permissions. +# skip - do not copy. + +system.nfs4_acl permissions +system.nfs4acl permissions +system.posix_acl_access permissions +system.posix_acl_default permissions +trusted.SGI_ACL_DEFAULT skip # xfs specific +trusted.SGI_ACL_FILE skip # xfs specific +trusted.SGI_CAP_FILE skip # xfs specific +trusted.SGI_DMI_* skip # xfs specific +trusted.SGI_MAC_FILE skip # xfs specific +xfsroot.* skip # xfs specific; obsolete +user.Beagle.* skip # ignore Beagle index data +security.evm skip # may only be written by kernel +afs.* skip # AFS metadata and ACLs diff --git a/tests/outputs/bitbake.yaml b/tests/outputs/bitbake.yaml new file mode 100644 index 00000000..8f9a6f19 --- /dev/null +++ b/tests/outputs/bitbake.yaml @@ -0,0 +1,20 @@ +--- +# github.com/AlDanial/cloc +header : + cloc_url : github.com/AlDanial/cloc + cloc_version : 2.07 + elapsed_seconds : 0.0091090202331543 + n_files : 3 + n_lines : 59 + files_per_second : 329.343872690153 + lines_per_second : 6477.09616290635 +'BitBake' : + nFiles: 3 + blank: 15 + comment: 10 + code: 34 +SUM: + blank: 15 + comment: 10 + code: 34 + nFiles: 3 diff --git a/tests/outputs/hello_1.0.bb.yaml b/tests/outputs/hello_1.0.bb.yaml deleted file mode 100644 index 2ff8b9ad..00000000 --- a/tests/outputs/hello_1.0.bb.yaml +++ /dev/null @@ -1,20 +0,0 @@ ---- -# github.com/AlDanial/cloc -header : - cloc_url : github.com/AlDanial/cloc - cloc_version : 2.07 - elapsed_seconds : 0.00875091552734375 - n_files : 1 - n_lines : 18 - files_per_second : 114.273757628596 - lines_per_second : 2056.92763731473 -'BitBake' : - nFiles: 1 - blank: 4 - comment: 1 - code: 13 -SUM: - blank: 4 - comment: 1 - code: 13 - nFiles: 1