xref: /OK3568_Linux_fs/yocto/poky/meta/classes/oelint.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyunaddtask lint before do_build
2*4882a593Smuzhiyundo_lint[nostamp] = "1"
3*4882a593Smuzhiyunpython do_lint() {
4*4882a593Smuzhiyun    pkgname = d.getVar("PN")
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun    ##############################
7*4882a593Smuzhiyun    # Test that DESCRIPTION exists
8*4882a593Smuzhiyun    #
9*4882a593Smuzhiyun    description = d.getVar("DESCRIPTION", False)
10*4882a593Smuzhiyun    if description[1:10] == '{SUMMARY}':
11*4882a593Smuzhiyun        bb.warn("%s: DESCRIPTION is not set" % pkgname)
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun    ##############################
15*4882a593Smuzhiyun    # Test that HOMEPAGE exists
16*4882a593Smuzhiyun    #
17*4882a593Smuzhiyun    homepage = d.getVar("HOMEPAGE", False)
18*4882a593Smuzhiyun    if homepage == '':
19*4882a593Smuzhiyun        bb.warn("%s: HOMEPAGE is not set" % pkgname)
20*4882a593Smuzhiyun    elif not homepage.startswith("http://") and not homepage.startswith("https://"):
21*4882a593Smuzhiyun        bb.warn("%s: HOMEPAGE doesn't start with http:// or https://" % pkgname)
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun    ##############################
25*4882a593Smuzhiyun    # Test for valid SECTION
26*4882a593Smuzhiyun    #
27*4882a593Smuzhiyun    section = d.getVar("SECTION", False)
28*4882a593Smuzhiyun    if section == '':
29*4882a593Smuzhiyun        bb.warn("%s: SECTION is not set" % pkgname)
30*4882a593Smuzhiyun    elif not section.islower():
31*4882a593Smuzhiyun        bb.warn("%s: SECTION should only use lower case" % pkgname)
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun    ##############################
35*4882a593Smuzhiyun    # Check that all patches have Signed-off-by and Upstream-Status
36*4882a593Smuzhiyun    #
37*4882a593Smuzhiyun    srcuri = d.getVar("SRC_URI", False).split()
38*4882a593Smuzhiyun    fpaths = (d.getVar('FILESPATH') or '').split(':')
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun    def findPatch(patchname):
41*4882a593Smuzhiyun        for dir in fpaths:
42*4882a593Smuzhiyun            patchpath = dir + patchname
43*4882a593Smuzhiyun            if os.path.exists(patchpath):
44*4882a593Smuzhiyun                 return patchpath
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun    def findKey(path, key):
47*4882a593Smuzhiyun        ret = True
48*4882a593Smuzhiyun        f = open('%s' % path, mode = 'r')
49*4882a593Smuzhiyun        line = f.readline()
50*4882a593Smuzhiyun        while line:
51*4882a593Smuzhiyun            if line.find(key) != -1:
52*4882a593Smuzhiyun                ret = False
53*4882a593Smuzhiyun            line = f.readline()
54*4882a593Smuzhiyun        f.close()
55*4882a593Smuzhiyun        return ret
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun    def checkPN(pkgname, varname, str):
58*4882a593Smuzhiyun        if str.find("{PN}") != -1:
59*4882a593Smuzhiyun            bb.warn("%s: should use BPN instead of PN in %s" % (pkgname, varname))
60*4882a593Smuzhiyun        if str.find("{P}") != -1:
61*4882a593Smuzhiyun            bb.warn("%s: should use BP instead of P in %s" % (pkgname, varname))
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun    length = len("file://")
64*4882a593Smuzhiyun    for item in srcuri:
65*4882a593Smuzhiyun        if item.startswith("file://"):
66*4882a593Smuzhiyun            item = item[length:]
67*4882a593Smuzhiyun            if item.endswith(".patch") or item.endswith(".diff"):
68*4882a593Smuzhiyun                path = findPatch(item)
69*4882a593Smuzhiyun                if findKey(path, "Signed-off-by"):
70*4882a593Smuzhiyun                    bb.warn("%s: %s doesn't have Signed-off-by" % (pkgname, item))
71*4882a593Smuzhiyun                if findKey(path, "Upstream-Status"):
72*4882a593Smuzhiyun                    bb.warn("%s: %s doesn't have Upstream-Status" % (pkgname, item))
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun    ##############################
76*4882a593Smuzhiyun    # Check for ${PN} or ${P} usage in SRC_URI or S
77*4882a593Smuzhiyun    # Should use ${BPN} or ${BP} instead to avoid breaking multilib
78*4882a593Smuzhiyun    #
79*4882a593Smuzhiyun    for s in srcuri:
80*4882a593Smuzhiyun        if not s.startswith("file://"):
81*4882a593Smuzhiyun            checkPN(pkgname, 'SRC_URI', s)
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun    checkPN(pkgname, 'S', d.getVar('S', False))
84*4882a593Smuzhiyun}
85