I’m trying to build project files using ARMCC compiler, which is officially not supported by PlatformIO. I have managed to replace existing GCC compiler/assembler/linker flags and compile project files. The only problem I currently face is not being able to provide a correct build path where my output ˙.ofiles would be stored and where linker would be looking at when generating
.elf` file.
As you can see from the picture, files are compiled and output files are (presumably) generated in the marked folder however as you can see those folders end up empty after each build. Therefore linker is unable to find the during linking process.
I have a hunch that this path is hard-coded somewhere in internal PlatformIO files and might not be easy to overwrite it like I did for the compiler flags. Therefore I ask whether anyone has any clue how this should/could be done?
APPENDIX:
This script was modifed from the one provided by @maxgerhardt: GitHub - maxgerhardt/platformio-with-clang: Highly experimental PlatformIO + Clang (instead of GCC) test project
Here, compiler/assembler/linker flags are completely removed (and other flags that might not be compatible with ARMCC) and some flags are re-written to accommodate basic build needs.
import os
Import("env")
Import("projenv")
platform = env.PioPlatform()
# Use ARMCC for framework
for e in [env, projenv]:
e.Replace(
AR="armar",
AS="armasm",
CC="armcc",
CXX="armcc",
LD="armlink",
GDB="arm-none-eabi-gdb", # to retain compatbility
OBJCOPY="fromelf",
SIZE="armsize"
)
e.Replace(CCFLAGS = [])
e.Replace(ASFLAGS = [])
e.Replace(LINKFLAGS = [])
e.Replace(CPPFLAGS = [])
e.Replace(CFLAGS = [])
e.Replace(CXXFLAGS = [])
e.Replace(LDFLAGS = [])
e.Replace(LIBS = [])
e.Replace(LIBDIR = [])
e.Replace(LDLIBS = [])
e.Replace(LFLAGS = [])
e.Replace(MAKEFLAGS = [])
e.Replace(_LIBFLAGS = [])
e.Replace(CCFLAGS = [
"--c99", "-c", "--cpu=Cortex-M3", "-g", "-O0", "-M", "--thumb",
"--apcs=interwork", "--split_sections", "-DUSE_HAL_DRIVER", "-DSTM32F103xE", "-DUSER_VECT_TAB_ADDRESS",
"-o C:\\Users\\gacnik\\Desktop\\PVC2-SES-PlatformIO\\PVC2 test\\.pio\\build\\genericSTM32F103VC\\src\\Drivers\\STM32F1xx_HAL_Driver\\Src"
])
e.Replace(ASFLAGS = [
"--cpu=Cortex-M3", "-g", "--apcs=interwork", "-M"
])
e.Replace(LINKFLAGS = [
"--cpu=Cortex-M3",
"-o C:\\Users\\gacnik\\Desktop\\PVC2-SES-PlatformIO\\PVC2 test\\.pio\\build\\genericSTM32F103VC\\src\\Drivers\\STM32F1xx_HAL_Driver\\Src"
])
# Add to path.. somehow PlatformIO does not do this although it's the toolchain package.
pkg = platform.get_package("toolchain-armcc")
e.PrependENVPath(
"PATH",
os.path.join(pkg.path, "bin")
if os.path.isdir(os.path.join(pkg.path, "bin"))
else pkg.path,
)
# Throw out GCC completely
del platform.packages["toolchain-gccarmnoneeabi"]
My platformio.ini
file look like this. I provide path to actual ARM toolchain, which is used to create toolchain-armcc
package. Also, a custom linker (generated from CubeMX) and startup (copied from Keil uVision) file are used for this project.
# add compiler package
[env:genericSTM32F103VC]
platform = ststm32
board = genericSTM32F103VC
extra_scripts = SetCompilerPath.py
platform_packages = toolchain-armcc@symlink://C:\Keil_v5\ARM\ARMCC\bin
board_build.ldscript = "src\STM32F103VCTx_FLASH.ld"
build_flags =
-Isrc/Core/Inc
-Isrc/Drivers/STM32F1xx_HAL_Driver/Inc
-Isrc/Drivers/CMSIS/Device/ST/STM32F1xx/Include
-Isrc/Drivers/CMSIS/Include
-Isrc/Drivers/STM32F1xx_HAL_Driver/
In original ARM toolchain folder there is also a package.json
file which is basically a slightly modified version of the one from toolchain-gccarmnoneeabi
package.