Skip to content

Commit c90dedf

Browse files
author
Federico Fissore
committed
Adding recipes from parent platforms only when build properties are set up.
Fixes #18 Signed-off-by: Federico Fissore <f.fissore@arduino.cc>
1 parent 9045c25 commit c90dedf

File tree

6 files changed

+141
-26
lines changed

6 files changed

+141
-26
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* This file is part of Arduino Builder.
3+
*
4+
* Arduino Builder is free software; you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation; either version 2 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program; if not, write to the Free Software
16+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17+
*
18+
* As a special exception, you may use this file as part of a free software
19+
* library without restriction. Specifically, if other files instantiate
20+
* templates or use macros or inline functions from this file, or you compile
21+
* this file and link it with other files to produce an executable, this
22+
* file does not by itself cause the resulting executable to be covered by
23+
* the GNU General Public License. This exception does not however
24+
* invalidate any other reasons why the executable file might be covered by
25+
* the GNU General Public License.
26+
*
27+
* Copyright 2015 Arduino LLC (http://www.arduino.cc/)
28+
*/
29+
30+
package builder
31+
32+
import (
33+
"arduino.cc/builder/constants"
34+
"arduino.cc/builder/types"
35+
"arduino.cc/builder/utils"
36+
)
37+
38+
type AddMissingBuildPropertiesFromParentPlatformTxtFiles struct{}
39+
40+
func (s *AddMissingBuildPropertiesFromParentPlatformTxtFiles) Run(context map[string]interface{}) error {
41+
packages := context[constants.CTX_HARDWARE].(*types.Packages)
42+
targetPackage := context[constants.CTX_TARGET_PACKAGE].(*types.Package)
43+
buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string)
44+
45+
buildProperties = utils.MergeMapsOfStrings(make(map[string]string), packages.Properties, targetPackage.Properties, buildProperties)
46+
47+
context[constants.CTX_BUILD_PROPERTIES] = buildProperties
48+
49+
return nil
50+
}

src/arduino.cc/builder/container_setup.go

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func (s *ContainerSetupHardwareToolsLibsSketchAndProps) Run(context map[string]i
5151
&SetupBuildProperties{},
5252
&LoadVIDPIDSpecificProperties{},
5353
&SetCustomBuildProperties{},
54+
&AddMissingBuildPropertiesFromParentPlatformTxtFiles{},
5455
}
5556

5657
for _, command := range commands {

src/arduino.cc/builder/hardware_loader.go

+9-16
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ import (
4141
type HardwareLoader struct{}
4242

4343
func (s *HardwareLoader) Run(context map[string]interface{}) error {
44-
mainHardwarePlatformTxt := make(map[string]string)
45-
4644
packages := &types.Packages{}
4745
packages.Packages = make(map[string]*types.Package)
4846
packages.Properties = make(map[string]string)
@@ -62,17 +60,11 @@ func (s *HardwareLoader) Run(context map[string]interface{}) error {
6260
return utils.Errorf(context, constants.MSG_MUST_BE_A_FOLDER, folder)
6361
}
6462

65-
if len(mainHardwarePlatformTxt) == 0 {
66-
mainHardwarePlatformTxt, err = props.SafeLoad(filepath.Join(folder, constants.FILE_PLATFORM_TXT))
67-
if err != nil {
68-
return utils.WrapError(err)
69-
}
70-
}
7163
hardwarePlatformTxt, err := props.SafeLoad(filepath.Join(folder, constants.FILE_PLATFORM_TXT))
7264
if err != nil {
7365
return utils.WrapError(err)
7466
}
75-
hardwarePlatformTxt = utils.MergeMapsOfStrings(make(map[string]string), mainHardwarePlatformTxt, hardwarePlatformTxt)
67+
packages.Properties = utils.MergeMapsOfStrings(packages.Properties, hardwarePlatformTxt)
7668

7769
subfolders, err := utils.ReadDirFiltered(folder, utils.FilterDirs)
7870
if err != nil {
@@ -89,7 +81,7 @@ func (s *HardwareLoader) Run(context map[string]interface{}) error {
8981
}
9082

9183
targetPackage := getOrCreatePackage(packages, packageId)
92-
err = loadPackage(targetPackage, subfolderPath, hardwarePlatformTxt)
84+
err = loadPackage(targetPackage, subfolderPath)
9385
if err != nil {
9486
return utils.WrapError(err)
9587
}
@@ -110,16 +102,17 @@ func getOrCreatePackage(packages *types.Packages, packageId string) *types.Packa
110102
targetPackage := types.Package{}
111103
targetPackage.PackageId = packageId
112104
targetPackage.Platforms = make(map[string]*types.Platform)
105+
targetPackage.Properties = make(map[string]string)
113106

114107
return &targetPackage
115108
}
116109

117-
func loadPackage(targetPackage *types.Package, folder string, hardwarePlatformTxt map[string]string) error {
110+
func loadPackage(targetPackage *types.Package, folder string) error {
118111
packagePlatformTxt, err := props.SafeLoad(filepath.Join(folder, constants.FILE_PLATFORM_TXT))
119112
if err != nil {
120113
return utils.WrapError(err)
121114
}
122-
packagePlatformTxt = utils.MergeMapsOfStrings(make(map[string]string), hardwarePlatformTxt, packagePlatformTxt)
115+
targetPackage.Properties = utils.MergeMapsOfStrings(targetPackage.Properties, packagePlatformTxt)
123116

124117
subfolders, err := utils.ReadDirFiltered(folder, utils.FilterDirs)
125118
if err != nil {
@@ -146,7 +139,7 @@ func loadPackage(targetPackage *types.Package, folder string, hardwarePlatformTx
146139
}
147140

148141
platform := getOrCreatePlatform(platforms, platformId)
149-
err = loadPlatform(platform, targetPackage.PackageId, subfolderPath, packagePlatformTxt)
142+
err = loadPlatform(platform, targetPackage.PackageId, subfolderPath)
150143
if err != nil {
151144
return utils.WrapError(err)
152145
}
@@ -170,7 +163,7 @@ func getOrCreatePlatform(platforms map[string]*types.Platform, platformId string
170163
return &targetPlatform
171164
}
172165

173-
func loadPlatform(targetPlatform *types.Platform, packageId string, folder string, packagePlatformTxt map[string]string) error {
166+
func loadPlatform(targetPlatform *types.Platform, packageId string, folder string) error {
174167
_, err := os.Stat(filepath.Join(folder, constants.FILE_BOARDS_TXT))
175168
if err != nil && !os.IsNotExist(err) {
176169
return utils.WrapError(err)
@@ -189,7 +182,7 @@ func loadPlatform(targetPlatform *types.Platform, packageId string, folder strin
189182

190183
assignDefaultBoardToPlatform(targetPlatform)
191184

192-
platformProperties, err := props.SafeLoad(filepath.Join(folder, constants.FILE_PLATFORM_TXT))
185+
platformTxt, err := props.SafeLoad(filepath.Join(folder, constants.FILE_PLATFORM_TXT))
193186
if err != nil {
194187
return utils.WrapError(err)
195188
}
@@ -199,7 +192,7 @@ func loadPlatform(targetPlatform *types.Platform, packageId string, folder strin
199192
return utils.WrapError(err)
200193
}
201194

202-
targetPlatform.Properties = utils.MergeMapsOfStrings(make(map[string]string), targetPlatform.Properties, packagePlatformTxt, platformProperties, localPlatformProperties)
195+
targetPlatform.Properties = utils.MergeMapsOfStrings(make(map[string]string), targetPlatform.Properties, platformTxt, localPlatformProperties)
203196

204197
programmersProperties, err := props.SafeLoad(filepath.Join(folder, constants.FILE_PROGRAMMERS_TXT))
205198
if err != nil {

src/arduino.cc/builder/test/hardware_loader_test.go

+19-6
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"arduino.cc/builder"
3434
"arduino.cc/builder/constants"
3535
"arduino.cc/builder/types"
36+
"arduino.cc/builder/utils"
3637
"github.com/stretchr/testify/require"
3738
"path/filepath"
3839
"runtime"
@@ -69,7 +70,10 @@ func TestLoadHardware(t *testing.T) {
6970

7071
require.Equal(t, "AVRISP mkII", avrPlatform.Programmers["avrispmkii"][constants.PROGRAMMER_NAME])
7172

72-
require.Equal(t, "{path}/ctags", avrPlatform.Properties["tools.ctags.cmd.path"])
73+
require.Equal(t, "{runtime.tools.ctags.path}", packages.Properties["tools.ctags.path"])
74+
require.Equal(t, "\"{cmd.path}\" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns \"{source_file}\"", packages.Properties["tools.ctags.pattern"])
75+
require.Equal(t, "{runtime.tools.avrdude.path}", packages.Properties["tools.avrdude.path"])
76+
require.Equal(t, "-w -x c++ -E -CC", packages.Properties["preproc.macros.flags"])
7377
}
7478

7579
func TestLoadHardwareMixingUserHardwareFolder(t *testing.T) {
@@ -120,12 +124,22 @@ func TestLoadHardwareMixingUserHardwareFolder(t *testing.T) {
120124

121125
require.Equal(t, "-w -x c++ -M -MG -MP", avrPlatform.Properties["preproc.includes.flags"])
122126
require.Equal(t, "-w -x c++ -E -CC", avrPlatform.Properties["preproc.macros.flags"])
123-
require.Equal(t, "{build.mbed_api_include} {build.nRF51822_api_include} {build.ble_api_include} {compiler.libsam.c.flags} {compiler.arm.cmsis.path} {build.variant_system_include}", avrPlatform.Properties["preproc.macros.compatibility_flags"])
124-
require.Equal(t, "\"{compiler.path}{compiler.cpp.cmd}\" {preproc.includes.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} \"{source_file}\"", avrPlatform.Properties[constants.RECIPE_PREPROC_INCLUDES])
127+
require.Equal(t, "\"{compiler.path}{compiler.cpp.cmd}\" {compiler.cpp.flags} {preproc.includes.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} \"{source_file}\"", avrPlatform.Properties[constants.RECIPE_PREPROC_INCLUDES])
128+
require.False(t, utils.MapStringStringHas(avrPlatform.Properties, "preproc.macros.compatibility_flags"))
125129

126130
require.NotNil(t, packages.Packages["my_avr_platform"])
127-
myAVRPlatform := packages.Packages["my_avr_platform"].Platforms["avr"]
128-
require.Equal(t, "custom_yun", myAVRPlatform.Boards["custom_yun"].BoardId)
131+
myAVRPlatform := packages.Packages["my_avr_platform"]
132+
require.Equal(t, "hello world", myAVRPlatform.Properties["example"])
133+
myAVRPlatformAvrArch := myAVRPlatform.Platforms["avr"]
134+
require.Equal(t, "custom_yun", myAVRPlatformAvrArch.Boards["custom_yun"].BoardId)
135+
136+
require.False(t, utils.MapStringStringHas(myAVRPlatformAvrArch.Properties, "preproc.includes.flags"))
137+
138+
require.Equal(t, "{runtime.tools.ctags.path}", packages.Properties["tools.ctags.path"])
139+
require.Equal(t, "\"{cmd.path}\" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns \"{source_file}\"", packages.Properties["tools.ctags.pattern"])
140+
require.Equal(t, "{runtime.tools.avrdude.path}", packages.Properties["tools.avrdude.path"])
141+
require.Equal(t, "-w -x c++ -E -CC", packages.Properties["preproc.macros.flags"])
142+
require.Equal(t, "{build.mbed_api_include} {build.nRF51822_api_include} {build.ble_api_include} {compiler.libsam.c.flags} {compiler.arm.cmsis.path} {build.variant_system_include}", packages.Properties["preproc.macros.compatibility_flags"])
129143

130144
if runtime.GOOS != "windows" {
131145
require.NotNil(t, packages.Packages["my_symlinked_avr_platform"])
@@ -173,7 +187,6 @@ func TestLoadHardwareWithBoardManagerFolderStructure(t *testing.T) {
173187
require.Equal(t, "blend", avrRedBearPlatform.Boards["blend"].BoardId)
174188
require.Equal(t, "blend", avrRedBearPlatform.Boards["blend"].Properties[constants.ID])
175189
require.Equal(t, "arduino:arduino", avrRedBearPlatform.Boards["blend"].Properties[constants.BUILD_PROPERTIES_BUILD_CORE])
176-
177190
}
178191

179192
func TestLoadLotsOfHardware(t *testing.T) {

src/arduino.cc/builder/test/setup_build_properties_test.go

+61-4
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,6 @@ func TestSetupBuildProperties(t *testing.T) {
8080
require.Equal(t, "\"{compiler.path}{compiler.c.cmd}\" {compiler.c.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} \"{source_file}\" -o \"{object_file}\"", buildProperties["recipe.c.o.pattern"])
8181
require.Equal(t, "{path}/etc/avrdude.conf", buildProperties["tools.avrdude.config.path"])
8282

83-
coanProps := props.SubTree(props.SubTree(buildProperties, constants.BUILD_PROPERTIES_TOOLS_KEY), constants.COAN)
84-
require.Equal(t, "{path}/coan", coanProps["cmd.path"])
85-
require.Equal(t, "\"{cmd.path}\" source -m -E -P -kb {compiler.c.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} \"{source_file}\"", coanProps[constants.BUILD_PROPERTIES_PATTERN])
86-
8783
require.Equal(t, Abs(t, "downloaded_hardware/arduino/avr"), buildProperties[constants.BUILD_PROPERTIES_RUNTIME_PLATFORM_PATH])
8884
require.Equal(t, Abs(t, "downloaded_hardware/arduino"), buildProperties[constants.BUILD_PROPERTIES_RUNTIME_HARDWARE_PATH])
8985
require.Equal(t, "10600", buildProperties[constants.CTX_BUILD_PROPERTIES_RUNTIME_IDE_VERSION])
@@ -186,3 +182,64 @@ func TestSetupBuildPropertiesUserHardware(t *testing.T) {
186182
require.Equal(t, Abs(t, filepath.Join("user_hardware", "my_avr_platform", "avr")), buildProperties[constants.BUILD_PROPERTIES_RUNTIME_PLATFORM_PATH])
187183
require.Equal(t, Abs(t, filepath.Join("user_hardware", "my_avr_platform")), buildProperties[constants.BUILD_PROPERTIES_RUNTIME_HARDWARE_PATH])
188184
}
185+
186+
func TestSetupBuildPropertiesWithMissingPropsFromParentPlatformTxtFiles(t *testing.T) {
187+
DownloadCoresAndToolsAndLibraries(t)
188+
189+
context := make(map[string]interface{})
190+
191+
buildPath := SetupBuildPath(t, context)
192+
defer os.RemoveAll(buildPath)
193+
194+
context[constants.CTX_BUILD_PROPERTIES_RUNTIME_IDE_VERSION] = "10600"
195+
context[constants.CTX_HARDWARE_FOLDERS] = []string{filepath.Join("..", "hardware"), "hardware", "downloaded_hardware", "user_hardware"}
196+
context[constants.CTX_TOOLS_FOLDERS] = []string{"downloaded_tools", "./tools_builtin"}
197+
context[constants.CTX_FQBN] = "my_avr_platform:avr:custom_yun"
198+
context[constants.CTX_SKETCH_LOCATION] = filepath.Join("sketch1", "sketch.ino")
199+
200+
commands := []types.Command{
201+
&builder.SetupHumanLoggerIfMissing{},
202+
&builder.ContainerSetupHardwareToolsLibsSketchAndProps{},
203+
}
204+
205+
for _, command := range commands {
206+
err := command.Run(context)
207+
NoError(t, err)
208+
}
209+
210+
buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string)
211+
212+
require.Equal(t, "ARDUINO", buildProperties[constants.BUILD_PROPERTIES_SOFTWARE])
213+
214+
require.Equal(t, "custom_yun", buildProperties[constants.ID])
215+
require.Equal(t, "Arduino Yún", buildProperties["name"])
216+
require.Equal(t, "0x2341", buildProperties["vid.0"])
217+
require.Equal(t, "\"{compiler.path}{compiler.c.cmd}\" {compiler.c.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} \"{source_file}\" -o \"{object_file}\"", buildProperties["recipe.c.o.pattern"])
218+
require.Equal(t, "{path}/etc/avrdude.conf", buildProperties["tools.avrdude.config.path"])
219+
220+
coanProps := props.SubTree(props.SubTree(buildProperties, constants.BUILD_PROPERTIES_TOOLS_KEY), constants.COAN)
221+
require.Equal(t, "{path}/coan", coanProps["cmd.path"])
222+
require.Equal(t, "\"{cmd.path}\" source -m -E -P -kb {compiler.c.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} \"{source_file}\"", coanProps[constants.BUILD_PROPERTIES_PATTERN])
223+
224+
require.Equal(t, Abs(t, "user_hardware/my_avr_platform/avr"), buildProperties[constants.BUILD_PROPERTIES_RUNTIME_PLATFORM_PATH])
225+
require.Equal(t, Abs(t, "user_hardware/my_avr_platform"), buildProperties[constants.BUILD_PROPERTIES_RUNTIME_HARDWARE_PATH])
226+
require.Equal(t, "10600", buildProperties[constants.CTX_BUILD_PROPERTIES_RUNTIME_IDE_VERSION])
227+
require.NotEmpty(t, buildProperties[constants.BUILD_PROPERTIES_RUNTIME_OS])
228+
229+
require.Equal(t, Abs(t, "./downloaded_tools/arm-none-eabi-gcc/4.8.3-2014q1"), buildProperties["runtime.tools.arm-none-eabi-gcc.path"])
230+
require.Equal(t, Abs(t, "./downloaded_tools/arm-none-eabi-gcc/4.8.3-2014q1"), buildProperties["runtime.tools.arm-none-eabi-gcc-4.8.3-2014q1.path"])
231+
require.Equal(t, Abs(t, "./downloaded_tools/bossac/1.3a-arduino"), buildProperties["runtime.tools.bossac-1.3a-arduino.path"])
232+
require.Equal(t, Abs(t, "./downloaded_tools/bossac/1.5-arduino"), buildProperties["runtime.tools.bossac-1.5-arduino.path"])
233+
require.True(t, buildProperties["runtime.tools.bossac.path"] == Abs(t, "./downloaded_tools/bossac/1.3a-arduino") || buildProperties["runtime.tools.bossac.path"] == Abs(t, "./downloaded_tools/bossac/1.5-arduino"))
234+
require.Equal(t, Abs(t, "./downloaded_tools/avrdude/6.0.1-arduino5"), buildProperties["runtime.tools.avrdude.path"])
235+
require.Equal(t, Abs(t, "./downloaded_tools/avrdude/6.0.1-arduino5"), buildProperties["runtime.tools.avrdude-6.0.1-arduino5.path"])
236+
require.Equal(t, Abs(t, "./downloaded_tools/avr-gcc/4.8.1-arduino5"), buildProperties["runtime.tools.avr-gcc.path"])
237+
require.Equal(t, Abs(t, "./downloaded_tools/avr-gcc/4.8.1-arduino5"), buildProperties["runtime.tools.avr-gcc-4.8.1-arduino5.path"])
238+
239+
require.Equal(t, Abs(t, filepath.Join("sketch1", "sketch.ino")), buildProperties[constants.BUILD_PROPERTIES_SOURCE_PATH])
240+
241+
require.True(t, utils.MapStringStringHas(buildProperties, constants.BUILD_PROPERTIES_EXTRA_TIME_UTC))
242+
require.True(t, utils.MapStringStringHas(buildProperties, constants.BUILD_PROPERTIES_EXTRA_TIME_LOCAL))
243+
require.True(t, utils.MapStringStringHas(buildProperties, constants.BUILD_PROPERTIES_EXTRA_TIME_ZONE))
244+
require.True(t, utils.MapStringStringHas(buildProperties, constants.BUILD_PROPERTIES_EXTRA_TIME_DST))
245+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
example=hello world

0 commit comments

Comments
 (0)