2016-10-22 02:20:57 +03:00
|
|
|
# Copyright 2014-present PlatformIO <contact@platformio.org>
|
|
|
|
|
#
|
|
|
|
|
# Licensed 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.
|
|
|
|
|
|
2017-04-28 11:51:04 +03:00
|
|
|
import re
|
2018-05-07 23:40:34 +03:00
|
|
|
import sys
|
|
|
|
|
from os.path import isfile, join
|
2016-10-24 20:23:25 +03:00
|
|
|
|
2018-01-03 18:23:00 +02:00
|
|
|
from SCons.Script import (COMMAND_LINE_TARGETS, AlwaysBuild, Builder, Default,
|
|
|
|
|
DefaultEnvironment)
|
2016-10-24 20:23:25 +03:00
|
|
|
|
2018-05-26 01:13:54 +03:00
|
|
|
#
|
|
|
|
|
# Helpers
|
|
|
|
|
#
|
|
|
|
|
|
2018-05-31 21:11:12 +03:00
|
|
|
|
2016-10-24 20:23:25 +03:00
|
|
|
def _get_board_f_flash(env):
|
|
|
|
|
frequency = env.subst("$BOARD_F_FLASH")
|
|
|
|
|
frequency = str(frequency).replace("L", "")
|
|
|
|
|
return str(int(int(frequency) / 1000000)) + "m"
|
|
|
|
|
|
|
|
|
|
|
2018-05-11 02:16:58 +03:00
|
|
|
def _get_board_flash_mode(env):
|
|
|
|
|
mode = env.subst("$BOARD_FLASH_MODE")
|
|
|
|
|
if mode == "qio":
|
|
|
|
|
return "dio"
|
|
|
|
|
elif mode == "qout":
|
|
|
|
|
return "dout"
|
|
|
|
|
return mode
|
|
|
|
|
|
2018-05-26 01:13:54 +03:00
|
|
|
|
|
|
|
|
def _parse_size(value):
|
2018-05-31 21:11:12 +03:00
|
|
|
if isinstance(value, int):
|
|
|
|
|
return value
|
|
|
|
|
elif value.isdigit():
|
2018-05-26 01:13:54 +03:00
|
|
|
return int(value)
|
|
|
|
|
elif value.startswith("0x"):
|
|
|
|
|
return int(value, 16)
|
|
|
|
|
elif value[-1] in ("K", "M"):
|
|
|
|
|
base = 1024 if value[-1] == "K" else 1024 * 1024
|
|
|
|
|
return int(value[:-1]) * base
|
|
|
|
|
return value
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _parse_partitions(env):
|
|
|
|
|
partitions_csv = env.subst("$PARTITIONS_TABLE_CSV")
|
|
|
|
|
if not isfile(partitions_csv):
|
|
|
|
|
sys.stderr.write("Could not find the file %s with partitions "
|
|
|
|
|
"table.\n" % partitions_csv)
|
|
|
|
|
env.Exit(1)
|
2018-05-30 00:25:12 +03:00
|
|
|
return
|
2018-05-26 01:13:54 +03:00
|
|
|
|
|
|
|
|
result = []
|
2018-05-31 21:11:12 +03:00
|
|
|
next_offset = 0
|
2018-05-26 01:13:54 +03:00
|
|
|
with open(partitions_csv) as fp:
|
|
|
|
|
for line in fp.readlines():
|
|
|
|
|
line = line.strip()
|
|
|
|
|
if not line or line.startswith("#"):
|
|
|
|
|
continue
|
2018-05-31 21:11:12 +03:00
|
|
|
tokens = [t.strip() for t in line.split(",")]
|
2018-05-26 01:13:54 +03:00
|
|
|
if len(tokens) < 5:
|
|
|
|
|
continue
|
2018-05-31 21:11:12 +03:00
|
|
|
partition = {
|
2018-05-26 01:13:54 +03:00
|
|
|
"name": tokens[0],
|
|
|
|
|
"type": tokens[1],
|
|
|
|
|
"subtype": tokens[2],
|
2018-05-31 21:11:12 +03:00
|
|
|
"offset": tokens[3] or next_offset,
|
2018-05-26 01:13:54 +03:00
|
|
|
"size": tokens[4],
|
|
|
|
|
"flags": tokens[5] if len(tokens) > 5 else None
|
2018-05-31 21:11:12 +03:00
|
|
|
}
|
|
|
|
|
result.append(partition)
|
|
|
|
|
next_offset = (_parse_size(partition['offset']) +
|
|
|
|
|
_parse_size(partition['size']))
|
2018-05-26 01:13:54 +03:00
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _update_max_upload_size(env):
|
|
|
|
|
if not env.get("PARTITIONS_TABLE_CSV"):
|
|
|
|
|
return
|
|
|
|
|
sizes = [
|
|
|
|
|
_parse_size(p['size']) for p in _parse_partitions(env)
|
|
|
|
|
if p['type'] in ("0", "app")
|
|
|
|
|
]
|
|
|
|
|
if sizes:
|
|
|
|
|
env.BoardConfig().update("upload.maximum_size", max(sizes))
|
|
|
|
|
|
|
|
|
|
|
2018-05-11 02:16:58 +03:00
|
|
|
#
|
|
|
|
|
# SPIFFS helpers
|
|
|
|
|
#
|
|
|
|
|
|
2018-05-31 21:11:12 +03:00
|
|
|
|
2018-05-11 02:16:58 +03:00
|
|
|
def fetch_spiffs_size(env):
|
2018-05-26 01:13:54 +03:00
|
|
|
spiffs = None
|
|
|
|
|
for p in _parse_partitions(env):
|
|
|
|
|
if p['type'] == "data" and p['subtype'] == "spiffs":
|
|
|
|
|
spiffs = p
|
|
|
|
|
if not spiffs:
|
|
|
|
|
sys.stderr.write(
|
|
|
|
|
env.subst("Could not find the `spiffs` section in the partitions "
|
|
|
|
|
"table $PARTITIONS_TABLE_CSV\n"))
|
2018-05-30 00:25:12 +03:00
|
|
|
env.Exit(1)
|
|
|
|
|
return
|
2018-05-26 01:13:54 +03:00
|
|
|
env["SPIFFS_START"] = _parse_size(spiffs['offset'])
|
|
|
|
|
env["SPIFFS_SIZE"] = _parse_size(spiffs['size'])
|
|
|
|
|
env["SPIFFS_PAGE"] = int("0x100", 16)
|
|
|
|
|
env["SPIFFS_BLOCK"] = int("0x1000", 16)
|
2018-05-11 02:16:58 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def __fetch_spiffs_size(target, source, env):
|
|
|
|
|
fetch_spiffs_size(env)
|
|
|
|
|
return (target, source)
|
|
|
|
|
|
|
|
|
|
|
2016-10-24 20:23:25 +03:00
|
|
|
env = DefaultEnvironment()
|
|
|
|
|
platform = env.PioPlatform()
|
|
|
|
|
|
|
|
|
|
env.Replace(
|
|
|
|
|
__get_board_f_flash=_get_board_f_flash,
|
2018-05-11 02:16:58 +03:00
|
|
|
__get_board_flash_mode=_get_board_flash_mode,
|
2018-06-02 15:58:00 +03:00
|
|
|
|
2016-10-24 20:23:25 +03:00
|
|
|
AR="xtensa-esp32-elf-ar",
|
|
|
|
|
AS="xtensa-esp32-elf-as",
|
|
|
|
|
CC="xtensa-esp32-elf-gcc",
|
|
|
|
|
CXX="xtensa-esp32-elf-g++",
|
2017-08-17 22:11:48 +03:00
|
|
|
GDB="xtensa-esp32-elf-gdb",
|
2016-10-29 19:31:23 +03:00
|
|
|
OBJCOPY=join(
|
|
|
|
|
platform.get_package_dir("tool-esptoolpy") or "", "esptool.py"),
|
2016-10-24 20:23:25 +03:00
|
|
|
RANLIB="xtensa-esp32-elf-ranlib",
|
|
|
|
|
SIZETOOL="xtensa-esp32-elf-size",
|
2018-06-02 15:58:00 +03:00
|
|
|
|
2017-08-22 16:01:28 +03:00
|
|
|
ARFLAGS=["rc"],
|
2016-10-24 20:23:25 +03:00
|
|
|
ASFLAGS=["-x", "assembler-with-cpp"],
|
2017-02-20 21:59:41 +02:00
|
|
|
CFLAGS=["-std=gnu99"],
|
2016-10-24 20:23:25 +03:00
|
|
|
CCFLAGS=[
|
2018-05-31 21:11:12 +03:00
|
|
|
"-Os", "-Wall", "-nostdlib", "-Wpointer-arith",
|
|
|
|
|
"-Wno-error=unused-but-set-variable", "-Wno-error=unused-variable",
|
|
|
|
|
"-mlongcalls", "-ffunction-sections", "-fdata-sections",
|
2017-01-27 01:29:43 +02:00
|
|
|
"-fstrict-volatile-bitfields"
|
2016-10-24 20:23:25 +03:00
|
|
|
],
|
2018-05-31 21:11:12 +03:00
|
|
|
CXXFLAGS=["-fno-rtti", "-fno-exceptions", "-std=gnu++11"],
|
2016-10-24 20:23:25 +03:00
|
|
|
CPPDEFINES=[
|
2018-05-31 21:11:12 +03:00
|
|
|
"ESP32", "ESP_PLATFORM", ("F_CPU", "$BOARD_F_CPU"), "HAVE_CONFIG_H",
|
2017-02-20 21:59:41 +02:00
|
|
|
("MBEDTLS_CONFIG_FILE", '\\"mbedtls/esp_config.h\\"')
|
2016-10-24 20:23:25 +03:00
|
|
|
],
|
|
|
|
|
LINKFLAGS=[
|
2018-05-31 21:11:12 +03:00
|
|
|
"-nostdlib", "-Wl,-static", "-u", "call_user_start_cpu0",
|
|
|
|
|
"-Wl,--undefined=uxTopUsedPriority", "-Wl,--gc-sections"
|
2016-10-24 20:23:25 +03:00
|
|
|
],
|
2018-06-02 15:58:00 +03:00
|
|
|
|
|
|
|
|
SIZEPROGREGEXP=r"^(?:\.iram0\.text|\.dram0\.text|\.flash\.text|\.dram0\.data|\.flash\.rodata|)\s+(\d+).*",
|
|
|
|
|
SIZEDATAREGEXP=r"^(?:\.dram0\.data|\.dram0\.bss)\s+(\d+).*",
|
|
|
|
|
SIZECHECKCMD="$SIZETOOL -A -d $SOURCES",
|
|
|
|
|
SIZEPRINTCMD="$SIZETOOL -B -d $SOURCES",
|
|
|
|
|
|
2018-05-07 23:40:34 +03:00
|
|
|
MKSPIFFSTOOL="mkspiffs_${PIOPLATFORM}_${PIOFRAMEWORK}",
|
2018-06-02 15:58:00 +03:00
|
|
|
PROGSUFFIX=".elf"
|
|
|
|
|
)
|
2016-10-24 20:23:25 +03:00
|
|
|
|
2018-01-03 18:23:00 +02:00
|
|
|
# Allow user to override via pre:script
|
|
|
|
|
if env.get("PROGNAME", "program") == "program":
|
|
|
|
|
env.Replace(PROGNAME="firmware")
|
|
|
|
|
|
2016-10-24 20:23:25 +03:00
|
|
|
env.Append(
|
2018-05-11 02:16:58 +03:00
|
|
|
# Clone actual CCFLAGS to ASFLAGS
|
|
|
|
|
ASFLAGS=env.get("CCFLAGS", [])[:],
|
2016-10-24 20:23:25 +03:00
|
|
|
BUILDERS=dict(
|
|
|
|
|
ElfToBin=Builder(
|
|
|
|
|
action=env.VerboseAction(" ".join([
|
2018-05-31 21:11:12 +03:00
|
|
|
'"$PYTHONEXE" "$OBJCOPY"', "--chip", "esp32", "elf2image",
|
|
|
|
|
"--flash_mode", "$BOARD_FLASH_MODE", "--flash_freq",
|
|
|
|
|
"${__get_board_f_flash(__env__)}", "--flash_size",
|
|
|
|
|
env.BoardConfig().get("upload.flash_size",
|
|
|
|
|
"detect"), "-o", "$TARGET", "$SOURCES"
|
2016-10-24 20:23:25 +03:00
|
|
|
]), "Building $TARGET"),
|
2018-05-31 21:11:12 +03:00
|
|
|
suffix=".bin"),
|
2018-05-11 02:16:58 +03:00
|
|
|
DataToBin=Builder(
|
|
|
|
|
action=env.VerboseAction(" ".join([
|
2018-05-31 21:11:12 +03:00
|
|
|
'"$MKSPIFFSTOOL"', "-c", "$SOURCES", "-p", "$SPIFFS_PAGE",
|
|
|
|
|
"-b", "$SPIFFS_BLOCK", "-s", "$SPIFFS_SIZE", "$TARGET"
|
2018-05-11 02:16:58 +03:00
|
|
|
]), "Building SPIFFS image from '$SOURCES' directory to $TARGET"),
|
|
|
|
|
emitter=__fetch_spiffs_size,
|
|
|
|
|
source_factory=env.Dir,
|
2018-05-31 21:11:12 +03:00
|
|
|
suffix=".bin")))
|
2017-04-28 11:51:04 +03:00
|
|
|
|
2016-10-24 20:23:25 +03:00
|
|
|
#
|
|
|
|
|
# Target: Build executable and linkable firmware or SPIFFS image
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
target_elf = env.BuildProgram()
|
2018-01-03 18:23:00 +02:00
|
|
|
if "nobuild" in COMMAND_LINE_TARGETS:
|
2018-05-07 23:40:34 +03:00
|
|
|
if set(["uploadfs", "uploadfsota"]) & set(COMMAND_LINE_TARGETS):
|
|
|
|
|
fetch_spiffs_size(env)
|
|
|
|
|
target_firm = join("$BUILD_DIR", "spiffs.bin")
|
|
|
|
|
else:
|
|
|
|
|
target_firm = join("$BUILD_DIR", "${PROGNAME}.bin")
|
2018-01-03 18:23:00 +02:00
|
|
|
else:
|
2018-05-07 23:40:34 +03:00
|
|
|
if set(["buildfs", "uploadfs", "uploadfsota"]) & set(COMMAND_LINE_TARGETS):
|
|
|
|
|
target_firm = env.DataToBin(
|
|
|
|
|
join("$BUILD_DIR", "spiffs"), "$PROJECTDATA_DIR")
|
|
|
|
|
AlwaysBuild(target_firm)
|
|
|
|
|
AlwaysBuild(env.Alias("buildfs", target_firm))
|
|
|
|
|
else:
|
2018-05-11 02:16:58 +03:00
|
|
|
target_firm = env.ElfToBin(
|
|
|
|
|
join("$BUILD_DIR", "${PROGNAME}"), target_elf)
|
2016-10-24 20:23:25 +03:00
|
|
|
|
2018-01-03 18:23:00 +02:00
|
|
|
AlwaysBuild(env.Alias("nobuild", target_firm))
|
2016-11-13 21:42:12 +02:00
|
|
|
target_buildprog = env.Alias("buildprog", target_firm, target_firm)
|
2016-10-24 20:23:25 +03:00
|
|
|
|
2018-05-26 01:13:54 +03:00
|
|
|
# update max upload size based on CSV file
|
2018-06-04 14:10:58 +03:00
|
|
|
if env.get("PIOMAINPROG"):
|
|
|
|
|
env.AddPreAction(
|
|
|
|
|
"checkprogsize",
|
|
|
|
|
env.VerboseAction(
|
|
|
|
|
lambda source, target, env: _update_max_upload_size(env),
|
|
|
|
|
"Retrieving maximum program size $SOURCES"))
|
|
|
|
|
# remove after PIO Core 3.6 release
|
|
|
|
|
elif set(["checkprogsize", "upload"]) & set(COMMAND_LINE_TARGETS):
|
2018-05-26 01:13:54 +03:00
|
|
|
_update_max_upload_size(env)
|
|
|
|
|
|
2018-05-07 23:40:34 +03:00
|
|
|
#
|
2018-05-11 02:16:58 +03:00
|
|
|
# Target: Print binary size
|
2018-05-07 23:40:34 +03:00
|
|
|
#
|
|
|
|
|
|
2018-05-31 21:11:12 +03:00
|
|
|
target_size = env.Alias("size", target_elf,
|
|
|
|
|
env.VerboseAction("$SIZEPRINTCMD",
|
|
|
|
|
"Calculating size $SOURCE"))
|
2018-05-11 02:16:58 +03:00
|
|
|
AlwaysBuild(target_size)
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Target: Upload firmware or SPIFFS image
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
upload_protocol = env.subst("$UPLOAD_PROTOCOL")
|
|
|
|
|
debug_tools = env.BoardConfig().get("debug.tools", {})
|
|
|
|
|
upload_actions = []
|
|
|
|
|
|
|
|
|
|
if upload_protocol == "esptool":
|
2018-05-07 23:40:34 +03:00
|
|
|
env.Replace(
|
2018-05-11 02:16:58 +03:00
|
|
|
UPLOADER=join(
|
|
|
|
|
platform.get_package_dir("tool-esptoolpy") or "", "esptool.py"),
|
2018-05-31 21:11:12 +03:00
|
|
|
UPLOADEROTA=join(
|
|
|
|
|
platform.get_package_dir("tool-espotapy") or "", "espota.py"),
|
2018-05-07 23:40:34 +03:00
|
|
|
UPLOADERFLAGS=[
|
2018-05-31 21:11:12 +03:00
|
|
|
"--chip", "esp32", "--port", '"$UPLOAD_PORT"', "--baud",
|
|
|
|
|
"$UPLOAD_SPEED", "--before", "default_reset", "--after",
|
|
|
|
|
"hard_reset", "write_flash", "-z", "--flash_mode",
|
|
|
|
|
"${__get_board_flash_mode(__env__)}", "--flash_freq",
|
|
|
|
|
"${__get_board_f_flash(__env__)}", "--flash_size", "detect"
|
2018-05-11 02:16:58 +03:00
|
|
|
],
|
|
|
|
|
UPLOADEROTAFLAGS=[
|
2018-05-31 21:11:12 +03:00
|
|
|
"--debug", "--progress", "-i", "$UPLOAD_PORT", "-p", "3232",
|
2018-05-11 02:16:58 +03:00
|
|
|
"$UPLOAD_FLAGS"
|
|
|
|
|
],
|
2018-05-15 17:35:22 -07:00
|
|
|
UPLOADCMD='"$PYTHONEXE" "$UPLOADER" $UPLOADERFLAGS 0x10000 $SOURCE',
|
2018-05-11 02:16:58 +03:00
|
|
|
UPLOADOTACMD='"$PYTHONEXE" "$UPLOADEROTA" $UPLOADEROTAFLAGS -f $SOURCE',
|
2018-05-07 23:40:34 +03:00
|
|
|
)
|
2018-05-15 17:35:22 -07:00
|
|
|
for image in env.get("FLASH_EXTRA_IMAGES", []):
|
2018-05-24 23:38:54 +03:00
|
|
|
env.Append(UPLOADERFLAGS=[image[0], "%s" % image[1]])
|
2018-05-07 23:40:34 +03:00
|
|
|
|
2018-05-11 02:16:58 +03:00
|
|
|
if env.subst("$PIOFRAMEWORK") == "arduino":
|
|
|
|
|
# Handle uploading via OTA
|
|
|
|
|
ota_port = None
|
|
|
|
|
if env.get("UPLOAD_PORT"):
|
|
|
|
|
ota_port = re.match(
|
|
|
|
|
r"\"?((([0-9]{1,3}\.){3}[0-9]{1,3})|.+\.local)\"?$",
|
|
|
|
|
env.get("UPLOAD_PORT"))
|
|
|
|
|
if ota_port:
|
|
|
|
|
env.Replace(UPLOADCMD="$UPLOADOTACMD")
|
|
|
|
|
|
|
|
|
|
if "uploadfs" in COMMAND_LINE_TARGETS:
|
|
|
|
|
env.Replace(
|
|
|
|
|
UPLOADERFLAGS=[
|
2018-05-31 21:11:12 +03:00
|
|
|
"--chip", "esp32", "--port", '"$UPLOAD_PORT"', "--baud",
|
|
|
|
|
"$UPLOAD_SPEED", "--before", "default_reset", "--after",
|
|
|
|
|
"hard_reset", "write_flash", "-z", "--flash_mode",
|
|
|
|
|
"$BOARD_FLASH_MODE", "--flash_size", "detect", "$SPIFFS_START"
|
2018-05-21 22:08:26 +03:00
|
|
|
],
|
|
|
|
|
UPLOADCMD='"$PYTHONEXE" "$UPLOADER" $UPLOADERFLAGS $SOURCE',
|
2018-05-11 02:16:58 +03:00
|
|
|
)
|
|
|
|
|
env.Append(UPLOADEROTAFLAGS=["-s"])
|
|
|
|
|
|
|
|
|
|
upload_actions = [
|
2018-05-31 21:11:12 +03:00
|
|
|
env.VerboseAction(env.AutodetectUploadPort,
|
|
|
|
|
"Looking for upload port..."),
|
2018-05-11 02:16:58 +03:00
|
|
|
env.VerboseAction("$UPLOADCMD", "Uploading $SOURCE")
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
elif upload_protocol in debug_tools:
|
|
|
|
|
openocd_dir = platform.get_package_dir("tool-openocd-esp32") or ""
|
|
|
|
|
uploader_flags = ["-s", openocd_dir]
|
2018-05-31 21:11:12 +03:00
|
|
|
uploader_flags.extend(
|
|
|
|
|
debug_tools.get(upload_protocol).get("server").get("arguments", []))
|
|
|
|
|
uploader_flags.extend(["-c", 'program_esp32 "{{$SOURCE}}" 0x10000 verify'])
|
2018-05-11 03:07:32 +03:00
|
|
|
for image in env.get("FLASH_EXTRA_IMAGES", []):
|
2018-05-31 21:11:12 +03:00
|
|
|
uploader_flags.extend(
|
|
|
|
|
["-c", 'program_esp32 "%s" %s verify' % (image[1], image[0])])
|
2018-05-11 03:07:32 +03:00
|
|
|
uploader_flags.extend(["-c", "reset run; shutdown"])
|
2018-05-11 02:16:58 +03:00
|
|
|
for i, item in enumerate(uploader_flags):
|
|
|
|
|
if "$PACKAGE_DIR" in item:
|
2018-05-11 03:07:32 +03:00
|
|
|
uploader_flags[i] = item.replace("$PACKAGE_DIR", openocd_dir)
|
2016-10-24 20:23:25 +03:00
|
|
|
|
2018-05-11 02:16:58 +03:00
|
|
|
env.Replace(
|
|
|
|
|
UPLOADER="openocd",
|
|
|
|
|
UPLOADERFLAGS=uploader_flags,
|
|
|
|
|
UPLOADCMD="$UPLOADER $UPLOADERFLAGS")
|
|
|
|
|
upload_actions = [env.VerboseAction("$UPLOADCMD", "Uploading $SOURCE")]
|
2016-10-24 20:23:25 +03:00
|
|
|
|
2018-05-11 02:16:58 +03:00
|
|
|
# custom upload tool
|
|
|
|
|
elif "UPLOADCMD" in env:
|
|
|
|
|
upload_actions = [env.VerboseAction("$UPLOADCMD", "Uploading $SOURCE")]
|
2016-10-24 20:23:25 +03:00
|
|
|
|
2018-05-11 02:16:58 +03:00
|
|
|
else:
|
|
|
|
|
sys.stderr.write("Warning! Unknown upload protocol %s\n" % upload_protocol)
|
2016-10-24 20:23:25 +03:00
|
|
|
|
2018-05-11 02:16:58 +03:00
|
|
|
AlwaysBuild(env.Alias(["upload", "uploadfs"], target_firm, upload_actions))
|
2016-10-24 20:23:25 +03:00
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# Default targets
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
Default([target_buildprog, target_size])
|