Skip to content

Commit 358be9b

Browse files
committed
Add LDFLAGS to library properties and use to link dynamic libs
Since ld uses absolute paths in certain conditions, adopt a different strategy for dynamic libraries. "compiler.c.elf.extra_flags" must be defined and used in "recipe.c.combine" (at least)
1 parent d2ff99c commit 358be9b

File tree

4 files changed

+35
-2
lines changed

4 files changed

+35
-2
lines changed

Diff for: src/arduino.cc/builder/constants/constants.go

+2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ const BUILD_PROPERTIES_BUILD_SYSTEM_PATH = "build.system.path"
4848
const BUILD_PROPERTIES_BUILD_VARIANT = "build.variant"
4949
const BUILD_PROPERTIES_BUILD_VARIANT_PATH = "build.variant.path"
5050
const BUILD_PROPERTIES_COMPILER_C_ELF_FLAGS = "compiler.c.elf.flags"
51+
const BUILD_PROPERTIES_COMPILER_C_ELF_EXTRAFLAGS = "compiler.c.elf.extra_flags"
5152
const BUILD_PROPERTIES_COMPILER_CPP_FLAGS = "compiler.cpp.flags"
5253
const BUILD_PROPERTIES_COMPILER_PATH = "compiler.path"
5354
const BUILD_PROPERTIES_COMPILER_WARNING_FLAGS = "compiler.warning_flags"
@@ -138,6 +139,7 @@ const LIBRARY_MAINTAINER = "maintainer"
138139
const LIBRARY_NAME = "name"
139140
const LIBRARY_PARAGRAPH = "paragraph"
140141
const LIBRARY_PRECOMPILED = "precompiled"
142+
const LIBRARY_LDFLAGS = "ldflags"
141143
const LIBRARY_PROPERTIES = "library.properties"
142144
const LIBRARY_SENTENCE = "sentence"
143145
const LIBRARY_URL = "url"

Diff for: src/arduino.cc/builder/libraries_loader.go

+1
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ func makeNewLibrary(libraryFolder string, debugLevel int, logger i18n.Logger) (*
194194
library.IsLegacy = false
195195
library.DotALinkage = strings.TrimSpace(libProperties[constants.LIBRARY_DOT_A_LINKAGE]) == "true"
196196
library.Precompiled = strings.TrimSpace(libProperties[constants.LIBRARY_PRECOMPILED]) == "true"
197+
library.LDflags = strings.TrimSpace(libProperties[constants.LIBRARY_LDFLAGS])
197198
library.Properties = libProperties
198199

199200
return library, nil

Diff for: src/arduino.cc/builder/phases/libraries_builder.go

+31-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ import (
4141
"arduino.cc/properties"
4242
)
4343

44-
var PRECOMPILED_LIBRARIES_VALID_EXTENSIONS = map[string]bool{".a": true, ".so": true}
44+
var PRECOMPILED_LIBRARIES_VALID_EXTENSIONS_STATIC = map[string]bool{".a": true}
45+
var PRECOMPILED_LIBRARIES_VALID_EXTENSIONS_DYNAMIC = map[string]bool{".so": true}
4546

4647
type LibrariesBuilder struct{}
4748

@@ -67,6 +68,34 @@ func (s *LibrariesBuilder) Run(ctx *types.Context) error {
6768

6869
ctx.LibrariesObjectFiles = objectFiles
6970

71+
// Search for precompiled libraries
72+
fixLDFLAGforPrecompiledLibraries(ctx, libraries)
73+
74+
return nil
75+
}
76+
77+
func fixLDFLAGforPrecompiledLibraries(ctx *types.Context, libraries []*types.Library) error {
78+
79+
for _, library := range libraries {
80+
if library.Precompiled {
81+
// add library src path to compiler.c.elf.extra_flags
82+
// use library.Name as lib name and srcPath/{mcpu} as location
83+
mcu := ctx.BuildProperties[constants.BUILD_PROPERTIES_BUILD_MCU]
84+
path := filepath.Join(library.SrcFolder, mcu)
85+
// find all library names in the folder and prepend -l
86+
filePaths := []string{}
87+
libs_cmd := library.LDflags + " "
88+
extensions := func(ext string) bool { return PRECOMPILED_LIBRARIES_VALID_EXTENSIONS_DYNAMIC[ext] }
89+
utils.FindFilesInFolder(&filePaths, path, extensions, true)
90+
for _, lib := range filePaths {
91+
name := strings.TrimSuffix(filepath.Base(lib), filepath.Ext(lib))
92+
// strip "lib" first occurrence
93+
name = strings.Replace(name, "lib", "", 1)
94+
libs_cmd += "-l" + name + " "
95+
}
96+
ctx.BuildProperties[constants.BUILD_PROPERTIES_COMPILER_C_ELF_EXTRAFLAGS] += "\"-L" + path + "\" " + libs_cmd
97+
}
98+
}
7099
return nil
71100
}
72101

@@ -99,7 +128,7 @@ func compileLibrary(library *types.Library, buildPath string, buildProperties pr
99128

100129
if library.Precompiled {
101130
// search for files with PRECOMPILED_LIBRARIES_VALID_EXTENSIONS
102-
extensions := func(ext string) bool { return PRECOMPILED_LIBRARIES_VALID_EXTENSIONS[ext] }
131+
extensions := func(ext string) bool { return PRECOMPILED_LIBRARIES_VALID_EXTENSIONS_STATIC[ext] }
103132

104133
filePaths := []string{}
105134
mcu := buildProperties[constants.BUILD_PROPERTIES_BUILD_MCU]

Diff for: src/arduino.cc/builder/types/types.go

+1
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ type Library struct {
172172
Archs []string
173173
DotALinkage bool
174174
Precompiled bool
175+
LDflags string
175176
IsLegacy bool
176177
Version string
177178
Author string

0 commit comments

Comments
 (0)