Skip to content

Add Arduino lib to arduino as IDF component #8115

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 8 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions docs/source/esp-idf_component.rst
Original file line number Diff line number Diff line change
Expand Up @@ -163,3 +163,88 @@ Compilation Errors
------------------

As commits are made to esp-idf and submodules, the codebases can develop incompatibilities that cause compilation errors. If you have problems compiling, follow the instructions in `Issue #1142 <https://github.com/espressif/arduino-esp32/issues/1142>`_ to roll esp-idf back to a different version.

Adding arduino library
----------------------

There are few approaches:

1. Add global library to ``components/arduino-esp32/libraries/new_library``
2. Add local project library to ``examples/your_project/main/libraries/new_library``

1 Adding global library
***********************

Download the library:

.. code-block:: bash

cd ~/esp/esp-idf/components/arduino-esp32/
git clone --recursive [email protected]:Author/new_library.git libraries/new_library


Edit file ``components/arduino-esp32/CMakeLists.txt``

Get the source file list with shell command:

.. code-block:: bash

find libraries/new_library/src/ -name '*.c' -o -name '*.cpp'
libraries/new_library/src/new_library.cpp
libraries/new_library/src/new_library_extra_file.c

Locate block which starts with ``set(LIBRARY_SRCS`` and copy the list there. Now it should look something like this:

.. code-block:: bash

set(LIBRARY_SRCS
libraries/ArduinoOTA/src/ArduinoOTA.cpp
libraries/AsyncUDP/src/AsyncUDP.cpp
libraries/new_library/src/new_library.cpp
libraries/new_library/src/new_library_extra_file.c


After this add the library path to block which starts with ``set(includedirs``. It should look like this:

.. code-block:: bash

set(includedirs
variants/${CONFIG_ARDUINO_VARIANT}/
cores/esp32/
libraries/ArduinoOTA/src
libraries/AsyncUDP/src
libraries/new_library/src


2 Adding local library
**********************

Download the library:

.. code-block:: bash

cd ~/esp/esp-idf/examples/your_project
mkdir components
git clone --recursive [email protected]:Author/new_library.git components/new_library

Create new CMakeists.txt in the library folder: ``components/new_library/CMakeLists.txt``

.. code-block:: bash

idf_component_register(SRCS "new_library.cpp" "another_source.c"
INCLUDE_DIRS "."
REQUIRES arduino-esp32
)

You can read more about CMakeLists in the IDF documentation regarding the `Build System <https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html>`_

Tip
---

If you want to use arduino-esp32 both as an ESP-IDF component and with Arduino IDE you can simply create a symlink:

.. code-block:: bash

ln -s ~/Arduino/hardware/espressif/esp32 ~/esp/esp-idf/components/arduino-esp32

This will allow you to install new libraries as usual with Arduino IDE. To use them with IDF component, use ``add_lib.sh -e ~/Arduino/libraries/New_lib``
144 changes: 144 additions & 0 deletions tools/add_lib.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
#!/bin/bash
HELP="This script help to add library when using arduino-esp32 as an ESP-IDF component
The script accepts up to three arguments:
-n NEW: URL address to new library on GIThub (cannot be combined with -e)
-l LOCAL: Path to the project where the library should be placed locally (must be paired with -e or -n)
-e EXISTING: path to existing libary- this will simply skip the download (cannot be combined with -n)

Examples:
./add_lib.sh -n https://github.com/me-no-dev/ESPAsyncWebServer
./add_lib.sh -l ~/esp/esp-idf/examples/your_project
./add_lib.sh -e ~/Arduino/libraries/existing_library

./add_lib.sh -n https://github.com/me-no-dev/ESPAsyncWebServer -l ~/esp/esp-idf/examples/your_project
./add_lib.sh -e ~/Arduino/libraries/existing_library -l ~/esp/esp-idf/examples/your_project"

# Get the directory name where this script is located
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

# Construct the absolute path to libraries folder
ARDUINO_LIBS_PATH="$SCRIPT_DIR/../libraries"

# Define the default values for the parameters
e_param=""
l_param=""
n_param=""
Comment on lines +23 to +25
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO the variable names should be more descriptive to help with code maintenance.


# Parse the command-line arguments using getopts
while getopts "he:l:n:" opt; do
case $opt in
h)
echo "$HELP"
exit 0
;;
e)
#e_param="$OPTARG"
e_param="${OPTARG/#~/$HOME}"
;;
l)
#l_param="$OPTARG"
l_param="${OPTARG/#~/$HOME}"
;;
n)
n_param=$OPTARG
;;
\?)
echo "Invalid option: -$OPTARG" >&2
echo $HELP
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
echo $HELP
exit 1
;;
esac
done

# No parameter check
if [[ -z "$e_param" ]] && [[ -z "$l_param" ]] && [[ -z "$n_param" ]]; then
echo "Error: No parameters" >&2
echo "$HELP"
exit 1
fi

# Only local path check (not permitted)
if [[ -z "$e_param" ]] && [[ ! -z "$l_param" ]] && [[ -z "$n_param" ]]; then
echo "Error: -l parameter must be paired with -e or -n" >&2
echo "$HELP"
exit 1
fi

# Invalid combination check
if [[ ! -z $e_param ]] && [[ ! -z $n_param ]]; then
echo "ERROR: Cannot combine -n with -e" >&2
echo "$HELP"
exit 1
fi

# Check existing lib
if [[ ! -z "$e_param" ]]; then
if [[ ! -d "${e_param/#~/$HOME}" ]]; then # this works!
echo "Error: existing library parameter - path does not exist" >&2
exit 1
fi
fi

LIBRARY=""

# Only existing library was supplied
if [[ ! -z $e_param ]] && [[ -z $l_param ]] && [[ -z $n_param ]]; then
LIBRARY=$e_param
fi

# Install new lib
if [ ! -z $n_param ]; then
INSTALL_TARGET=""
if [ -z $l_param ]; then
# If local path for project is not supplied - use as INSTALL_TARGET Arduino libraries path
INSTALL_TARGET=$ARDUINO_LIBS_PATH/$(basename "$n_param")
else
INSTALL_TARGET=$l_param/components/$(basename "$n_param")
if [ ! -d "$l_param/components" ]; then
echo "Folder components does not exist yet: mkdir -p "$l_param/components""
mkdir -p "$l_param/components"
fi
fi
# clone the new lib
echo "Cloning: git clone --recursive $n_param $INSTALL_TARGET"
git clone --recursive $n_param $INSTALL_TARGET
LIBRARY=$INSTALL_TARGET
fi

# Copy existing lib to local project
if [[ ! -z $e_param ]] && [[ ! -z $l_param ]]; then
if [ ! -d "$l_param/components" ]; then
echo "Folder components does not exist yet: mkdir -p "$l_param/components""
mkdir -p "$l_param/components"
fi
echo "Copy from $e_param to $l_param"
echo "cp -r $e_param $l_param/components/$(basename "$e_param")"
cp -r $e_param $l_param/components/$(basename "$e_param")
LIBRARY=$l_param/components/$(basename "$e_param")
fi


if [ -z "$LIBRARY" ]; then
echo "ERROR: No library path" >&2
exit 1
fi

# 1. get the source list:
FILES=$(find $LIBRARY -name '*.c' -o -name '*.cpp' | xargs -I{} basename {})

# Fresh start
if [ -f $LIBRARY/CMakeLists.txt ]; then
rm $LIBRARY/CMakeLists.txt
touch $LIBRARY/CMakeLists.txt
fi

# Generate CMakeLists.txt
echo "idf_component_register(SRCS $(echo $FILES | sed -e 's/ /" "/g' | sed -e 's/^/"/' -e 's/$/"/')" >> $LIBRARY/CMakeLists.txt
echo " INCLUDE_DIRS \".\"" >> $LIBRARY/CMakeLists.txt
echo " REQUIRES \"arduino-esp32\"" >> $LIBRARY/CMakeLists.txt
echo " )" >> $LIBRARY/CMakeLists.txt