From e621d836723418ba4c63bac0aa6e5897ac7623ef Mon Sep 17 00:00:00 2001 From: Daniel Brondani Date: Thu, 25 Jun 2026 09:46:18 +0200 Subject: [PATCH] Handle library paths with spaces --- pkg/maker/buildcontent.go | 19 +++++++++++++++++-- pkg/maker/buildcontent_test.go | 14 ++++++++++++++ test/data/solutions/blanks/project/libr ary.a | 1 + .../project X.AC6 X+ARMCM0 X.cbuild.yml | 2 ++ .../blanks/project/project X.cproject.yml | 1 + .../project X.AC6 X+ARMCM0 X/CMakeLists.txt | 1 + 6 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 test/data/solutions/blanks/project/libr ary.a diff --git a/pkg/maker/buildcontent.go b/pkg/maker/buildcontent.go index f3878c0..ecc352d 100644 --- a/pkg/maker/buildcontent.go +++ b/pkg/maker/buildcontent.go @@ -389,7 +389,7 @@ func (c *Cbuild) CMakeTargetLinkLibrariesGlobal() string { // set content for _, library := range libraries { - content += "\n " + library + content += "\n " + quoteEntry(library) } content += "\n)" return content @@ -398,12 +398,27 @@ func (c *Cbuild) CMakeTargetLinkLibrariesGlobal() string { func (c *Cbuild) CMakeTargetLinkLibraries(name string, scope string, libraries ...string) string { content := "\ntarget_link_libraries(" + name + " " + scope for _, library := range libraries { - content += "\n " + library + content += "\n " + quoteEntry(library) } content += "\n)" return content } +func quoteEntry(entry string) string { + trimmed := strings.TrimLeft(entry, " ") + if len(trimmed) == 0 { + return entry + } + if !strings.Contains(trimmed, " ") { + return entry + } + leadingSpaces := entry[:len(entry)-len(trimmed)] + if strings.HasPrefix(trimmed, "\"") && strings.HasSuffix(trimmed, "\"") { + return entry + } + return leadingSpaces + "\"" + trimmed + "\"" +} + func (c *Cbuild) CMakeTargetCompileOptions(name string, scope string, lto bool, misc Misc, preIncludes []string, parent string) string { content := "\ntarget_compile_options(" + name + " " + scope content += "\n $" diff --git a/pkg/maker/buildcontent_test.go b/pkg/maker/buildcontent_test.go index c3f4417..a3c3cb7 100644 --- a/pkg/maker/buildcontent_test.go +++ b/pkg/maker/buildcontent_test.go @@ -455,6 +455,20 @@ add_dependencies(project.debug+target-executes assert.Contains(linkerOptions, "--linkCPP-flag") }) + t.Run("test quote link libraries with spaces", func(t *testing.T) { + var cbuild maker.Cbuild + content := cbuild.CMakeTargetLinkLibraries("TARGET", "PUBLIC", + "libnospace.a", + " libnospace2.a", + " C:/Program Files/vendor/lib with spaces.a", + " \"C:/Program Files/vendor/already quoted.a\"") + + assert.Contains(content, "\n libnospace.a") + assert.Contains(content, "\n libnospace2.a") + assert.Contains(content, "\n \"C:/Program Files/vendor/lib with spaces.a\"") + assert.Contains(content, "\n \"C:/Program Files/vendor/already quoted.a\"") + }) + t.Run("test linker options with pre-processing", func(t *testing.T) { var cbuild maker.Cbuild define := make([]interface{}, 1) diff --git a/test/data/solutions/blanks/project/libr ary.a b/test/data/solutions/blanks/project/libr ary.a new file mode 100644 index 0000000..7e06c94 --- /dev/null +++ b/test/data/solutions/blanks/project/libr ary.a @@ -0,0 +1 @@ +/* Dummy */ diff --git a/test/data/solutions/blanks/project/project X.AC6 X+ARMCM0 X.cbuild.yml b/test/data/solutions/blanks/project/project X.AC6 X+ARMCM0 X.cbuild.yml index 4a9b233..e94615f 100644 --- a/test/data/solutions/blanks/project/project X.AC6 X+ARMCM0 X.cbuild.yml +++ b/test/data/solutions/blanks/project/project X.AC6 X+ARMCM0 X.cbuild.yml @@ -107,6 +107,8 @@ build: files: - file: main.c category: sourceC + - file: libr ary.a + category: library constructed-files: - file: RTE/_AC6_X_ARMCM0_X/RTE_Components.h category: header diff --git a/test/data/solutions/blanks/project/project X.cproject.yml b/test/data/solutions/blanks/project/project X.cproject.yml index 0d21eac..67cc599 100644 --- a/test/data/solutions/blanks/project/project X.cproject.yml +++ b/test/data/solutions/blanks/project/project X.cproject.yml @@ -8,3 +8,4 @@ project: - group: Source files: - file: ./main.c + - file: ./libr ary.a diff --git a/test/data/solutions/blanks/ref/project X.AC6 X+ARMCM0 X/CMakeLists.txt b/test/data/solutions/blanks/ref/project X.AC6 X+ARMCM0 X/CMakeLists.txt index 8d361ed..0ca5401 100644 --- a/test/data/solutions/blanks/ref/project X.AC6 X+ARMCM0 X/CMakeLists.txt +++ b/test/data/solutions/blanks/ref/project X.AC6 X+ARMCM0 X/CMakeLists.txt @@ -83,6 +83,7 @@ target_link_libraries(${CONTEXT} PUBLIC Group_Source ARM_CMSIS_CORE_6_1_0 ARM_Device_Startup_C_Startup_2_2_0 + "${SOLUTION_ROOT}/project/libr ary.a" ) # Linker options