diff --git a/cmd/cbuild2cmake/commands/root_test.go b/cmd/cbuild2cmake/commands/root_test.go index 6c56382..eea9d54 100644 --- a/cmd/cbuild2cmake/commands/root_test.go +++ b/cmd/cbuild2cmake/commands/root_test.go @@ -199,6 +199,20 @@ set(OUTPUTS_1 assert.False(mismatch) }) + t.Run("test blanks", func(t *testing.T) { + cmd := commands.NewRootCmd() + testCaseRoot := testRoot + "/run/solutions/blanks" + cbuildIdxFile := testCaseRoot + "/solution.cbuild-idx.yml" + cmd.SetArgs([]string{cbuildIdxFile, "--debug"}) + err := cmd.Execute() + assert.Nil(err) + + // check golden references + err, mismatch := inittest.CompareFiles(testCaseRoot+"/ref", testCaseRoot+"/tmp") + assert.Nil(err) + assert.False(mismatch) + }) + t.Run("test linker preprocessing", func(t *testing.T) { cmd := commands.NewRootCmd() testCaseRoot := testRoot + "/run/solutions/linker-pre-processing" diff --git a/pkg/maker/contextlists.go b/pkg/maker/contextlists.go index 3792065..2391869 100644 --- a/pkg/maker/contextlists.go +++ b/pkg/maker/contextlists.go @@ -113,7 +113,7 @@ func (m *Maker) CreateContextCMakeLists(index int) error { # Roots include("../roots.cmake") -set(CONTEXT ` + cbuild.BuildDescType.Context + `) +set(CONTEXT ` + strings.ReplaceAll(cbuild.BuildDescType.Context, " ", "_") + `) set(TARGET ${CONTEXT}) set(OUT_DIR "` + outDir + `") set(CMAKE_EXPORT_COMPILE_COMMANDS ON)` + outputByProducts + linkerVars + ` diff --git a/pkg/maker/superlists.go b/pkg/maker/superlists.go index c55b627..a93e8fe 100644 --- a/pkg/maker/superlists.go +++ b/pkg/maker/superlists.go @@ -11,6 +11,7 @@ import ( "path/filepath" "regexp" "strconv" + "strings" "github.com/Open-CMSIS-Pack/cbuild2cmake/pkg/utils" log "github.com/sirupsen/logrus" @@ -23,7 +24,7 @@ func (m *Maker) CreateSuperCMakeLists() error { var contexts, dirs, contextOutputs string for i, cbuild := range m.Cbuilds { - contexts = contexts + " \"" + cbuild.BuildDescType.Context + "\"\n" + contexts = contexts + " \"" + strings.ReplaceAll(cbuild.BuildDescType.Context, " ", "_") + "\"\n" dirs = dirs + " \"${CMAKE_CURRENT_SOURCE_DIR}/" + cbuild.BuildDescType.Context + "\"\n" var contextOutputsName = "OUTPUTS_" + strconv.Itoa(i+1) @@ -61,7 +62,7 @@ func (m *Maker) CreateSuperCMakeLists() error { // Write content content := - `cmake_minimum_required(VERSION 3.22) + `cmake_minimum_required(VERSION 3.27) include(ExternalProject) project("` + csolution + `" NONE) diff --git a/test/data/solutions/blanks/project/main.c b/test/data/solutions/blanks/project/main.c new file mode 100644 index 0000000..2e169c3 --- /dev/null +++ b/test/data/solutions/blanks/project/main.c @@ -0,0 +1,6 @@ +#include "RTE_Components.h" +#include CMSIS_device_header + +int main(void) { + return 0; +} 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 new file mode 100644 index 0000000..4a9b233 --- /dev/null +++ b/test/data/solutions/blanks/project/project X.AC6 X+ARMCM0 X.cbuild.yml @@ -0,0 +1,120 @@ +build: + generated-by: csolution version 0.0.0 + solution: ../solution.csolution.yml + project: project X.cproject.yml + context: project X.AC6 X+ARMCM0 X + compiler: AC6 + device: ARMCM0 + device-pack: ARM::Cortex_DFP@1.1.0 + processor: + fpu: off + core: Cortex-M0 + packs: + - pack: ARM::CMSIS@6.1.0 + path: ${CMSIS_PACK_ROOT}/ARM/CMSIS/6.1.0 + - pack: ARM::Cortex_DFP@1.1.0 + path: ${CMSIS_PACK_ROOT}/ARM/Cortex_DFP/1.1.0 + misc: + ASM: + - -masm=auto + C: + - -std=gnu11 + - -Wno-macro-redefined + - -Wno-pragma-pack + - -Wno-parentheses-equality + - -Wno-license-management + CPP: + - -Wno-macro-redefined + - -Wno-pragma-pack + - -Wno-parentheses-equality + - -Wno-license-management + Link: + - --entry=Reset_Handler + - --map + - --info summarysizes + - --summary_stderr + - --diag_suppress=L6314W + define: + - ARMCM0 + - _RTE_ + define-asm: + - ARMCM0 + - _RTE_ + add-path: + - RTE/_AC6_X_ARMCM0_X + - ${CMSIS_PACK_ROOT}/ARM/CMSIS/6.1.0/CMSIS/Core/Include + - ${CMSIS_PACK_ROOT}/ARM/Cortex_DFP/1.1.0/Device/ARMCM0/Include + add-path-asm: + - RTE/_AC6_X_ARMCM0_X + - ${CMSIS_PACK_ROOT}/ARM/CMSIS/6.1.0/CMSIS/Core/Include + - ${CMSIS_PACK_ROOT}/ARM/Cortex_DFP/1.1.0/Device/ARMCM0/Include + output-dirs: + intdir: ../tmp + outdir: ../out/project X/ARMCM0 X/AC6 X + rtedir: RTE + output: + - type: elf + file: project X.axf + components: + - component: ARM::CMSIS:CORE@6.1.0 + condition: ARMv6_7_8-M Device + from-pack: ARM::CMSIS@6.1.0 + selected-by: ARM::CMSIS:CORE + files: + - file: ${CMSIS_PACK_ROOT}/ARM/CMSIS/6.1.0/CMSIS/Core/Include + category: include + version: 6.1.0 + - file: ${CMSIS_PACK_ROOT}/ARM/CMSIS/6.1.0/CMSIS/Core/Include/tz_context.h + category: header + version: 6.1.0 + - file: ${CMSIS_PACK_ROOT}/ARM/CMSIS/6.1.0/CMSIS/Core/Template/ARMv8-M/main_s.c + category: sourceC + attr: template + version: 1.1.1 + select: Secure mode 'main' module for ARMv8-M + - file: ${CMSIS_PACK_ROOT}/ARM/CMSIS/6.1.0/CMSIS/Core/Template/ARMv8-M/tz_context.c + category: sourceC + attr: template + version: 1.1.1 + select: RTOS Context Management (TrustZone for ARMv8-M) + - file: ${CMSIS_PACK_ROOT}/ARM/CMSIS/6.1.0/CMSIS/Documentation/html/Core/index.html + category: doc + version: 6.1.0 + - component: ARM::Device:Startup&C Startup@2.2.0 + condition: ARMCM0 CMSIS + from-pack: ARM::Cortex_DFP@1.1.0 + selected-by: ARM::Device:Startup&C Startup + files: + - file: ${CMSIS_PACK_ROOT}/ARM/Cortex_DFP/1.1.0/Device/ARMCM0/Include/ARMCM0.h + category: header + version: 2.2.0 + - file: RTE/Device/ARMCM0/ARMCM0_ac6.sct + category: linkerScript + attr: config + version: 1.0.0 + - file: RTE/Device/ARMCM0/startup_ARMCM0.c + category: sourceC + attr: config + version: 2.0.3 + - file: RTE/Device/ARMCM0/system_ARMCM0.c + category: sourceC + attr: config + version: 1.0.0 + linker: + script: RTE/Device/ARMCM0/ARMCM0_ac6.sct + groups: + - group: Source + files: + - file: main.c + category: sourceC + constructed-files: + - file: RTE/_AC6_X_ARMCM0_X/RTE_Components.h + category: header + licenses: + - license: Apache-2.0 + packs: + - pack: ARM::CMSIS@6.1.0 + - pack: ARM::Cortex_DFP@1.1.0 + components: + - component: ARM::CMSIS:CORE@6.1.0 + - component: ARM::Device:Startup&C Startup@2.2.0 diff --git a/test/data/solutions/blanks/project/project X.cproject.yml b/test/data/solutions/blanks/project/project X.cproject.yml new file mode 100644 index 0000000..0d21eac --- /dev/null +++ b/test/data/solutions/blanks/project/project X.cproject.yml @@ -0,0 +1,10 @@ +project: + + components: + - component: ARM::CMSIS:CORE + - component: ARM::Device:Startup&C Startup + + groups: + - group: Source + files: + - file: ./main.c diff --git a/test/data/solutions/blanks/ref/CMakeLists.txt b/test/data/solutions/blanks/ref/CMakeLists.txt new file mode 100644 index 0000000..8bb6c35 --- /dev/null +++ b/test/data/solutions/blanks/ref/CMakeLists.txt @@ -0,0 +1,66 @@ +cmake_minimum_required(VERSION 3.27) +include(ExternalProject) + +project("solution" NONE) + +# Roots +include("roots.cmake") + +# Context specific lists +set(CONTEXTS + "project_X.AC6_X+ARMCM0_X" +) +list(LENGTH CONTEXTS CONTEXTS_LENGTH) +math(EXPR CONTEXTS_LENGTH "${CONTEXTS_LENGTH}-1") + +set(DIRS + "${CMAKE_CURRENT_SOURCE_DIR}/project X.AC6 X+ARMCM0 X" +) + +set(OUTPUTS_1 + "${SOLUTION_ROOT}/out/project X/ARMCM0 X/AC6 X/project X.axf" +) + + +set(ARGS + "-DSOLUTION_ROOT=${SOLUTION_ROOT}" + "-DCMSIS_PACK_ROOT=${CMSIS_PACK_ROOT}" + "-DCMSIS_COMPILER_ROOT=${CMSIS_COMPILER_ROOT}" +) + +# Iterate over contexts +foreach(INDEX RANGE ${CONTEXTS_LENGTH}) + + math(EXPR N "${INDEX}+1") + list(GET CONTEXTS ${INDEX} CONTEXT) + list(GET DIRS ${INDEX} DIR) + + # Create external project, set configure and build steps + ExternalProject_Add(${CONTEXT} + PREFIX ${DIR} + SOURCE_DIR ${DIR} + BINARY_DIR ${N} + INSTALL_COMMAND "" + TEST_COMMAND "" + CONFIGURE_COMMAND ${CMAKE_COMMAND} -G Ninja -S -B ${ARGS} + BUILD_COMMAND ${CMAKE_COMMAND} -E echo "Building CMake target '${CONTEXT}'" + COMMAND ${CMAKE_COMMAND} --build --verbose + BUILD_ALWAYS TRUE + BUILD_BYPRODUCTS ${OUTPUTS_${N}} + USES_TERMINAL_BUILD ON + ) + ExternalProject_Add_StepTargets(${CONTEXT} build configure) + + # Debug + message(VERBOSE "Configure Context: ${CMAKE_COMMAND} -G Ninja -S ${DIR} -B ${N}") + + # Database generation step + ExternalProject_Add_Step(${CONTEXT} database + COMMAND ${CMAKE_COMMAND} --build --target database + EXCLUDE_FROM_MAIN TRUE + ALWAYS TRUE + DEPENDEES configure + ) + ExternalProject_Add_StepTargets(${CONTEXT} database) + +endforeach() 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 new file mode 100644 index 0000000..84ca667 --- /dev/null +++ b/test/data/solutions/blanks/ref/project X.AC6 X+ARMCM0 X/CMakeLists.txt @@ -0,0 +1,84 @@ +cmake_minimum_required(VERSION 3.27) + +# Roots +include("../roots.cmake") + +set(CONTEXT project_X.AC6_X+ARMCM0_X) +set(TARGET ${CONTEXT}) +set(OUT_DIR "${SOLUTION_ROOT}/out/project X/ARMCM0 X/AC6 X") +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +set(LD_SCRIPT "${SOLUTION_ROOT}/project/RTE/Device/ARMCM0/ARMCM0_ac6.sct") +set(LD_SCRIPT_PP ${LD_SCRIPT}) + +# Processor Options +set(CPU Cortex-M0) +set(FPU NO_FPU) + +# Toolchain config map +include("toolchain.cmake") + +# Setup project +project(${CONTEXT} LANGUAGES C) + +# Compilation database +add_custom_target(database + COMMAND ${CMAKE_COMMAND} -E make_directory "${OUT_DIR}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json" "${OUT_DIR}" +) +set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}) + +# Setup context +add_executable(${CONTEXT}) +set_target_properties(${CONTEXT} PROPERTIES PREFIX "" SUFFIX ".axf" OUTPUT_NAME "project X") +set_target_properties(${CONTEXT} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${OUT_DIR}) +add_library(${CONTEXT}_GLOBAL INTERFACE) + +# Includes +target_include_directories(${CONTEXT} PUBLIC + ${SOLUTION_ROOT}/project/RTE/_AC6_X_ARMCM0_X + ${CMSIS_PACK_ROOT}/ARM/CMSIS/6.1.0/CMSIS/Core/Include + ${CMSIS_PACK_ROOT}/ARM/Cortex_DFP/1.1.0/Device/ARMCM0/Include +) + +# Defines +target_compile_definitions(${CONTEXT} PUBLIC + $<$: + ARMCM0 + _RTE_ + > +) + +# Compile options +target_compile_options(${CONTEXT} PUBLIC + $<$: + "SHELL:${CC_CPU}" + "SHELL:${CC_FLAGS}" + "SHELL:-std=gnu11" + "SHELL:-Wno-macro-redefined" + "SHELL:-Wno-pragma-pack" + "SHELL:-Wno-parentheses-equality" + "SHELL:-Wno-license-management" + > +) + +# Add groups and components +include("groups.cmake") +include("components.cmake") + +target_link_libraries(${CONTEXT} PUBLIC + Group_Source + ARM_CMSIS_CORE_6_1_0 + ARM_Device_Startup_C_Startup_2_2_0 +) + +# Linker options +target_link_options(${CONTEXT} PUBLIC + "SHELL:${LD_CPU}" + "SHELL:${_LS}\"${LD_SCRIPT_PP}\"" + "SHELL:--entry=Reset_Handler" + "SHELL:--map" + "SHELL:--info summarysizes" + "SHELL:--summary_stderr" + "SHELL:--diag_suppress=L6314W" +) +set_target_properties(${CONTEXT} PROPERTIES LINK_DEPENDS ${LD_SCRIPT}) diff --git a/test/data/solutions/blanks/solution.cbuild-idx.yml b/test/data/solutions/blanks/solution.cbuild-idx.yml new file mode 100644 index 0000000..501a6a6 --- /dev/null +++ b/test/data/solutions/blanks/solution.cbuild-idx.yml @@ -0,0 +1,11 @@ +build-idx: + generated-by: csolution version 0.0.0 + cdefault: ${CMSIS_COMPILER_ROOT}/cdefault.yml + csolution: solution.csolution.yml + tmpdir: tmp + cprojects: + - cproject: project/project X.cproject.yml + cbuilds: + - cbuild: project/project X.AC6 X+ARMCM0 X.cbuild.yml + project: project X + configuration: .AC6 X+ARMCM0 X diff --git a/test/data/solutions/blanks/solution.csolution.yml b/test/data/solutions/blanks/solution.csolution.yml new file mode 100644 index 0000000..2b4688f --- /dev/null +++ b/test/data/solutions/blanks/solution.csolution.yml @@ -0,0 +1,18 @@ +solution: + created-for: CMSIS-Toolbox@2.6.0 + cdefault: + + packs: + - pack: ARM::Cortex_DFP + - pack: ARM::CMSIS + + target-types: + - type: ARMCM0 X + device: ARMCM0 + + build-types: + - type: AC6 X + compiler: AC6 + + projects: + - project: ./project/project X.cproject.yml