]> granicus.if.org Git - esp-idf/commitdiff
cmake: Fix "make flash" & "ninja flash" targets
authorAngus Gratton <angus@espressif.com>
Thu, 13 Sep 2018 04:13:20 +0000 (14:13 +1000)
committerAngus Gratton <gus@projectgus.com>
Thu, 13 Sep 2018 05:08:24 +0000 (15:08 +1000)
As reported on forum.

Requires a small CMake wrapper script to pick
up environment variables at flashing time.

components/esptool_py/project_include.cmake
components/esptool_py/run_esptool.cmake [new file with mode: 0644]
docs/en/api-guides/build-system-cmake.rst

index 31ce13d662399a685ed0fa0cadaa7f2343766ad6..e39b09485631a8563e1b473f3e64984efa0e7933 100644 (file)
@@ -43,9 +43,14 @@ add_custom_target(app ALL DEPENDS "${PROJECT_NAME}.bin")
 #
 function(esptool_py_custom_target target_name flasher_filename dependencies)
     add_custom_target(${target_name} DEPENDS ${dependencies}
-        COMMAND ${ESPTOOLPY} -p ${CONFIG_ESPTOOLPY_PORT} -b ${CONFIG_ESPTOOLPY_BAUD}
-        write_flash @flash_${flasher_filename}_args
-        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+        COMMAND ${CMAKE_COMMAND}
+        -D IDF_PATH="${IDF_PATH}"
+        -D ESPTOOLPY="${ESPTOOLPY}"
+        -D ESPTOOL_ARGS="write_flash;@flash_${flasher_filename}_args"
+        -D ESPTOOL_WORKING_DIR="${CMAKE_CURRENT_BINARY_DIR}"
+        -P run_esptool.cmake
+        WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
+        USES_TERMINAL
         )
 endfunction()
 
diff --git a/components/esptool_py/run_esptool.cmake b/components/esptool_py/run_esptool.cmake
new file mode 100644 (file)
index 0000000..db4cf20
--- /dev/null
@@ -0,0 +1,45 @@
+# A CMake script to run esptool commands from within ninja or make
+# or another cmake-based build runner
+#
+# (Needed to expand environment variables, for backwards compatibility.)
+#
+# It is recommended to NOT USE this CMake script if you have the option of
+# running esptool.py directly. This script exists only for use inside CMake builds.
+#
+cmake_minimum_required(VERSION 3.5)
+
+if(NOT IDF_PATH OR NOT ESPTOOLPY OR NOT ESPTOOL_ARGS OR NOT ESPTOOL_WORKING_DIR)
+    message(FATAL_ERROR "IDF_PATH, ESPTOOLPY, ESPTOOL_ARGS, and ESPTOOL_WORKING_DIR must "
+        "be specified on the CMake command line. For direct esptool execution, it is "
+        "strongly recommended to run esptool.py directly.")
+endif()
+
+# Note: we can't expand these environment variables in the main IDF CMake build,
+# because we want to expand them at flashing time not at CMake runtime (so they can change
+# without needing a CMake re-run)
+if(NOT ENV{ESPPORT})
+    message("Note: esptool.py will search for a serial port. To specify a port, set the ESPPORT environment variable.")
+else()
+    set(port_arg "-p $ENV{ESPPORT}")
+endif()
+
+set(ESPBAUD $ENV{ESPBAUD})
+if(NOT ESPBAUD)
+    message("Note: Using default baud rate 460800. To modify, set ESPBAUD environment variable.")
+    set(ESPBAUD 460800)
+endif()
+
+include("${IDF_PATH}/tools/cmake/utilities.cmake")
+
+set(cmd "${ESPTOOLPY} ${port_arg} -b ${ESPBAUD} ${ESPTOOL_ARGS}")
+spaces2list(cmd)
+
+execute_process(COMMAND ${cmd}
+    WORKING_DIRECTORY "${ESPTOOL_WORKING_DIR}"
+    RESULT_VARIABLE result
+    )
+
+if(${result})
+    # No way to have CMake silently fail, unfortunately
+    message(FATAL_ERROR "esptool.py failed")
+endif()
index dfa679c2f8366b427340058eca2e637daa8c1c7e..f0416089b24bf25a4f8147d2ec02aeed260e9544 100644 (file)
@@ -120,6 +120,34 @@ If using CMake with ``ninja`` or ``make``, there are also targets for more of th
 .. note::
    If you're already familiar with CMake_, you may find the ESP-IDF CMake-based build system unusual because it wraps a lot of CMake's functionality to reduce boilerplate. See `writing pure CMake components`_ for some information about writing more "CMake style" components.
 
+.. _flash-with-ninja-or-make:
+
+Flashing with ninja or make
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+It's possible to build and flash directly from ninja or make by running a target like::
+
+  ninja flash
+
+Or::
+
+  make app-flash
+
+Available targets are: ``flash``, ``app-flash`` (app only), ``bootloader-flash`` (bootloader only).
+
+When flashing this way, optionally set the ``ESPPORT`` and ``ESPBAUD`` environment variables to specify the serial port and baud rate. You can set environment variables in your operating system or IDE project. Alternatively, set them directly on the command line::
+
+  ESPPORT=/dev/ttyUSB0 ninja flash
+
+.. note:: Providing environment variables at the start of the command like this is Bash shell Syntax. It will work on Linux and macOS. It won't work when using Windows Command Prompt, but it will work when using Bash-like shells on Windows.
+
+Or::
+
+  make -j3 app-flash ESPPORT=COM4 ESPBAUD=2000000
+
+.. note:: Providing variables at the end of the command line is ``make`` syntax, and works for ``make`` on all platforms.
+
+
 Using CMake in an IDE
 ---------------------
 
@@ -918,6 +946,11 @@ No Longer Necessary
 
 It is no longer necessary to set ``COMPONENT_SRCDIRS`` if setting ``COMPONENT_SRCS`` (in fact, in the CMake-based system ``COMPONENT_SRCS`` is ignored if ``COMPONENT_SRCDIRS`` is set).
 
+Flashing from make
+------------------
+
+``make flash`` and similar targets still work to build and flash. However, project ``sdkconfig`` no longer specifies serial port and baud rate. Environment variables can be used to override these. See :ref:`flash-with-ninja-or-make` for more details.
+
 .. _esp-idf-template: https://github.com/espressif/esp-idf-template
 .. _cmake: https://cmake.org
 .. _ninja: https://ninja-build.org