Skip to content

Commit 8af6042

Browse files
authored
[cbuild2cmake] Improve executes dependencies
1 parent cfd353d commit 8af6042

File tree

9 files changed

+131
-240
lines changed

9 files changed

+131
-240
lines changed

cmd/cbuild2cmake/commands/root_test.go

Lines changed: 3 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -305,49 +305,9 @@ set(OUTPUTS_1
305305
err := cmd.Execute()
306306
assert.Nil(err)
307307

308-
// check super CMakeLists contents
309-
content, err := utils.ReadFileContent(testCaseRoot + "/tmp/CMakeLists.txt")
308+
// check golden references
309+
err, mismatch := inittest.CompareFiles(testCaseRoot+"/ref", testCaseRoot+"/tmp")
310310
assert.Nil(err)
311-
312-
content = strings.ReplaceAll(content, "\r\n", "\n")
313-
assert.Contains(content, `
314-
# Execute: project.Release+ARMCM0-Sign_Artifact
315-
set(INPUT
316-
${SOLUTION_ROOT}/script/sign.cmake
317-
${SOLUTION_ROOT}/out/project/ARMCM0/Release/project.axf
318-
)
319-
list(GET INPUT 0 INPUT_0)
320-
set(OUTPUT
321-
${SOLUTION_ROOT}/out/project/ARMCM0/Release/project.axf.signed
322-
)
323-
add_custom_target(project.Release+ARMCM0-Sign_Artifact ALL DEPENDS ${OUTPUT})
324-
add_custom_command(OUTPUT ${OUTPUT} DEPENDS ${INPUT}
325-
COMMAND ${CMAKE_COMMAND} -DINPUT="${INPUT}" -DOUTPUT="${OUTPUT}" -P "${INPUT_0}"
326-
COMMENT project.Release+ARMCM0-Sign_Artifact
327-
)`)
328-
assert.Contains(content, `
329-
# Build dependencies
330-
add_dependencies(project.Debug+ARMCM0-build
331-
Generate_Project_Sources
332-
)
333-
add_dependencies(project.Release+ARMCM0-build
334-
Generate_Project_Sources
335-
)
336-
add_dependencies(Archive_Artifacts
337-
project.Release+ARMCM0-build
338-
project.Release+ARMCM0-Sign_Artifact
339-
)
340-
add_dependencies(project.Release+ARMCM0-executes
341-
Archive_Artifacts
342-
)
343-
add_dependencies(Run_After_Archiving
344-
Archive_Artifacts
345-
)
346-
add_dependencies(project.Release+ARMCM0-Sign_Artifact
347-
project.Release+ARMCM0-build
348-
)
349-
add_dependencies(project.Release+ARMCM0-executes
350-
project.Release+ARMCM0-Sign_Artifact
351-
)`)
311+
assert.False(mismatch)
352312
})
353313
}

pkg/maker/buildcontent.go

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ type CompilerAbstractions struct {
3838

3939
type ScopeMap map[string]map[string][]string
4040
type LanguageMap map[string][]string
41+
type DependenciesMap map[string][]string
4142

4243
var CategoryLanguageMap = map[string]string{
4344
"headerAsm": "ASM",
@@ -158,6 +159,7 @@ func (m *Maker) AddStepSuffix(name string) string {
158159

159160
func (m *Maker) CMakeTargetAddDependencies(name string, dependencies []string) string {
160161
var content string
162+
dependencies = utils.AppendUniquely(dependencies, m.GetAllRunAlways(name)...)
161163
if len(dependencies) > 0 {
162164
content += "\nadd_dependencies(" + m.AddStepSuffix(name)
163165
for _, dependency := range dependencies {
@@ -176,22 +178,53 @@ func (m *Maker) BuildDependencies() string {
176178
}
177179
content += m.CMakeTargetAddDependencies(cbuild.Project+cbuild.Configuration, cbuild.DependsOn)
178180
}
181+
var postBuildDependencies = make(DependenciesMap)
179182
for _, item := range m.CbuildIndex.BuildIdx.Executes {
180183
content += m.CMakeTargetAddDependencies(item.Execute, item.DependsOn)
181-
// add executes statement to ${CONTEXT}-executes target of context
182-
// if dependency is a context
183-
for _, dependsOn := range item.DependsOn {
184-
if slices.Contains(m.Contexts, dependsOn) {
185-
content += m.CMakeTargetAddDependencies(dependsOn+"-executes", []string{item.Execute})
186-
}
187-
}
184+
postBuildDependencies = m.GetContextDependencies(item.Execute, item.DependsOn, postBuildDependencies)
185+
}
186+
// add executes statement to ${CONTEXT}-executes target of context
187+
for context, dependencies := range postBuildDependencies {
188+
content += m.CMakeTargetAddDependencies(context+"-executes", dependencies)
188189
}
189190
if len(content) > 0 {
190191
content = "\n\n# Build dependencies" + content
191192
}
192193
return content
193194
}
194195

196+
func (m *Maker) GetContextDependencies(execute string, dependsOn []string, deps DependenciesMap) DependenciesMap {
197+
for _, item := range dependsOn {
198+
if slices.Contains(m.Contexts, item) {
199+
// collect dependency on context (post build step)
200+
deps[item] = utils.AppendUniquely(deps[item], execute)
201+
} else {
202+
// check recursively further dependencies
203+
deps = m.GetContextDependencies(execute, m.GetDependsOn(item), deps)
204+
}
205+
}
206+
return deps
207+
}
208+
209+
func (m *Maker) GetDependsOn(execute string) (dependsOn []string) {
210+
for _, item := range m.CbuildIndex.BuildIdx.Executes {
211+
if item.Execute == execute {
212+
dependsOn = item.DependsOn
213+
break
214+
}
215+
}
216+
return dependsOn
217+
}
218+
219+
func (m *Maker) GetAllRunAlways(execute string) (elements []string) {
220+
for _, item := range m.CbuildIndex.BuildIdx.Executes {
221+
if item.Execute != execute && item.Always != nil {
222+
elements = utils.AppendUniquely(elements, item.Execute)
223+
}
224+
}
225+
return elements
226+
}
227+
195228
func CMakeTargetIncludeDirectories(name string, includes ScopeMap) string {
196229
if len(includes) == 0 {
197230
return ""

pkg/maker/buildcontent_test.go

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,8 +357,40 @@ func TestBuildContent(t *testing.T) {
357357
m.Vars.Contexts = []string{
358358
"project.debug+target",
359359
}
360+
m.CbuildIndex.BuildIdx.Executes = []maker.Executes{
361+
{
362+
Execute: "RunAlways",
363+
Always: make(map[string]interface{}),
364+
},
365+
{
366+
Execute: "PostBuild",
367+
DependsOn: []string{"project.debug+target"},
368+
},
369+
{
370+
Execute: "SecondLevel_PostBuild",
371+
DependsOn: []string{"PostBuild"},
372+
},
373+
}
360374
content := m.BuildDependencies()
361-
assert.Contains(content, "add_dependencies(project.debug+target-build\n dependentContext\n)")
375+
assert.Contains(content, `
376+
# Build dependencies
377+
add_dependencies(project.debug+target-build
378+
dependentContext
379+
RunAlways
380+
)
381+
add_dependencies(PostBuild
382+
project.debug+target-build
383+
RunAlways
384+
)
385+
add_dependencies(SecondLevel_PostBuild
386+
PostBuild
387+
RunAlways
388+
)
389+
add_dependencies(project.debug+target-executes
390+
PostBuild
391+
SecondLevel_PostBuild
392+
RunAlways
393+
)`)
362394
})
363395

364396
t.Run("test linker options", func(t *testing.T) {

test/data/solutions/executes/project/project.Debug+ARMCM0.cbuild.yml

Lines changed: 0 additions & 127 deletions
This file was deleted.

0 commit comments

Comments
 (0)