41a4963515
NuttX Build fails when it compiles `examples/hello_nim` for RISC-V (32-bit and 64-bit). That's because the Nim Config Script `config.nims` couldn't identify the Nim Target Platform: `riscv32` or `riscv64`. This PR fixes `config.nims` so that Nim Compiler correctly derives the Nim Target Platform (`riscv32` or `riscv64`), by searching NuttX `.config` for `CONFIG_ARCH_FAMILY=rv32` or `rv64`. This logic is slightly different from the Nim Targets `arm` and `arm64`, which are currently derived from `CONFIG_ARCH=arm` and `arm64`. `config.nims` is explained in this article: https://lupyuen.github.io/articles/nim#inside-nim-on-nuttx
133 lines
3.9 KiB
Nim
133 lines
3.9 KiB
Nim
############################################################################
|
|
# apps/config.nims
|
|
#
|
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
|
# contributor license agreements. See the NOTICE file distributed with
|
|
# this work for additional information regarding copyright ownership. The
|
|
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance with the
|
|
# License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
#
|
|
############################################################################
|
|
|
|
import std/os
|
|
import std/strutils
|
|
|
|
switch "os", "nuttx"
|
|
switch "mm", "orc"
|
|
|
|
switch "arm.nuttx.gcc.exe", "arm-none-eabi-gcc"
|
|
switch "arm64.nuttx.gcc.exe", "aarch64-none-elf-gcc"
|
|
switch "riscv32.nuttx.gcc.exe", "riscv64-unknown-elf-gcc"
|
|
switch "riscv64.nuttx.gcc.exe", "riscv64-unknown-elf-gcc"
|
|
switch "amd64.nuttx.gcc.exe", "x86_64-linux-gnu-gcc"
|
|
|
|
switch "nimcache", ".nimcache"
|
|
switch "d", "useStdLib"
|
|
switch "d", "useMalloc"
|
|
switch "d", "nimAllocPagesViaMalloc"
|
|
switch "d", "noSignalHandler"
|
|
switch "threads", "off"
|
|
switch "noMain", "on"
|
|
switch "compileOnly", "on"
|
|
switch "noLinking", "on"
|
|
# TODO: need OpenSSL-mbedTLS wrapper library.
|
|
#switch "d", "ssl"
|
|
#swich "dynlibOverride", "ssl"
|
|
|
|
type
|
|
OptFlag = enum
|
|
oNone
|
|
oSize
|
|
DotConfig = object
|
|
arch: string
|
|
opt: OptFlag
|
|
debugSymbols: bool
|
|
ramSize: int
|
|
isSim: bool
|
|
|
|
proc killoBytes(bytes: int): int =
|
|
result = (bytes / 1024).int
|
|
|
|
proc read_config(cfg: string): DotConfig =
|
|
for line in cfg.readFile.splitLines:
|
|
if not line.startsWith("CONFIG_"):
|
|
continue
|
|
let keyval = line.replace("CONFIG_", "").split("=")
|
|
if keyval.len != 2:
|
|
continue
|
|
case keyval[0]
|
|
of "ARCH":
|
|
let arch = keyval[1].strip(chars = {'"'})
|
|
case arch
|
|
of "arm", "arm64":
|
|
result.arch = arch
|
|
of "sim":
|
|
if defined(amd64):
|
|
result.arch = "amd64"
|
|
elif defined(aarch64):
|
|
result.arch = "arm64"
|
|
result.isSim = true
|
|
of "ARCH_FAMILY":
|
|
let arch = keyval[1].strip(chars = {'"'})
|
|
case arch
|
|
of "rv32":
|
|
result.arch = "riscv32"
|
|
of "rv64":
|
|
result.arch = "riscv64"
|
|
of "DEBUG_NOOPT":
|
|
result.opt = oNone
|
|
of "DEBUG_FULLOPT":
|
|
result.opt = oSize
|
|
of "DEBUG_SYMBOLS":
|
|
result.debugSymbols = true
|
|
of "RAM_SIZE":
|
|
result.ramSize = keyval[1].parseInt
|
|
echo "* arch: " & result.arch
|
|
echo "* opt: " & $result.opt
|
|
echo "* debug: " & $result.debugSymbols
|
|
echo "* ramSize: " & $result.ramSize
|
|
|
|
func bool2onoff(b: bool): string =
|
|
result = if b: "on" else: "off"
|
|
|
|
proc setup_cfg(cfg: DotConfig) =
|
|
switch("cpu", cfg.arch)
|
|
if cfg.opt == oSize:
|
|
switch("define", "release")
|
|
switch("define", "danger")
|
|
switch("opt", "size")
|
|
if cfg.debugSymbols:
|
|
# use native debugger (gdb)
|
|
switch("debugger", "native")
|
|
let debug_onoff = cfg.debugSymbols.bool2onoff
|
|
switch("lineDir", debug_onoff)
|
|
switch("stackTrace", debug_onoff)
|
|
switch("lineTrace", debug_onoff)
|
|
if not cfg.isSim:
|
|
# Adjust the page size for Nim's GC allocator.
|
|
let ramKilloBytes = cfg.ramSize.killoBytes
|
|
if ramKilloBytes < 32:
|
|
switch("define", "nimPage256")
|
|
elif ramKilloBytes < 512:
|
|
switch("define", "nimPage512")
|
|
elif ramKilloBytes < 2048:
|
|
switch("define", "nimPage1k")
|
|
if ramKilloBytes < 512:
|
|
# Sets MemAlign to 4 bytes which reduces the memory alignment
|
|
# to better match some embedded devices.
|
|
switch("define", "nimMemAlignTiny")
|
|
|
|
|
|
let topdir = getEnv("TOPDIR")
|
|
let cfg = read_config(topdir & "/.config")
|
|
cfg.setup_cfg()
|