2
1

test_lib_mk.py 17 KB

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