examples: add import prebuilt example

This commit is contained in:
Renz Christian Bagaporo 2019-11-28 14:39:12 +08:00
parent 91b421c35f
commit 2ebaf53edc
11 changed files with 136 additions and 0 deletions

View file

@ -0,0 +1,6 @@
# The following lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(import_prebuilt)

View file

@ -0,0 +1,37 @@
# Import Prebuilt Library Example
This example illustrates how to import a prebuilt static library in the ESP-IDF build system.
## Example Flow
Users need to first build the project in the [prebuilt](prebuilt) subdirectory:
```
cd prebuilt
idf.py build
```
This builds a component named [prebuilt](prebuilt/components/prebuilt), which has private dependency on ESP-IDF components `spi_flash`, `log` and `app_update` (see [its CMakeLists.txt](prebuilt/components/prebuilt/CMakeLists.txt)). Once built, the archive file `libprebuilt.a`, along with the header file `prebuilt.h`, is automatically copied to the [`main` component](main) of this example project.
The [`main` component's CMakeLists.txt](main/CMakeLists.txt) demonstrates how to import `libprebuilt.a` and link it to `main` so that the definitions inside can be used.
It also demonstrates how to specify the same dependencies the original component had so as to properly resolve symbols used inside the prebuilt library.
Users can then return to this directory and build the main example:
```
cd ..
idf.py build
```
### Output
The example simply outputs the current running partition.
```
I (319) prebuilt: The running partition is 'factory'!
```
---
There is a discussion on importing prebuilt libraries in the programming guide under `API Guides` -> `Build System` -> `Using Prebuilt Libraries with Components`

View file

@ -0,0 +1,12 @@
idf_component_register(SRCS "main.c"
INCLUDE_DIRS ".")
# Import the library, specifying a target name and the library path.
# The private dependencies of the library is also specified.
add_prebuilt_library(prebuilt "libprebuilt.a"
PRIV_REQUIRES spi_flash app_update log)
# `main` calls a function from the library, so link it to `main`
target_link_libraries(${COMPONENT_LIB} PRIVATE prebuilt)

View file

@ -0,0 +1,17 @@
/* Import Prebuilt Library Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
// Include the prebuilt library's header file so as to be able
// to reference `prebuilt_func` here.
#include "prebuilt.h"
void app_main(void)
{
prebuilt_func();
}

View file

@ -0,0 +1,6 @@
# For users checking this example, ignore the following code. This is so that
# the prebuilt project is built automatically in ESP-IDF CI.
if("$ENV{CI}")
execute_process(COMMAND ${IDFTOOL} build
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/prebuilt)
endif()

View file

@ -0,0 +1,8 @@
cmake_minimum_required(VERSION 3.5)
# Since we're only interested in the prebuilt library, trim
# the build
set(COMPONENTS prebuilt main esptool_py)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(prebuilt C)

View file

@ -0,0 +1,10 @@
idf_component_register(SRCS prebuilt.c
INCLUDE_DIRS "."
PRIV_REQUIRES app_update spi_flash log)
# After build, copy the archive file and header file to parent example directory's main component
add_custom_command(TARGET ${COMPONENT_LIB}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${COMPONENT_LIB}> ${CMAKE_SOURCE_DIR}/../main
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/prebuilt.h ${CMAKE_SOURCE_DIR}/../main
COMMENT "Copying built archive file and header to parent example directory...")

View file

@ -0,0 +1,21 @@
/* Import Prebuilt Library Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include "esp_ota_ops.h"
#include "esp_partition.h"
#include "esp_log.h"
const char *TAG = "prebuilt";
void prebuilt_func(void)
{
const esp_partition_t* running_partition = esp_ota_get_running_partition();
ESP_LOGI(TAG, "The running partition is '%s'!", running_partition->label);
}

View file

@ -0,0 +1,11 @@
/* Import Prebuilt Library Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#pragma once
void prebuilt_func(void);

View file

@ -0,0 +1,2 @@
idf_component_register(SRCS "main.c"
INCLUDE_DIRS "")

View file

@ -0,0 +1,6 @@
#include <stdio.h>
void app_main(void)
{
printf("Hello World!\n");
}