############################################################################ # 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") const key = "TOPDIR" let topdir = if existsEnv(key): getEnv(key) else: thisDir() & "/../nuttx" let cfg = read_config(topdir & "/.config") cfg.setup_cfg()