Allow locally installed libraries in sketch profiles. (#2930) · arduino/arduino-cli@3dca438 (original) (raw)

``

1

`+

// This file is part of arduino-cli.

`

``

2

`+

//

`

``

3

`+

// Copyright 2022-2025 ARDUINO SA (http://www.arduino.cc/)

`

``

4

`+

//

`

``

5

`+

// This software is released under the GNU General Public License version 3,

`

``

6

`+

// which covers the main part of arduino-cli.

`

``

7

`+

// The terms of this license can be found at:

`

``

8

`+

// https://www.gnu.org/licenses/gpl-3.0.en.html

`

``

9

`+

//

`

``

10

`+

// You can be released from the requirements of the above licenses by purchasing

`

``

11

`+

// a commercial license. Buying such a license is mandatory if you want to

`

``

12

`+

// modify or otherwise use the software for commercial activities involving the

`

``

13

`+

// Arduino software without disclosing the source code of your own applications.

`

``

14

`+

// To purchase a commercial license, send an email to license@arduino.cc.

`

``

15

+

``

16

`+

package sketch_test

`

``

17

+

``

18

`+

import (

`

``

19

`+

"encoding/json"

`

``

20

`+

"strings"

`

``

21

`+

"testing"

`

``

22

+

``

23

`+

"github.com/arduino/arduino-cli/internal/integrationtest"

`

``

24

`+

"github.com/arduino/go-paths-helper"

`

``

25

`+

"github.com/stretchr/testify/require"

`

``

26

`+

"go.bug.st/testifyjson/requirejson"

`

``

27

`+

)

`

``

28

+

``

29

`+

func TestSketchProfileDump(t *testing.T) {

`

``

30

`+

env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)

`

``

31

`+

t.Cleanup(env.CleanUp)

`

``

32

+

``

33

`+

// Prepare the sketch with libraries

`

``

34

`+

tmpDir, err := paths.MkTempDir("", "")

`

``

35

`+

require.NoError(t, err)

`

``

36

`+

t.Cleanup(func() { _ = tmpDir.RemoveAll })

`

``

37

+

``

38

`+

sketchTemplate, err := paths.New("testdata", "SketchWithLibrary").Abs()

`

``

39

`+

require.NoError(t, err)

`

``

40

+

``

41

`+

sketch := tmpDir.Join("SketchWithLibrary")

`

``

42

`+

libInside := sketch.Join("libraries", "MyLib")

`

``

43

`+

err = sketchTemplate.CopyDirTo(sketch)

`

``

44

`+

require.NoError(t, err)

`

``

45

+

``

46

`+

libOutsideTemplate := sketchTemplate.Join("..", "MyLibOutside")

`

``

47

`+

libOutside := sketch.Join("..", "MyLibOutside")

`

``

48

`+

err = libOutsideTemplate.CopyDirTo(libOutside)

`

``

49

`+

require.NoError(t, err)

`

``

50

+

``

51

`+

// Install the required core and libraries

`

``

52

`+

_, _, err = cli.Run("core", "install", "arduino:avr@1.8.6")

`

``

53

`+

require.NoError(t, err)

`

``

54

`+

_, _, err = cli.Run("lib", "install", "Adafruit BusIO@1.17.1", "--no-overwrite")

`

``

55

`+

require.NoError(t, err)

`

``

56

`+

_, _, err = cli.Run("lib", "install", "Adafruit GFX Library@1.12.1", "--no-overwrite")

`

``

57

`+

require.NoError(t, err)

`

``

58

`+

_, _, err = cli.Run("lib", "install", "Adafruit SSD1306@2.5.14", "--no-overwrite")

`

``

59

`+

require.NoError(t, err)

`

``

60

+

``

61

`+

// Check if the profile dump:

`

``

62

`+

// - keeps libraries in the sketch with a relative path

`

``

63

`+

// - keeps libraries outside the sketch with an absolute path

`

``

64

`+

// - keeps libraries installed in the system with just the name and version

`

``

65

`+

out, _, err := cli.Run("compile", "-b", "arduino:avr:uno",

`

``

66

`+

"--library", libInside.String(),

`

``

67

`+

"--library", libOutside.String(),

`

``

68

`+

"--dump-profile",

`

``

69

`+

sketch.String())

`

``

70

`+

require.NoError(t, err)

`

``

71

`` +

require.Equal(t, strings.TrimSpace(`

``

``

72

`+

profiles:

`

``

73

`+

uno:

`

``

74

`+

fqbn: arduino:avr:uno

`

``

75

`+

platforms:

`

``

76

`+

`

``

77

`+

libraries:

`

``

78

`+

`

``

79

`` +

``

``

80

`+

`

``

81

`+

`

``

82

`+

`

``

83

`` +

`), strings.TrimSpace(string(out)))

``

``

84

+

``

85

`+

// Dump the profile in the sketch directory and compile with it again

`

``

86

`+

err = sketch.Join("sketch.yaml").WriteFile(out)

`

``

87

`+

require.NoError(t, err)

`

``

88

`+

out, _, err = cli.Run("compile", "-m", "uno", "--json", sketch.String())

`

``

89

`+

require.NoError(t, err)

`

``

90

`+

// Check if local libraries are picked up correctly

`

``

91

`+

libInsideJson, _ := json.Marshal(libInside.String())

`

``

92

`+

libOutsideJson, _ := json.Marshal(libOutside.String())

`

``

93

`+

j := requirejson.Parse(t, out).Query(".builder_result.used_libraries")

`

``

94

`` +

j.MustContain(`

``

``

95

`+

[

`

``

96

`` +

{"name": "MyLib", "install_dir": + string(libInsideJson) +},

``

``

97

`` +

{"name": "MyLibOutside", "install_dir": + string(libOutsideJson) +}

``

``

98

`` +

]`)

``

``

99

`+

}

`