2
1

test_lib_mk.py 21 KB

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