Skip to content

Commit cd9236d

Browse files
author
Federico Fissore
committed
Implemented library linking from archive files rather then object files.
Feature exposed ONLY to libraries with "dot_a_linkage=true" in their library.properties file Fixes #10 Signed-off-by: Federico Fissore <[email protected]>
1 parent b966748 commit cd9236d

File tree

5 files changed

+19
-4
lines changed

5 files changed

+19
-4
lines changed

Diff for: src/arduino.cc/builder/builder_utils/utils.go

+1
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ func ArchiveCompiledFiles(buildPath string, archiveFile string, objectFiles []st
170170
for _, objectFile := range objectFiles {
171171
properties := utils.MergeMapsOfStrings(make(map[string]string), buildProperties)
172172
properties[constants.BUILD_PROPERTIES_ARCHIVE_FILE] = filepath.Base(archiveFilePath)
173+
properties[constants.BUILD_PROPERTIES_ARCHIVE_FILE_PATH] = archiveFilePath
173174
properties[constants.BUILD_PROPERTIES_OBJECT_FILE] = objectFile
174175

175176
_, err := ExecRecipe(properties, constants.RECIPE_AR_PATTERN, false, verbose, verbose, logger)

Diff for: src/arduino.cc/builder/hardware/platform.keys.rewrite.txt

+3
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,6 @@ new.6.recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" -mcpu={buil
2323
#specific to RFduino 1.6.3
2424
old.7.recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mcpu={build.mcu} {build.extra_flags} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" -Wl,--cref -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -Wl,--warn-common -Wl,--warn-section-align -Wl,--start-group "{build.path}/syscalls.c.o" {object_files} "{build.variant.path}/{build.variant_system_lib}" "{build.variant.path}/libRFduino.a" "{build.variant.path}/libRFduinoBLE.a" "{build.variant.path}/libRFduinoGZLL.a" "{build.path}/{archive_file}" -Wl,--end-group
2525
new.7.recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -mcpu={build.mcu} {build.extra_flags} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" -Wl,--cref -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -Wl,--warn-common -Wl,--warn-section-align -Wl,--start-group "{build.path}/core/syscalls.c.o" {object_files} "{build.variant.path}/{build.variant_system_lib}" "{build.variant.path}/libRFduino.a" "{build.variant.path}/libRFduinoBLE.a" "{build.variant.path}/libRFduinoGZLL.a" "{build.path}/{archive_file}" -Wl,--end-group
26+
27+
old.8.recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/{archive_file}" "{object_file}"
28+
new.8.recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}"

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

+7
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,13 @@ func compileLibrary(objectFiles []string, library *types.Library, buildPath stri
9393
if err != nil {
9494
return nil, utils.WrapError(err)
9595
}
96+
if library.DotALinkage {
97+
archiveFile, err := builder_utils.ArchiveCompiledFiles(libraryBuildPath, library.Name+".a", objectFiles, buildProperties, verbose, logger)
98+
if err != nil {
99+
return nil, utils.WrapError(err)
100+
}
101+
objectFiles = []string{archiveFile}
102+
}
96103
} else {
97104
utilitySourcePath := filepath.Join(library.SrcFolder, constants.LIBRARY_FOLDER_UTILITY)
98105
_, utilitySourcePathErr := os.Stat(utilitySourcePath)

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

+7-3
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,18 @@ func (s *Linker) Run(context map[string]interface{}) error {
4949
objectFiles = append(objectFiles, objectFilesLibraries...)
5050

5151
coreArchiveFilePath := context[constants.CTX_ARCHIVE_FILE_PATH_CORE].(string)
52+
buildPath := context[constants.CTX_BUILD_PATH].(string)
53+
coreDotARelPath, err := filepath.Rel(buildPath, coreArchiveFilePath)
54+
if err != nil {
55+
return utils.WrapError(err)
56+
}
5257

5358
buildProperties := context[constants.CTX_BUILD_PROPERTIES].(map[string]string)
5459
verbose := context[constants.CTX_VERBOSE].(bool)
5560
warningsLevel := context[constants.CTX_WARNINGS_LEVEL].(string)
5661
logger := context[constants.CTX_LOGGER].(i18n.Logger)
5762

58-
err := link(objectFiles, coreArchiveFilePath, buildProperties, verbose, warningsLevel, logger)
63+
err = link(objectFiles, coreDotARelPath, buildProperties, verbose, warningsLevel, logger)
5964
if err != nil {
6065
return utils.WrapError(err)
6166
}
@@ -72,8 +77,7 @@ func link(objectFiles []string, coreArchiveFilePath string, buildProperties map[
7277
properties := utils.MergeMapsOfStrings(make(map[string]string), buildProperties)
7378
properties[constants.BUILD_PROPERTIES_COMPILER_C_ELF_FLAGS] = properties[constants.BUILD_PROPERTIES_COMPILER_C_ELF_FLAGS] + optRelax
7479
properties[constants.BUILD_PROPERTIES_COMPILER_WARNING_FLAGS] = properties[constants.BUILD_PROPERTIES_COMPILER_WARNING_FLAGS+"."+warningsLevel]
75-
properties[constants.BUILD_PROPERTIES_ARCHIVE_FILE] = filepath.Base(coreArchiveFilePath)
76-
properties[constants.BUILD_PROPERTIES_ARCHIVE_FILE_PATH] = coreArchiveFilePath
80+
properties[constants.BUILD_PROPERTIES_ARCHIVE_FILE] = coreArchiveFilePath
7781
properties[constants.BUILD_PROPERTIES_OBJECT_FILES] = objectFileList
7882

7983
_, err := builder_utils.ExecRecipe(properties, constants.RECIPE_C_COMBINE_PATTERN, false, verbose, verbose, logger)

Diff for: src/arduino.cc/builder/test/platform_keys_rewrite_loader_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func TestLoadPlatformKeysRewrite(t *testing.T) {
4848

4949
platformKeysRewrite := context[constants.CTX_PLATFORM_KEYS_REWRITE].(types.PlatforKeysRewrite)
5050

51-
require.Equal(t, 8, len(platformKeysRewrite.Rewrites))
51+
require.Equal(t, 9, len(platformKeysRewrite.Rewrites))
5252
require.Equal(t, constants.BUILD_PROPERTIES_COMPILER_PATH, platformKeysRewrite.Rewrites[0].Key)
5353
require.Equal(t, "{runtime.ide.path}/hardware/tools/avr/bin/", platformKeysRewrite.Rewrites[0].OldValue)
5454
require.Equal(t, "{runtime.tools.avr-gcc.path}/bin/", platformKeysRewrite.Rewrites[0].NewValue)

0 commit comments

Comments
 (0)