| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | # Copyright (c) 2014-present PlatformIO <contact@platformio.org> | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  | # you may not use this file except in compliance with the License. | 
					
						
							|  |  |  | # You may obtain a copy of the License at | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #    http://www.apache.org/licenses/LICENSE-2.0 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  | # distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  | # See the License for the specific language governing permissions and | 
					
						
							|  |  |  | # limitations under the License. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-23 16:05:27 +03:00
										 |  |  | from platformio.commands.run.command import cli as cmd_run | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-27 12:36:57 +03:00
										 |  |  | def test_build_flags(clirunner, isolated_pio_core, validate_cliresult, tmpdir): | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     build_flags = [ | 
					
						
							|  |  |  |         ("-D TEST_INT=13", "-DTEST_INT=13"), | 
					
						
							|  |  |  |         ("-DTEST_SINGLE_MACRO", "-DTEST_SINGLE_MACRO"), | 
					
						
							|  |  |  |         ('-DTEST_STR_SPACE="Andrew Smith"', '"-DTEST_STR_SPACE=Andrew Smith"'), | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tmpdir.join("platformio.ini").write( | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | [env:native] | 
					
						
							|  |  |  | platform = native | 
					
						
							| 
									
										
										
										
											2018-03-20 19:24:05 +02:00
										 |  |  | extra_scripts = extra.py | 
					
						
							| 
									
										
										
										
											2018-10-02 00:11:41 +03:00
										 |  |  | build_flags = | 
					
						
							|  |  |  |     ; -DCOMMENTED_MACRO | 
					
						
							|  |  |  |     %s ; inline comment | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     """
 | 
					
						
							|  |  |  |         % " ".join([f[0] for f in build_flags]) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     tmpdir.join("extra.py").write( | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2018-06-08 21:38:41 +03:00
										 |  |  | Import("projenv") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | projenv.Append(CPPDEFINES="POST_SCRIPT_MACRO") | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-20 19:24:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     tmpdir.mkdir("src").join("main.cpp").write( | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | #if !defined(TEST_INT) || TEST_INT != 13 | 
					
						
							|  |  |  | #error "TEST_INT" | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef TEST_STR_SPACE | 
					
						
							|  |  |  | #error "TEST_STR_SPACE" | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-20 19:24:05 +02:00
										 |  |  | #ifndef POST_SCRIPT_MACRO | 
					
						
							|  |  |  | #error "POST_SCRIPT_MACRO" | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-02 00:11:41 +03:00
										 |  |  | #ifdef COMMENTED_MACRO | 
					
						
							|  |  |  | #error "COMMENTED_MACRO" | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | int main() { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  | """
 | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     result = clirunner.invoke(cmd_run, ["--project-dir", str(tmpdir), "--verbose"]) | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  |     validate_cliresult(result) | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     build_output = result.output[result.output.find("Scanning dependencies...") :] | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  |     for flag in build_flags: | 
					
						
							|  |  |  |         assert flag[1] in build_output, flag | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_build_unflags(clirunner, validate_cliresult, tmpdir): | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     tmpdir.join("platformio.ini").write( | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | [env:native] | 
					
						
							|  |  |  | platform = native | 
					
						
							| 
									
										
										
										
											2018-04-20 19:10:20 +03:00
										 |  |  | build_unflags = -DTMP_MACRO1=45 -I. -DNON_EXISTING_MACRO -lunknownLib -Os | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | extra_scripts = pre:extra.py | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  | """
 | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     tmpdir.join("extra.py").write( | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | Import("env") | 
					
						
							|  |  |  | env.Append(CPPPATH="%s") | 
					
						
							|  |  |  | env.Append(CPPDEFINES="TMP_MACRO1") | 
					
						
							|  |  |  | env.Append(CPPDEFINES=["TMP_MACRO2"]) | 
					
						
							|  |  |  | env.Append(CPPDEFINES=("TMP_MACRO3", 13)) | 
					
						
							| 
									
										
										
										
											2018-04-20 19:10:20 +03:00
										 |  |  | env.Append(CCFLAGS=["-Os"]) | 
					
						
							|  |  |  | env.Append(LIBS=["unknownLib"]) | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     """
 | 
					
						
							|  |  |  |         % str(tmpdir) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     tmpdir.mkdir("src").join("main.c").write( | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | #ifdef TMP_MACRO1 | 
					
						
							|  |  |  | #error "TMP_MACRO1 should be removed" | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main() { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  | """
 | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     result = clirunner.invoke(cmd_run, ["--project-dir", str(tmpdir), "--verbose"]) | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  |     validate_cliresult(result) | 
					
						
							| 
									
										
										
										
											2019-09-23 23:13:48 +03:00
										 |  |  |     build_output = result.output[result.output.find("Scanning dependencies...") :] | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  |     assert "-DTMP_MACRO1" not in build_output | 
					
						
							| 
									
										
										
										
											2018-04-20 19:10:20 +03:00
										 |  |  |     assert "-Os" not in build_output | 
					
						
							| 
									
										
										
										
											2018-03-20 16:06:39 +02:00
										 |  |  |     assert str(tmpdir) not in build_output | 
					
						
							| 
									
										
										
										
											2020-01-22 20:41:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_debug_default_build_flags(clirunner, validate_cliresult, tmpdir): | 
					
						
							|  |  |  |     tmpdir.join("platformio.ini").write( | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | [env:native] | 
					
						
							|  |  |  | platform = native | 
					
						
							|  |  |  | build_type = debug | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tmpdir.mkdir("src").join("main.c").write( | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | int main() { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = clirunner.invoke(cmd_run, ["--project-dir", str(tmpdir), "--verbose"]) | 
					
						
							|  |  |  |     validate_cliresult(result) | 
					
						
							|  |  |  |     build_output = result.output[result.output.find("Scanning dependencies...") :] | 
					
						
							|  |  |  |     for line in build_output.split("\n"): | 
					
						
							|  |  |  |         if line.startswith("gcc"): | 
					
						
							|  |  |  |             assert all(line.count(flag) == 1 for flag in ("-Og", "-g2", "-ggdb2")) | 
					
						
							| 
									
										
										
										
											2020-01-24 19:47:20 +02:00
										 |  |  |             assert all( | 
					
						
							|  |  |  |                 line.count("-%s%d" % (flag, level)) == 0 | 
					
						
							|  |  |  |                 for flag in ("O", "g", "ggdb") | 
					
						
							|  |  |  |                 for level in (0, 1, 3) | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2020-01-22 20:41:42 +02:00
										 |  |  |             assert "-Os" not in line | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_debug_custom_build_flags(clirunner, validate_cliresult, tmpdir): | 
					
						
							|  |  |  |     custom_debug_build_flags = ("-O3", "-g3", "-ggdb3") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tmpdir.join("platformio.ini").write( | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | [env:native] | 
					
						
							|  |  |  | platform = native | 
					
						
							|  |  |  | build_type = debug | 
					
						
							|  |  |  | debug_build_flags = %s | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |         % " ".join(custom_debug_build_flags) | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tmpdir.mkdir("src").join("main.c").write( | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | int main() { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result = clirunner.invoke(cmd_run, ["--project-dir", str(tmpdir), "--verbose"]) | 
					
						
							|  |  |  |     validate_cliresult(result) | 
					
						
							|  |  |  |     build_output = result.output[result.output.find("Scanning dependencies...") :] | 
					
						
							|  |  |  |     for line in build_output.split("\n"): | 
					
						
							|  |  |  |         if line.startswith("gcc"): | 
					
						
							|  |  |  |             assert all(line.count(f) == 1 for f in custom_debug_build_flags) | 
					
						
							| 
									
										
										
										
											2020-01-24 19:47:20 +02:00
										 |  |  |             assert all( | 
					
						
							|  |  |  |                 line.count("-%s%d" % (flag, level)) == 0 | 
					
						
							|  |  |  |                 for flag in ("O", "g", "ggdb") | 
					
						
							|  |  |  |                 for level in (0, 1, 2) | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2020-01-22 20:41:42 +02:00
										 |  |  |             assert all("-O%s" % optimization not in line for optimization in ("g", "s")) |