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