test_lib_mk.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. import pytest
  2. import checkpackagelib.test_util as util
  3. import checkpackagelib.lib_mk as m
  4. DoNotInstallToHostdirUsr = [
  5. ('real case',
  6. 'libapparmor.mk',
  7. 'LIBAPPARMOR_CONF_OPTS += \\\n'
  8. '\t--with-python \\\n'
  9. '\tPYTHON=$(HOST_DIR)/usr/bin/python3 \\\n'
  10. '\tPYTHON_CONFIG=$(STAGING_DIR)/usr/bin/python3-config \\\n'
  11. '\tSWIG=$(SWIG)\n',
  12. [['libapparmor.mk:3: install files to $(HOST_DIR)/ instead of $(HOST_DIR)/usr/',
  13. '\tPYTHON=$(HOST_DIR)/usr/bin/python3 \\\n']]),
  14. ('ignore comment',
  15. 'any',
  16. '# following code do not install to $(HOST_DIR)/usr/\n',
  17. []),
  18. ]
  19. @pytest.mark.parametrize('testname,filename,string,expected', DoNotInstallToHostdirUsr)
  20. def test_DoNotInstallToHostdirUsr(testname, filename, string, expected):
  21. warnings = util.check_file(m.DoNotInstallToHostdirUsr, filename, string)
  22. assert warnings == expected
  23. Ifdef = [
  24. ('ignore commented line',
  25. 'any',
  26. '# ifdef\n',
  27. []),
  28. ('simple',
  29. 'any',
  30. '\n'
  31. 'ifdef BR2_PACKAGE_FWTS_EFI_RUNTIME_MODULE\n'
  32. 'endif\n',
  33. [['any:2: use ifeq ($(SYMBOL),y) instead of ifdef SYMBOL',
  34. 'ifdef BR2_PACKAGE_FWTS_EFI_RUNTIME_MODULE\n']]),
  35. ('ignore indentation',
  36. 'any',
  37. ' ifdef FOO\n'
  38. ' endif\n'
  39. '\tifdef BAR\n'
  40. 'endif\n',
  41. [['any:1: use ifeq ($(SYMBOL),y) instead of ifdef SYMBOL',
  42. ' ifdef FOO\n'],
  43. ['any:3: use ifeq ($(SYMBOL),y) instead of ifdef SYMBOL',
  44. '\tifdef BAR\n']]),
  45. ('typo',
  46. 'any',
  47. '\n'
  48. 'ifndef ($(BR2_ENABLE_LOCALE),y)\n'
  49. 'endif\n',
  50. [['any:2: use ifneq ($(SYMBOL),y) instead of ifndef SYMBOL',
  51. 'ifndef ($(BR2_ENABLE_LOCALE),y)\n']]),
  52. ('else ifdef',
  53. 'any',
  54. 'else ifdef SYMBOL # comment\n',
  55. [['any:1: use ifeq ($(SYMBOL),y) instead of ifdef SYMBOL',
  56. 'else ifdef SYMBOL # comment\n']]),
  57. ('else ifndef',
  58. 'any',
  59. '\t else ifndef\t($(SYMBOL),y) # comment\n',
  60. [['any:1: use ifneq ($(SYMBOL),y) instead of ifndef SYMBOL',
  61. '\t else ifndef\t($(SYMBOL),y) # comment\n']]),
  62. ]
  63. @pytest.mark.parametrize('testname,filename,string,expected', Ifdef)
  64. def test_Ifdef(testname, filename, string, expected):
  65. warnings = util.check_file(m.Ifdef, filename, string)
  66. assert warnings == expected
  67. get_package_prefix_from_filename = [
  68. ('linux tool',
  69. 'package/linux-tools/linux-tool-gpio.mk.in',
  70. ['gpio', 'GPIO']),
  71. ('boot',
  72. 'boot/binaries-marvell/binaries-marvell.mk',
  73. ['binaries-marvell', 'BINARIES_MARVELL']),
  74. ('toolchain',
  75. 'toolchain/toolchain-external/toolchain-external-bootlin/toolchain-external-bootlin.mk',
  76. ['toolchain-external-bootlin', 'TOOLCHAIN_EXTERNAL_BOOTLIN']),
  77. ('package, underscore, subfolder',
  78. 'package/x11r7/xapp_bitmap/xapp_bitmap.mk',
  79. ['xapp_bitmap', 'XAPP_BITMAP']),
  80. ('package, starting with number',
  81. 'package/4th/4th.mk',
  82. ['4th', '4TH']),
  83. ('package, long name',
  84. 'package/perl-mojolicious-plugin-authentication/perl-mojolicious-plugin-authentication.mk',
  85. ['perl-mojolicious-plugin-authentication', 'PERL_MOJOLICIOUS_PLUGIN_AUTHENTICATION']),
  86. ('package, case sensitive',
  87. 'package/libeXosip2/libeXosip2.mk',
  88. ['libeXosip2', 'LIBEXOSIP2']),
  89. ]
  90. @pytest.mark.parametrize('testname,filename,expected', get_package_prefix_from_filename)
  91. def test_get_package_prefix_from_filename(testname, filename, expected):
  92. prefix_lower, prefix_upper = m.get_package_prefix_from_filename(filename)
  93. assert [prefix_lower, prefix_upper] == expected
  94. Indent = [
  95. ('ignore comment at beginning of line',
  96. 'any',
  97. '# very useful comment\n',
  98. []),
  99. ('ignore comment at end of line',
  100. 'any',
  101. ' # very useful comment\n',
  102. []),
  103. ('do not indent on conditional (good)',
  104. 'any',
  105. 'ifeq ($(BR2_TOOLCHAIN_HAS_THREADS),y)\n'
  106. 'FOO_CONF_OPTS += something\n'
  107. 'endef\n',
  108. []),
  109. ('do not indent on conditional (bad)',
  110. 'any',
  111. 'ifeq ($(BR2_TOOLCHAIN_HAS_THREADS),y)\n'
  112. '\tFOO_CONF_OPTS += something\n'
  113. 'endef\n',
  114. [['any:2: unexpected indent with tabs',
  115. '\tFOO_CONF_OPTS += something\n']]),
  116. ('indent after line that ends in backslash (good)',
  117. 'any',
  118. 'FOO_CONF_OPTS += \\\n'
  119. '\tsomething\n',
  120. []),
  121. ('indent after line that ends in backslash (bad)',
  122. 'any',
  123. 'FOO_CONF_OPTS += \\\n'
  124. 'something\n',
  125. [['any:2: expected indent with tabs',
  126. 'something\n']]),
  127. ('indent after 2 lines that ends in backslash (good)',
  128. 'any',
  129. 'FOO_CONF_OPTS += \\\n'
  130. '\tsomething \\\n'
  131. '\tsomething_else\n',
  132. []),
  133. ('indent after 2 lines that ends in backslash (bad)',
  134. 'any',
  135. 'FOO_CONF_OPTS += \\\n'
  136. '\tsomething \\\n'
  137. '\tsomething_else \\\n'
  138. 'FOO_CONF_OPTS += another_thing\n',
  139. [['any:4: expected indent with tabs',
  140. 'FOO_CONF_OPTS += another_thing\n']]),
  141. ('indent inside define (good)',
  142. 'any',
  143. 'define FOO_SOMETHING\n'
  144. '\tcommand\n'
  145. '\tcommand \\\n'
  146. '\t\targuments\n'
  147. 'endef\n'
  148. 'FOO_POST_PATCH_HOOKS += FOO_SOMETHING\n',
  149. []),
  150. ('indent inside define (bad, no indent)',
  151. 'any',
  152. 'define FOO_SOMETHING\n'
  153. 'command\n'
  154. 'endef\n',
  155. [['any:2: expected indent with tabs',
  156. 'command\n']]),
  157. ('indent inside define (bad, spaces)',
  158. 'any',
  159. 'define FOO_SOMETHING\n'
  160. ' command\n'
  161. 'endef\n',
  162. [['any:2: expected indent with tabs',
  163. ' command\n']]),
  164. ('indent make target (good)',
  165. 'any',
  166. 'make_target:\n'
  167. '\tcommand\n'
  168. '\n',
  169. []),
  170. ('indent make target (bad)',
  171. 'any',
  172. 'make_target:\n'
  173. ' command\n'
  174. '\n',
  175. [['any:2: expected indent with tabs',
  176. ' command\n']]),
  177. ]
  178. @pytest.mark.parametrize('testname,filename,string,expected', Indent)
  179. def test_Indent(testname, filename, string, expected):
  180. warnings = util.check_file(m.Indent, filename, string)
  181. assert warnings == expected
  182. OverriddenVariable = [
  183. ('simple assignment',
  184. 'any.mk',
  185. 'VAR_1 = VALUE1\n',
  186. []),
  187. ('unconditional override (variable without underscore)',
  188. 'any.mk',
  189. 'VAR1 = VALUE1\n'
  190. 'VAR1 = VALUE1\n',
  191. [['any.mk:2: unconditional override of variable VAR1',
  192. 'VAR1 = VALUE1\n']]),
  193. ('unconditional override (variable with underscore, same value)',
  194. 'any.mk',
  195. 'VAR_1 = VALUE1\n'
  196. 'VAR_1 = VALUE1\n',
  197. [['any.mk:2: unconditional override of variable VAR_1',
  198. 'VAR_1 = VALUE1\n']]),
  199. ('unconditional override (variable with underscore, different value)',
  200. 'any.mk',
  201. 'VAR_1 = VALUE1\n'
  202. 'VAR_1 = VALUE2\n',
  203. [['any.mk:2: unconditional override of variable VAR_1',
  204. 'VAR_1 = VALUE2\n']]),
  205. ('warn for unconditional override even with wrong number of spaces',
  206. 'any.mk',
  207. 'VAR_1= VALUE1\n'
  208. 'VAR_1 =VALUE2\n',
  209. [['any.mk:2: unconditional override of variable VAR_1',
  210. 'VAR_1 =VALUE2\n']]),
  211. ('warn for := override',
  212. 'any.mk',
  213. 'VAR_1 = VALUE1\n'
  214. 'VAR_1 := VALUE2\n',
  215. [['any.mk:2: unconditional override of variable VAR_1',
  216. 'VAR_1 := VALUE2\n']]),
  217. ('append values outside conditional (good)',
  218. 'any.mk',
  219. 'VAR_1 = VALUE1\n'
  220. 'VAR_1 += VALUE2\n',
  221. []),
  222. ('append values outside conditional (bad)',
  223. 'any.mk',
  224. 'VAR_1 = VALUE1\n'
  225. 'VAR_1 := $(VAR_1), VALUE2\n',
  226. [['any.mk:2: unconditional override of variable VAR_1',
  227. 'VAR_1 := $(VAR_1), VALUE2\n']]),
  228. ('immediate assignment inside conditional',
  229. 'any.mk',
  230. 'VAR_1 = VALUE1\n'
  231. 'ifeq (condition)\n'
  232. 'VAR_1 := $(VAR_1), VALUE2\n',
  233. [['any.mk:3: immediate assignment to append to variable VAR_1',
  234. 'VAR_1 := $(VAR_1), VALUE2\n']]),
  235. ('immediate assignment inside conditional and unconditional override outside',
  236. 'any.mk',
  237. 'VAR_1 = VALUE1\n'
  238. 'ifeq (condition)\n'
  239. 'VAR_1 := $(VAR_1), VALUE2\n'
  240. 'endif\n'
  241. 'VAR_1 := $(VAR_1), VALUE2\n',
  242. [['any.mk:3: immediate assignment to append to variable VAR_1',
  243. 'VAR_1 := $(VAR_1), VALUE2\n'],
  244. ['any.mk:5: unconditional override of variable VAR_1',
  245. 'VAR_1 := $(VAR_1), VALUE2\n']]),
  246. ]
  247. @pytest.mark.parametrize('testname,filename,string,expected', OverriddenVariable)
  248. def test_OverriddenVariable(testname, filename, string, expected):
  249. warnings = util.check_file(m.OverriddenVariable, filename, string)
  250. assert warnings == expected
  251. PackageHeader = [
  252. ('first line (good)',
  253. 'any',
  254. 80 * '#' + '\n',
  255. []),
  256. ('first line (bad)',
  257. 'any',
  258. '# very useful comment\n',
  259. [['any:1: should be 80 hashes (url#writing-rules-mk)',
  260. '# very useful comment\n',
  261. 80 * '#']]),
  262. ('second line (bad)',
  263. 'any',
  264. 80 * '#' + '\n'
  265. '# package\n',
  266. [['any:2: should be 1 hash (url#writing-rules-mk)',
  267. '# package\n']]),
  268. ('full header (good)',
  269. 'any',
  270. 80 * '#' + '\n'
  271. '#\n'
  272. '# package\n'
  273. '#\n' +
  274. 80 * '#' + '\n'
  275. '\n',
  276. []),
  277. ('blank line after header (good)',
  278. 'any',
  279. 80 * '#' + '\n'
  280. '#\n'
  281. '# package\n'
  282. '#\n' +
  283. 80 * '#' + '\n'
  284. '\n'
  285. 'FOO_VERSION = 1\n',
  286. []),
  287. ('blank line after header (bad)',
  288. 'any',
  289. 80 * '#' + '\n'
  290. '#\n'
  291. '# package\n'
  292. '#\n' +
  293. 80 * '#' + '\n'
  294. 'FOO_VERSION = 1\n',
  295. [['any:6: should be a blank line (url#writing-rules-mk)',
  296. 'FOO_VERSION = 1\n']]),
  297. ('wrong number of hashes',
  298. 'any',
  299. 79 * '#' + '\n'
  300. '#\n'
  301. '# package\n'
  302. '#\n' +
  303. 81 * '#' + '\n'
  304. '\n',
  305. [['any:1: should be 80 hashes (url#writing-rules-mk)',
  306. 79 * '#' + '\n',
  307. 80 * '#'],
  308. ['any:5: should be 80 hashes (url#writing-rules-mk)',
  309. 81 * '#' + '\n',
  310. 80 * '#']]),
  311. ('allow include without header',
  312. 'any',
  313. 'include $(sort $(wildcard package/foo/*/*.mk))\n',
  314. []),
  315. ]
  316. @pytest.mark.parametrize('testname,filename,string,expected', PackageHeader)
  317. def test_PackageHeader(testname, filename, string, expected):
  318. warnings = util.check_file(m.PackageHeader, filename, string)
  319. assert warnings == expected
  320. RemoveDefaultPackageSourceVariable = [
  321. ('bad',
  322. 'any.mk',
  323. 'ANY_SOURCE = any-$(ANY_VERSION).tar.gz\n',
  324. [['any.mk:1: remove default value of _SOURCE variable (url#generic-package-reference)',
  325. 'ANY_SOURCE = any-$(ANY_VERSION).tar.gz\n']]),
  326. ('bad with path',
  327. './any.mk',
  328. 'ANY_SOURCE = any-$(ANY_VERSION).tar.gz\n',
  329. [['./any.mk:1: remove default value of _SOURCE variable (url#generic-package-reference)',
  330. 'ANY_SOURCE = any-$(ANY_VERSION).tar.gz\n']]),
  331. ('warn for correct line',
  332. './any.mk',
  333. '\n'
  334. '\n'
  335. '\n'
  336. 'ANY_SOURCE = any-$(ANY_VERSION).tar.gz\n',
  337. [['./any.mk:4: remove default value of _SOURCE variable (url#generic-package-reference)',
  338. 'ANY_SOURCE = any-$(ANY_VERSION).tar.gz\n']]),
  339. ('warn ignoring missing spaces',
  340. './any.mk',
  341. 'ANY_SOURCE=any-$(ANY_VERSION).tar.gz\n',
  342. [['./any.mk:1: remove default value of _SOURCE variable (url#generic-package-reference)',
  343. 'ANY_SOURCE=any-$(ANY_VERSION).tar.gz\n']]),
  344. ('good',
  345. './any.mk',
  346. 'ANY_SOURCE = aNy-$(ANY_VERSION).tar.gz\n',
  347. []),
  348. ('gcc exception',
  349. 'gcc.mk',
  350. 'GCC_SOURCE = gcc-$(GCC_VERSION).tar.gz\n',
  351. []),
  352. ('binutils exception',
  353. './binutils.mk',
  354. 'BINUTILS_SOURCE = binutils-$(BINUTILS_VERSION).tar.gz\n',
  355. []),
  356. ('gdb exception',
  357. 'gdb/gdb.mk',
  358. 'GDB_SOURCE = gdb-$(GDB_VERSION).tar.gz\n',
  359. []),
  360. ('package name with dash',
  361. 'python-subprocess32.mk',
  362. 'PYTHON_SUBPROCESS32_SOURCE = python-subprocess32-$(PYTHON_SUBPROCESS32_VERSION).tar.gz\n',
  363. [['python-subprocess32.mk:1: remove default value of _SOURCE variable (url#generic-package-reference)',
  364. 'PYTHON_SUBPROCESS32_SOURCE = python-subprocess32-$(PYTHON_SUBPROCESS32_VERSION).tar.gz\n']]),
  365. ]
  366. @pytest.mark.parametrize('testname,filename,string,expected', RemoveDefaultPackageSourceVariable)
  367. def test_RemoveDefaultPackageSourceVariable(testname, filename, string, expected):
  368. warnings = util.check_file(m.RemoveDefaultPackageSourceVariable, filename, string)
  369. assert warnings == expected
  370. SpaceBeforeBackslash = [
  371. ('no backslash',
  372. 'any.mk',
  373. '\n',
  374. []),
  375. ('ignore missing indent',
  376. 'any.mk',
  377. 'define ANY_SOME_FIXUP\n'
  378. 'for i in $$(find $(STAGING_DIR)/usr/lib* -name "any*.la"); do \\\n',
  379. []),
  380. ('ignore missing space',
  381. 'any.mk',
  382. 'ANY_CONF_ENV= \\\n'
  383. '\tap_cv_void_ptr_lt_long=no \\\n',
  384. []),
  385. ('variable',
  386. 'any.mk',
  387. '\n'
  388. 'ANY = \\\n',
  389. []),
  390. ('2 spaces',
  391. 'any.mk',
  392. 'ANY = \\\n',
  393. [['any.mk:1: use only one space before backslash',
  394. 'ANY = \\\n']]),
  395. ('warn about correct line',
  396. 'any.mk',
  397. '\n'
  398. 'ANY = \\\n',
  399. [['any.mk:2: use only one space before backslash',
  400. 'ANY = \\\n']]),
  401. ('tab',
  402. 'any.mk',
  403. 'ANY =\t\\\n',
  404. [['any.mk:1: use only one space before backslash',
  405. 'ANY =\t\\\n']]),
  406. ('tabs',
  407. 'any.mk',
  408. 'ANY =\t\t\\\n',
  409. [['any.mk:1: use only one space before backslash',
  410. 'ANY =\t\t\\\n']]),
  411. ('spaces and tabs',
  412. 'any.mk',
  413. 'ANY = \t\t\\\n',
  414. [['any.mk:1: use only one space before backslash',
  415. 'ANY = \t\t\\\n']]),
  416. ('mixed spaces and tabs 1',
  417. 'any.mk',
  418. 'ANY = \t \t\\\n',
  419. [['any.mk:1: use only one space before backslash',
  420. 'ANY = \t \t\\\n']]),
  421. ('mixed spaces and tabs 2',
  422. 'any.mk',
  423. 'ANY = \t \\\n',
  424. [['any.mk:1: use only one space before backslash',
  425. 'ANY = \t \\\n']]),
  426. ]
  427. @pytest.mark.parametrize('testname,filename,string,expected', SpaceBeforeBackslash)
  428. def test_SpaceBeforeBackslash(testname, filename, string, expected):
  429. warnings = util.check_file(m.SpaceBeforeBackslash, filename, string)
  430. assert warnings == expected
  431. TrailingBackslash = [
  432. ('no backslash',
  433. 'any.mk',
  434. 'ANY = \n',
  435. []),
  436. ('one line',
  437. 'any.mk',
  438. 'ANY = \\\n',
  439. []),
  440. ('2 lines',
  441. 'any.mk',
  442. 'ANY = \\\n'
  443. '\\\n',
  444. []),
  445. ('empty line after',
  446. 'any.mk',
  447. 'ANY = \\\n'
  448. '\n',
  449. [['any.mk:1: remove trailing backslash',
  450. 'ANY = \\\n']]),
  451. ('line with spaces after',
  452. 'any.mk',
  453. 'ANY = \\\n'
  454. ' \n',
  455. [['any.mk:1: remove trailing backslash',
  456. 'ANY = \\\n']]),
  457. ('line with tabs after',
  458. 'any.mk',
  459. 'ANY = \\\n'
  460. '\t\n',
  461. [['any.mk:1: remove trailing backslash',
  462. 'ANY = \\\n']]),
  463. ('ignore if commented',
  464. 'any.mk',
  465. '# ANY = \\\n'
  466. '\n',
  467. []),
  468. ('real example',
  469. 'any.mk',
  470. 'ANY_CONF_ENV= \t\\\n'
  471. '\tap_cv_void_ptr_lt_long=no \\\n'
  472. '\n',
  473. [['any.mk:2: remove trailing backslash',
  474. '\tap_cv_void_ptr_lt_long=no \\\n']]),
  475. ('ignore whitespace 1',
  476. 'any.mk',
  477. 'ANY = \t\t\\\n',
  478. []),
  479. ('ignore whitespace 2',
  480. 'any.mk',
  481. 'ANY = \t \t\\\n',
  482. []),
  483. ('ignore whitespace 3',
  484. 'any.mk',
  485. 'ANY = \t \\\n',
  486. []),
  487. ]
  488. @pytest.mark.parametrize('testname,filename,string,expected', TrailingBackslash)
  489. def test_TrailingBackslash(testname, filename, string, expected):
  490. warnings = util.check_file(m.TrailingBackslash, filename, string)
  491. assert warnings == expected
  492. TypoInPackageVariable = [
  493. ('good',
  494. 'any.mk',
  495. 'ANY_VAR = \n',
  496. []),
  497. ('good with path 1',
  498. './any.mk',
  499. 'ANY_VAR += \n',
  500. []),
  501. ('good with path 2',
  502. 'any/any.mk',
  503. 'ANY_VAR = \n',
  504. []),
  505. ('bad =',
  506. 'any.mk',
  507. 'OTHER_VAR = \n',
  508. [['any.mk:1: possible typo, variable not properly prefixed: OTHER_VAR -> *ANY_XXXX* (url#_tips_and_tricks)',
  509. 'OTHER_VAR = \n']]),
  510. ('bad +=',
  511. 'any.mk',
  512. 'OTHER_VAR += \n',
  513. [['any.mk:1: possible typo, variable not properly prefixed: OTHER_VAR -> *ANY_XXXX* (url#_tips_and_tricks)',
  514. 'OTHER_VAR += \n']]),
  515. ('ignore missing space',
  516. 'any.mk',
  517. 'OTHER_VAR= \n',
  518. [['any.mk:1: possible typo, variable not properly prefixed: OTHER_VAR -> *ANY_XXXX* (url#_tips_and_tricks)',
  519. 'OTHER_VAR= \n']]),
  520. ('use path in the warning',
  521. './any.mk',
  522. 'OTHER_VAR = \n',
  523. [['./any.mk:1: possible typo, variable not properly prefixed: OTHER_VAR -> *ANY_XXXX* (url#_tips_and_tricks)',
  524. 'OTHER_VAR = \n']]),
  525. ('another name',
  526. 'other.mk',
  527. 'ANY_VAR = \n',
  528. [['other.mk:1: possible typo, variable not properly prefixed: ANY_VAR -> *OTHER_XXXX* (url#_tips_and_tricks)',
  529. 'ANY_VAR = \n']]),
  530. ('libc exception',
  531. './any.mk',
  532. 'BR_LIBC = \n',
  533. []),
  534. ('rootfs exception',
  535. 'any.mk',
  536. 'ROOTFS_ANY_VAR += \n',
  537. []),
  538. ('host (good)',
  539. 'any.mk',
  540. 'HOST_ANY_VAR += \n',
  541. []),
  542. ('host (bad)',
  543. 'any.mk',
  544. 'HOST_OTHER_VAR = \n',
  545. [['any.mk:1: possible typo, variable not properly prefixed: HOST_OTHER_VAR -> *ANY_XXXX* (url#_tips_and_tricks)',
  546. 'HOST_OTHER_VAR = \n']]),
  547. ('provides',
  548. 'any.mk',
  549. 'ANY_PROVIDES = other thing\n'
  550. 'OTHER_VAR = \n',
  551. []),
  552. ('ignore space',
  553. 'any.mk',
  554. 'ANY_PROVIDES = thing other \n'
  555. 'OTHER_VAR = \n',
  556. []),
  557. ('wrong provides',
  558. 'any.mk',
  559. 'ANY_PROVIDES = other\n'
  560. 'OTHERS_VAR = \n',
  561. [['any.mk:2: possible typo, variable not properly prefixed: OTHERS_VAR -> *ANY_XXXX* (url#_tips_and_tricks)',
  562. 'OTHERS_VAR = \n']]),
  563. ('linux tool',
  564. 'package/linux-tools/linux-tool-cpupower.mk.in',
  565. 'CPUPOWER_DEPENDENCIES =\n'
  566. 'POWER_DEPENDENCIES +=\n',
  567. [['package/linux-tools/linux-tool-cpupower.mk.in:2: possible typo, variable not properly prefixed: '
  568. 'POWER_DEPENDENCIES -> *CPUPOWER_XXXX* (url#_tips_and_tricks)',
  569. 'POWER_DEPENDENCIES +=\n']]),
  570. ]
  571. @pytest.mark.parametrize('testname,filename,string,expected', TypoInPackageVariable)
  572. def test_TypoInPackageVariable(testname, filename, string, expected):
  573. warnings = util.check_file(m.TypoInPackageVariable, filename, string)
  574. assert warnings == expected
  575. UselessFlag = [
  576. ('autoreconf no',
  577. 'any.mk',
  578. 'ANY_AUTORECONF=NO\n',
  579. [['any.mk:1: useless default value (url#_infrastructure_for_autotools_based_packages)',
  580. 'ANY_AUTORECONF=NO\n']]),
  581. ('host autoreconf no',
  582. 'any.mk',
  583. 'HOST_ANY_AUTORECONF\n',
  584. []),
  585. ('autoreconf yes',
  586. 'any.mk',
  587. 'ANY_AUTORECONF=YES\n',
  588. []),
  589. ('libtool_patch yes',
  590. 'any.mk',
  591. 'ANY_LIBTOOL_PATCH\t= YES\n',
  592. [['any.mk:1: useless default value (url#_infrastructure_for_autotools_based_packages)',
  593. 'ANY_LIBTOOL_PATCH\t= YES\n']]),
  594. ('libtool_patch no',
  595. 'any.mk',
  596. 'ANY_LIBTOOL_PATCH= \t NO\n',
  597. []),
  598. ('generic',
  599. 'any.mk',
  600. 'ANY_INSTALL_IMAGES = NO\n'
  601. 'ANY_REDISTRIBUTE = YES\n'
  602. 'ANY_INSTALL_STAGING = NO\n'
  603. 'ANY_INSTALL_TARGET = YES\n',
  604. [['any.mk:1: useless default value (url#_infrastructure_for_packages_with_specific_build_systems)',
  605. 'ANY_INSTALL_IMAGES = NO\n'],
  606. ['any.mk:2: useless default value (url#_infrastructure_for_packages_with_specific_build_systems)',
  607. 'ANY_REDISTRIBUTE = YES\n'],
  608. ['any.mk:3: useless default value (url#_infrastructure_for_packages_with_specific_build_systems)',
  609. 'ANY_INSTALL_STAGING = NO\n'],
  610. ['any.mk:4: useless default value (url#_infrastructure_for_packages_with_specific_build_systems)',
  611. 'ANY_INSTALL_TARGET = YES\n']]),
  612. ('conditional',
  613. 'any.mk',
  614. 'ifneq (condition)\n'
  615. 'ANY_INSTALL_IMAGES = NO\n'
  616. 'endif\n'
  617. 'ANY_REDISTRIBUTE = YES\n',
  618. [['any.mk:4: useless default value (url#_infrastructure_for_packages_with_specific_build_systems)',
  619. 'ANY_REDISTRIBUTE = YES\n']]),
  620. ]
  621. @pytest.mark.parametrize('testname,filename,string,expected', UselessFlag)
  622. def test_UselessFlag(testname, filename, string, expected):
  623. warnings = util.check_file(m.UselessFlag, filename, string)
  624. assert warnings == expected
  625. VariableWithBraces = [
  626. ('good',
  627. 'xmlstarlet.mk',
  628. 'XMLSTARLET_CONF_OPTS += \\\n'
  629. '\t--with-libxml-prefix=$(STAGING_DIR)/usr \\\n',
  630. []),
  631. ('bad',
  632. 'xmlstarlet.mk',
  633. 'XMLSTARLET_CONF_OPTS += \\\n'
  634. '\t--with-libxml-prefix=${STAGING_DIR}/usr \\\n',
  635. [['xmlstarlet.mk:2: use $() to delimit variables, not ${}',
  636. '\t--with-libxml-prefix=${STAGING_DIR}/usr \\\n']]),
  637. ('expanded by the shell',
  638. 'sg3_utils.mk',
  639. '\tfor prog in xcopy zone; do \\\n'
  640. '\t\t$(RM) $(TARGET_DIR)/usr/bin/sg_$${prog} ; \\\n'
  641. '\tdone\n',
  642. []),
  643. ('comments',
  644. 'any.mk',
  645. '#\t--with-libxml-prefix=${STAGING_DIR}/usr \\\n',
  646. []),
  647. ]
  648. @pytest.mark.parametrize('testname,filename,string,expected', VariableWithBraces)
  649. def test_VariableWithBraces(testname, filename, string, expected):
  650. warnings = util.check_file(m.VariableWithBraces, filename, string)
  651. assert warnings == expected