Невозможно выполнить кросс-компиляцию для ARM с Scons, потому что добавлен / Fo - PullRequest
0 голосов
/ 25 апреля 2019

Я использую Scons 3.0.0 для кросс-компиляции для ARM с arm-none-eabi-gcc в Windows с установленным VC ++. И scons добавляют / Fo в качестве опции компиляции, например так:

arm-none-eabi-gcc /Fobuild\main.o /c source\main.c ...

Вот содержимое командной строки:

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
arm-none-eabi-gcc /Fobuild\main.o /c source\main.c -DBOARD_PCA10040 -DBSP_UART_SUPPORT -DCONFIG_GPIO_AS_PINRESET -DFLOAT_ABI_HARD -DNRF52 -DNRF52832_XXAA -DNRF52_PAN_74 -DSWI_DISABLE0 -mcpu=cortex-m4 -mthumb -mabi=aapcs -Wall -Werror -mfloat-abi=hard -mfpu=fpv4-sp-d16 -O3 -g3
arm-none-eabi-gcc: error: /Fobuild\main.o: No such file or directory
arm-none-eabi-gcc: error: /c: No such file or directory
scons: *** [build\main.o] Error 1
scons: building terminated because of errors.

Прочитав руководство пользователя https://scons.org/doc/production/HTML/scons-user.html и попробовав, как описано в этом посте Используя scons для компиляции кода C ++ под Windows, scons добавляет "/ Fo" в качестве опции компиляции проблема сохраняется.

Вот код моего скриптового скрипта

import os

cross_compiler = "arm-none-eabi-"

#don't use the default environment
env = Environment(ENV = os.environ)
# env = Environment(**env_options)

env.Replace(AR = cross_compiler + 'ar')
env.Replace(AS = cross_compiler + 'as')
env.Replace(CC    = cross_compiler + "gcc")
env.Replace(CXX   = cross_compiler + "g++")
env.Replace(LD    = cross_compiler + "g++")
env.Replace(LINK  = cross_compiler + 'gcc')
env.Replace(STRIP = cross_compiler + "strip")
env.Replace(RANLIB = cross_compiler + 'ranlib')
env.Replace(OBJCOPY = cross_compiler + 'objcopy')

env.Replace(PROGSUFFIX = ".out")
env.Replace(OBJSUFFIX  = ".o")

env.Replace(TARGET_ARCH = "arm")

env.Replace(LINKFLAGS = [])

env.Replace(TOOLS = [])
# env.Replace(TOOLS = [cross_compiler + 'gcc'])
env.Append(ENV = {'PATH' : os.environ['PATH']})

# Optimization flags
opt_flags = ['-O3', '-g3']
# Uncomment the line below to enable link time optimization
#opt_flags.append('-flto')

# C flags common to all targets
c_flags = [
            '-DBOARD_PCA10040',
            '-DBSP_UART_SUPPORT',
            '-DCONFIG_GPIO_AS_PINRESET',
            '-DFLOAT_ABI_HARD',
            '-DNRF52',
            '-DNRF52832_XXAA',
            '-DNRF52_PAN_74',
            '-DSWI_DISABLE0',
            '-mcpu=cortex-m4',
            '-mthumb',
            '-mabi=aapcs',
            '-Wall',
            '-Werror',
            '-mfloat-abi=hard',
            '-mfpu=fpv4-sp-d16'
           ]

c_flags += opt_flags

env.Replace(CCFLAGS = c_flags)

libs_paths = []

objs = []

libs = []

src_dir = 'source'
build_dir = 'build'

#Set specifics c files
c_files_list=[
                'main'
                ]

obj_extension='.o'


with open('env_dump.txt', 'w') as file:
    env_dumped = env.Dump()
    for key in env_dumped:
        file.write(key)

#Add specifics c and objs
for elt in c_files_list:
   object = build_dir + os.sep + elt + obj_extension
   env.Object(target = object, source = src_dir + os.sep + elt +'.c')
   objs.append(object)

env.Program('Test', objs, LIBS = libs, LIBPATH = libs_paths)

У кого-нибудь есть идея?

Спасибо за вашу помощь

1 Ответ

1 голос
/ 25 апреля 2019

Вы позволили SCons загружать свои инструменты по умолчанию в Environment ().

Сначала будет пробоваться MSVC .. таким образом, флаг, который вам не нужен.

См. Ниже.Я только явно загружаю инструменты, которые, я думаю, вам нужны.

Также немного упростил код и заставил DefaultEnvironment не загружать инструменты.Это должно немного ускорить время запуска, поскольку он не будет пытаться найти и настроить MSVC, который может быть немного медленным.

Попробуйте это:

import os
cross_compiler = "arm-none-eabi-"

#don't use the default environment
DefaultEnvironment(tools=[])

# Only specify the tools we're using
env = Environment(ENV = os.environ, tools=['gcc','g++','gnulink','ar'])

# overwrite tool names with our cross compiler tools
for (tool, name) in [
    ('AR','ar'),
    ('AS','as'),
    ('CC','gcc'),
    ('CXX','g++'),
    ('LD','g++'),
    ('LINK','gcc'),
    ('STRIP','strip'),
    ('RANLIB','ranlib'),
    ('OBJCOPY','objcopy')
]:
    env[tool] = cross_compiler + name

env['PROGSUFFIX']  = ".out"
env['OBJSUFFIX']   = ".o"

env['TARGET_ARCH'] = "arm"

env['LINKFLAGS'] = []

env.Append(ENV = {'PATH' : os.environ['PATH']})

# Optimization flags
opt_flags = ['-O3', '-g3']
# Uncomment the line below to enable link time optimization
#opt_flags.append('-flto')

# C flags common to all targets
c_flags = [
            '-DBOARD_PCA10040',
            '-DBSP_UART_SUPPORT',
            '-DCONFIG_GPIO_AS_PINRESET',
            '-DFLOAT_ABI_HARD',
            '-DNRF52',
            '-DNRF52832_XXAA',
            '-DNRF52_PAN_74',
            '-DSWI_DISABLE0',
            '-mcpu=cortex-m4',
            '-mthumb',
            '-mabi=aapcs',
            '-Wall',
            '-Werror',
            '-mfloat-abi=hard',
            '-mfpu=fpv4-sp-d16'
           ]

c_flags += opt_flags

env['CCFLAGS'] = c_flags

libs_paths = []

objs = []

libs = []

src_dir = 'source'
build_dir = 'build'

#Set specifics c files
c_files_list=[
                'main'
                ]

obj_extension='.o'


with open('env_dump.txt', 'w') as file:
    env_dumped = env.Dump()
    for key in env_dumped:
        file.write(key)

#Add specifics c and objs
for elt in c_files_list:
   object = build_dir + os.sep + elt + obj_extension
   env.Object(target = object, source = src_dir + os.sep + elt +'.c')
   objs.append(object)

env.Program('Test', objs, LIBS = libs, LIBPATH = libs_paths)
...