Skip to content

Commit acfd5c7

Browse files
authored
[cbuild2cmake] Avoid run-always executes cyclic dependencies
1 parent 8af6042 commit acfd5c7

File tree

5 files changed

+74
-35
lines changed

5 files changed

+74
-35
lines changed

pkg/maker/buildcontent.go

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ func (m *Maker) AddStepSuffix(name string) string {
159159

160160
func (m *Maker) CMakeTargetAddDependencies(name string, dependencies []string) string {
161161
var content string
162-
dependencies = utils.AppendUniquely(dependencies, m.GetAllRunAlways(name)...)
162+
dependencies = utils.AppendUniquely(dependencies, m.GetIndependentRunAlways(name)...)
163163
if len(dependencies) > 0 {
164164
content += "\nadd_dependencies(" + m.AddStepSuffix(name)
165165
for _, dependency := range dependencies {
@@ -194,32 +194,35 @@ func (m *Maker) BuildDependencies() string {
194194
}
195195

196196
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)
197+
if m.GetExecute(execute).Always == nil {
198+
for _, item := range dependsOn {
199+
if slices.Contains(m.Contexts, item) {
200+
// collect dependency on context (post build step)
201+
deps[item] = utils.AppendUniquely(deps[item], execute)
202+
} else {
203+
// check recursively further dependencies
204+
deps = m.GetContextDependencies(execute, m.GetExecute(item).DependsOn, deps)
205+
}
204206
}
205207
}
206208
return deps
207209
}
208210

209-
func (m *Maker) GetDependsOn(execute string) (dependsOn []string) {
211+
func (m *Maker) GetExecute(execute string) Executes {
210212
for _, item := range m.CbuildIndex.BuildIdx.Executes {
211213
if item.Execute == execute {
212-
dependsOn = item.DependsOn
213-
break
214+
return item
214215
}
215216
}
216-
return dependsOn
217+
return Executes{}
217218
}
218219

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)
220+
func (m *Maker) GetIndependentRunAlways(execute string) (elements []string) {
221+
if m.GetExecute(execute).Always == nil {
222+
for _, item := range m.CbuildIndex.BuildIdx.Executes {
223+
if item.Always != nil && len(item.DependsOn) == 0 {
224+
elements = utils.AppendUniquely(elements, item.Execute)
225+
}
223226
}
224227
}
225228
return elements

pkg/maker/buildcontent_test.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -359,9 +359,20 @@ func TestBuildContent(t *testing.T) {
359359
}
360360
m.CbuildIndex.BuildIdx.Executes = []maker.Executes{
361361
{
362-
Execute: "RunAlways",
362+
Execute: "RunAlways1",
363363
Always: make(map[string]interface{}),
364364
},
365+
{
366+
Execute: "RunAlways2",
367+
Always: make(map[string]interface{}),
368+
},
369+
{
370+
// Test safety net to ensure cyclic dependencies are avoided
371+
// RunAlways 'executes' usually do not have input dependencies
372+
Execute: "RunAlways_Dependent",
373+
Always: make(map[string]interface{}),
374+
DependsOn: []string{"SecondLevel_PostBuild"},
375+
},
365376
{
366377
Execute: "PostBuild",
367378
DependsOn: []string{"project.debug+target"},
@@ -376,20 +387,27 @@ func TestBuildContent(t *testing.T) {
376387
# Build dependencies
377388
add_dependencies(project.debug+target-build
378389
dependentContext
379-
RunAlways
390+
RunAlways1
391+
RunAlways2
392+
)
393+
add_dependencies(RunAlways_Dependent
394+
SecondLevel_PostBuild
380395
)
381396
add_dependencies(PostBuild
382397
project.debug+target-build
383-
RunAlways
398+
RunAlways1
399+
RunAlways2
384400
)
385401
add_dependencies(SecondLevel_PostBuild
386402
PostBuild
387-
RunAlways
403+
RunAlways1
404+
RunAlways2
388405
)
389406
add_dependencies(project.debug+target-executes
390407
PostBuild
391408
SecondLevel_PostBuild
392-
RunAlways
409+
RunAlways1
410+
RunAlways2
393411
)`)
394412
})
395413

test/data/solutions/executes/ref/CMakeLists.txt

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,16 @@ add_custom_command(OUTPUT ${OUTPUT} DEPENDS ${INPUT}
123123
COMMENT Run_After_Archiving
124124
)
125125

126-
# Execute: Run_Always
127-
add_custom_target(Run_Always ALL
128-
COMMAND ${CMAKE_COMMAND} -E echo "Execute Run Always"
129-
COMMENT Run_Always
126+
# Execute: Run_Always1
127+
add_custom_target(Run_Always1 ALL
128+
COMMAND ${CMAKE_COMMAND} -E echo "Execute Run Always1"
129+
COMMENT Run_Always1
130+
)
131+
132+
# Execute: Run_Always2
133+
add_custom_target(Run_Always2 ALL
134+
COMMAND ${CMAKE_COMMAND} -E echo "Execute Run Always2"
135+
COMMENT Run_Always2
130136
)
131137

132138
# Execute: project.Release+ARMCM0-Sign_Artifact
@@ -147,27 +153,33 @@ add_custom_command(OUTPUT ${OUTPUT} DEPENDS ${INPUT}
147153
# Build dependencies
148154
add_dependencies(project.Release+ARMCM0-build
149155
Generate_Project_Sources
150-
Run_Always
156+
Run_Always1
157+
Run_Always2
151158
)
152159
add_dependencies(Archive_Artifacts
153160
project.Release+ARMCM0-build
154161
project.Release+ARMCM0-Sign_Artifact
155-
Run_Always
162+
Run_Always1
163+
Run_Always2
156164
)
157165
add_dependencies(Generate_Project_Sources
158-
Run_Always
166+
Run_Always1
167+
Run_Always2
159168
)
160169
add_dependencies(Run_After_Archiving
161170
Archive_Artifacts
162-
Run_Always
171+
Run_Always1
172+
Run_Always2
163173
)
164174
add_dependencies(project.Release+ARMCM0-Sign_Artifact
165175
project.Release+ARMCM0-build
166-
Run_Always
176+
Run_Always1
177+
Run_Always2
167178
)
168179
add_dependencies(project.Release+ARMCM0-executes
169180
Archive_Artifacts
170181
Run_After_Archiving
171182
project.Release+ARMCM0-Sign_Artifact
172-
Run_Always
183+
Run_Always1
184+
Run_Always2
173185
)

test/data/solutions/executes/solution.cbuild-idx.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,11 @@ build-idx:
4141
- artifacts.zip
4242
depends-on:
4343
- Archive_Artifacts
44-
- execute: Run_Always
45-
run: ${CMAKE_COMMAND} -E echo "Execute Run Always"
44+
- execute: Run_Always1
45+
run: ${CMAKE_COMMAND} -E echo "Execute Run Always1"
46+
always:
47+
- execute: Run_Always2
48+
run: ${CMAKE_COMMAND} -E echo "Execute Run Always2"
4649
always:
4750
- execute: project.Release+ARMCM0-Sign_Artifact
4851
run: ${CMAKE_COMMAND} -DINPUT=${INPUT} -DOUTPUT=${OUTPUT} -P ${INPUT_0}

test/data/solutions/executes/solution.csolution.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,11 @@ solution:
3737
- $elf()$.signed
3838
output:
3939
- $SolutionDir()$/artifacts.zip
40-
- execute: Run_Always
41-
run: ${CMAKE_COMMAND} -E echo "Execute Run Always"
40+
- execute: Run_Always1
41+
run: ${CMAKE_COMMAND} -E echo "Execute Run Always1"
42+
always:
43+
- execute: Run_Always2
44+
run: ${CMAKE_COMMAND} -E echo "Execute Run Always2"
4245
always:
4346
- execute: Run_After_Archiving
4447
run: ${CMAKE_COMMAND} -E echo "Archive has been updated"

0 commit comments

Comments
 (0)