forked from arduino/arduino-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathloader.go
127 lines (111 loc) · 4.25 KB
/
loader.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// This file is part of arduino-cli.
//
// Copyright 2020 ARDUINO SA (http://www.arduino.cc/)
//
// This software is released under the GNU General Public License version 3,
// which covers the main part of arduino-cli.
// The terms of this license can be found at:
// https://www.gnu.org/licenses/gpl-3.0.en.html
//
// You can be released from the requirements of the above licenses by purchasing
// a commercial license. Buying such a license is mandatory if you want to
// modify or otherwise use the software for commercial activities involving the
// Arduino software without disclosing the source code of your own applications.
// To purchase a commercial license, send an email to [email protected].
package libraries
import (
"fmt"
"strings"
"github.com/arduino/go-paths-helper"
properties "github.com/arduino/go-properties-orderedmap"
semver "go.bug.st/relaxed-semver"
)
// Load loads a library from the given LibraryLocation
func Load(libDir *paths.Path, location LibraryLocation) (*Library, error) {
if libDir.Join("library.properties").Exist() {
return makeNewLibrary(libDir, location)
}
return makeLegacyLibrary(libDir, location)
}
func addUtilityDirectory(library *Library) {
utilitySourcePath := library.InstallDir.Join("utility")
if utilitySourcePath.IsDir() {
library.UtilityDir = utilitySourcePath
}
}
func makeNewLibrary(libraryDir *paths.Path, location LibraryLocation) (*Library, error) {
libProperties, err := properties.Load(libraryDir.Join("library.properties").String())
if err != nil {
return nil, fmt.Errorf("loading library.properties: %s", err)
}
if libProperties.Get("maintainer") == "" && libProperties.Get("email") != "" {
libProperties.Set("maintainer", libProperties.Get("email"))
}
for _, propName := range MandatoryProperties {
if libProperties.Get(propName) == "" {
libProperties.Set(propName, "-")
}
}
library := &Library{}
library.Location = location
library.InstallDir = libraryDir
if libraryDir.Join("src").Exist() {
library.Layout = RecursiveLayout
library.SourceDir = libraryDir.Join("src")
} else {
library.Layout = FlatLayout
library.SourceDir = libraryDir
addUtilityDirectory(library)
}
if libProperties.Get("architectures") == "" {
libProperties.Set("architectures", "*")
}
library.Architectures = []string{}
for _, arch := range strings.Split(libProperties.Get("architectures"), ",") {
library.Architectures = append(library.Architectures, strings.TrimSpace(arch))
}
libProperties.Set("category", strings.TrimSpace(libProperties.Get("category")))
if !ValidCategories[libProperties.Get("category")] {
libProperties.Set("category", "Uncategorized")
}
library.Category = libProperties.Get("category")
if libProperties.Get("license") == "" {
libProperties.Set("license", "Unspecified")
}
library.License = libProperties.Get("license")
version := strings.TrimSpace(libProperties.Get("version"))
if v, err := semver.Parse(version); err != nil {
// FIXME: do it in linter?
//fmt.Printf("invalid version %s for library in %s: %s", version, libraryDir, err)
} else {
library.Version = v
}
library.Name = libraryDir.Base()
library.RealName = strings.TrimSpace(libProperties.Get("name"))
library.Author = strings.TrimSpace(libProperties.Get("author"))
library.Maintainer = strings.TrimSpace(libProperties.Get("maintainer"))
library.Sentence = strings.TrimSpace(libProperties.Get("sentence"))
library.Paragraph = strings.TrimSpace(libProperties.Get("paragraph"))
library.Website = strings.TrimSpace(libProperties.Get("url"))
library.IsLegacy = false
library.DotALinkage = libProperties.GetBoolean("dot_a_linkage")
library.PrecompiledWithSources = libProperties.Get("precompiled") == "full"
library.Precompiled = libProperties.Get("precompiled") == "true" || library.PrecompiledWithSources
library.LDflags = strings.TrimSpace(libProperties.Get("ldflags"))
library.Properties = libProperties
return library, nil
}
func makeLegacyLibrary(path *paths.Path, location LibraryLocation) (*Library, error) {
library := &Library{
InstallDir: path,
Location: location,
SourceDir: path,
Layout: FlatLayout,
Name: path.Base(),
Architectures: []string{"*"},
IsLegacy: true,
Version: semver.MustParse(""),
}
addUtilityDirectory(library)
return library, nil
}