mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
examples: update idf_as_lib example to use new api
This commit is contained in:
parent
c564d1730f
commit
477fa49fc0
@ -55,8 +55,8 @@ else()
|
|||||||
"src/idf/secure_boot_signatures.c")
|
"src/idf/secure_boot_signatures.c")
|
||||||
set(COMPONENT_ADD_INCLUDEDIRS "include")
|
set(COMPONENT_ADD_INCLUDEDIRS "include")
|
||||||
set(COMPONENT_PRIV_INCLUDEDIRS "include_bootloader")
|
set(COMPONENT_PRIV_INCLUDEDIRS "include_bootloader")
|
||||||
set(COMPONENT_REQUIRES soc) #unfortunately the header directly uses SOC registers
|
set(COMPONENT_REQUIRES mbedtls soc) #unfortunately the header directly uses SOC registers
|
||||||
set(COMPONENT_PRIV_REQUIRES spi_flash mbedtls efuse)
|
set(COMPONENT_PRIV_REQUIRES spi_flash efuse)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
register_component()
|
register_component()
|
@ -34,13 +34,13 @@ else()
|
|||||||
"task_wdt.c")
|
"task_wdt.c")
|
||||||
set(COMPONENT_ADD_INCLUDEDIRS "include")
|
set(COMPONENT_ADD_INCLUDEDIRS "include")
|
||||||
|
|
||||||
set(COMPONENT_REQUIRES driver esp_event efuse soc) #unfortunately rom/uart uses SOC registers directly
|
set(COMPONENT_REQUIRES app_update driver esp_event efuse pthread soc) #unfortunately rom/uart uses SOC registers directly
|
||||||
|
|
||||||
# driver is a public requirement because esp_sleep.h uses gpio_num_t & touch_pad_t
|
# driver is a public requirement because esp_sleep.h uses gpio_num_t & touch_pad_t
|
||||||
# app_update is added here because cpu_start.c uses esp_ota_get_app_description() function.
|
# app_update is added here because cpu_start.c uses esp_ota_get_app_description() function.
|
||||||
set(COMPONENT_PRIV_REQUIRES
|
set(COMPONENT_PRIV_REQUIRES
|
||||||
app_trace app_update bootloader_support log mbedtls nvs_flash
|
app_trace app_update bootloader_support log mbedtls nvs_flash
|
||||||
pthread smartconfig_ack spi_flash vfs wpa_supplicant espcoredump esp_common esp_wifi)
|
smartconfig_ack spi_flash vfs wpa_supplicant espcoredump esp_common esp_wifi)
|
||||||
|
|
||||||
set(COMPONENT_ADD_LDFRAGMENTS linker.lf ld/esp32_fragments.lf)
|
set(COMPONENT_ADD_LDFRAGMENTS linker.lf ld/esp32_fragments.lf)
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
register_config_only_component()
|
set(COMPONENT_PRIV_REQUIRES bootloader)
|
||||||
|
register_component()
|
||||||
|
|
||||||
string(REPLACE ";" " " ESPTOOLPY_FLASH_PROJECT_OPTIONS "${ESPTOOLPY_ELF2IMAGE_FLASH_OPTIONS}")
|
string(REPLACE ";" " " ESPTOOLPY_FLASH_PROJECT_OPTIONS "${ESPTOOLPY_ELF2IMAGE_FLASH_OPTIONS}")
|
||||||
set(ESPTOOLPY_FLASH_PROJECT_OPTIONS
|
set(ESPTOOLPY_FLASH_PROJECT_OPTIONS
|
||||||
|
@ -9,7 +9,8 @@ else()
|
|||||||
"flash_ops.c"
|
"flash_ops.c"
|
||||||
"partition.c"
|
"partition.c"
|
||||||
"spi_flash_rom_patch.c")
|
"spi_flash_rom_patch.c")
|
||||||
set(COMPONENT_PRIV_REQUIRES bootloader_support app_update soc)
|
set(COMPONENT_REQUIRES app_update)
|
||||||
|
set(COMPONENT_PRIV_REQUIRES bootloader_support soc)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(COMPONENT_ADD_INCLUDEDIRS include)
|
set(COMPONENT_ADD_INCLUDEDIRS include)
|
||||||
|
@ -1,24 +1,38 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
project(idf_as_lib C)
|
project(idf_as_lib C)
|
||||||
|
|
||||||
# The source file main.c contains app_main() definition
|
if("${TARGET}" STREQUAL "esp32")
|
||||||
add_executable(${CMAKE_PROJECT_NAME}.elf main.c)
|
# Include for ESP-IDF build system functions
|
||||||
|
include($ENV{IDF_PATH}/tools/cmake/idf.cmake)
|
||||||
|
# Create idf::esp32 and idf::freertos static libraries
|
||||||
|
idf_build_process(esp32
|
||||||
|
# try and trim the build; additional components
|
||||||
|
# will be included as needed based on dependency tree
|
||||||
|
#
|
||||||
|
# although esptool_py does not generate static library,
|
||||||
|
# processing the component is needed for flashing related
|
||||||
|
# targets and file generation
|
||||||
|
COMPONENTS esp32 freertos esptool_py
|
||||||
|
SDKCONFIG ${CMAKE_BINARY_DIR}/sdkconfig
|
||||||
|
BUILD_DIR ${CMAKE_BINARY_DIR})
|
||||||
|
else()
|
||||||
|
# Create stubs for esp32 and freertos, stub::esp32 and stub::freertos
|
||||||
|
add_subdirectory(stubs/esp32)
|
||||||
|
add_subdirectory(stubs/freertos)
|
||||||
|
add_subdirectory(stubs/spi_flash)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Provides idf_import_components() and idf_link_components()
|
set(elf_file ${CMAKE_PROJECT_NAME}.elf)
|
||||||
include($ENV{IDF_PATH}/tools/cmake/idf_functions.cmake)
|
add_executable(${elf_file} main.c)
|
||||||
|
|
||||||
# Create artifacts used for flashing the project to target chip
|
# Link the static libraries to the executable
|
||||||
set(IDF_BUILD_ARTIFACTS ON)
|
if("${TARGET}" STREQUAL "esp32")
|
||||||
set(IDF_PROJECT_EXECUTABLE ${CMAKE_PROJECT_NAME}.elf)
|
target_link_libraries(${elf_file} idf::esp32 idf::freertos idf::spi_flash)
|
||||||
set(IDF_BUILD_ARTIFACTS_DIR ${CMAKE_BINARY_DIR})
|
# Attach additional targets to the executable file for flashing,
|
||||||
|
# linker script generation, partition_table generation, etc.
|
||||||
|
idf_build_executable(${elf_file})
|
||||||
|
else()
|
||||||
|
target_link_libraries(${elf_file} stub::esp32 stub::freertos stub::spi_flash)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Trim down components included in the build. Although freertos and spi_flash are the ones needed by the application
|
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
|
||||||
# itself, the bootloader and esptool_py components are also needed in order to create the artifacts to be used
|
|
||||||
# for flashing to the target chip
|
|
||||||
set(IDF_COMPONENTS freertos spi_flash bootloader esptool_py)
|
|
||||||
|
|
||||||
# Wraps add_subdirectory() to create library targets for components, and then return them using the specified variable
|
|
||||||
idf_import_components(components $ENV{IDF_PATH} esp-idf)
|
|
||||||
|
|
||||||
# Wraps target_link_libraries() to link processed components by idf_import_components to target
|
|
||||||
idf_link_components(${CMAKE_PROJECT_NAME}.elf "${components}")
|
|
@ -1,13 +1,17 @@
|
|||||||
# Using ESP-IDF in Custom CMake Projects
|
# Using ESP-IDF in Custom CMake Projects
|
||||||
|
|
||||||
This example illustrates using ESP-IDF components as libraries in custom CMake projects. This builds
|
This example illustrates using ESP-IDF components as libraries in custom CMake projects. The application
|
||||||
an equivalent application to the `hello_world` example under `examples/get-started/hello_world`.
|
in this example can run on either host or on an ESP32, and the appropriate libraries are linked
|
||||||
|
to the executable depending on which target is specified. If the target is an ESP32, the libraries
|
||||||
|
created from ESP-IDF components are linked. On the other hand, stub libraries are linked if example
|
||||||
|
is meant to be run on the host to simulate the same application behavior.
|
||||||
|
|
||||||
|
The application in this example is equivalent to the `hello_world` example under `examples/get-started/hello_world`.
|
||||||
|
|
||||||
## Example Flow
|
## Example Flow
|
||||||
|
|
||||||
Users looking at this example should focus on the [top-level CMakeLists.txt file](./CMakeLists.txt). This builds an
|
Users looking at this example should focus on the [top-level CMakeLists.txt file](./CMakeLists.txt). This builds an
|
||||||
application that can run on targets without relying on the typical ESP-IDF application template. The application itself
|
application that can run on the target without relying on the typical ESP-IDF application template.
|
||||||
follows a similar code flow to the aforementioned `hello_world` example.
|
|
||||||
|
|
||||||
### Output
|
### Output
|
||||||
|
|
||||||
@ -29,41 +33,38 @@ Restarting in 0 seconds...
|
|||||||
|
|
||||||
## Building this Example
|
## Building this Example
|
||||||
|
|
||||||
To build this example, run the following commands from this directory:
|
To build this example, the user can either run [build-esp32.sh](./build-esp32.sh) to build for the ESP32
|
||||||
|
or run [build.sh](./build.sh) to build for the host:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Create a build directory, and change location to that directory.
|
# Builds the example for ESP32
|
||||||
mkdir build; cd build
|
./build-esp32.sh
|
||||||
# Invoke CMake, specifying the top-level CMakeLists.txt directory and toolchain file to use. This will generate
|
|
||||||
# the build system files.
|
|
||||||
cmake .. -DCMAKE_TOOLCHAIN_FILE=$IDF_PATH/tools/cmake/toolchain-esp32.cmake -DIDF_TARGET=esp32
|
|
||||||
# Build using the generated build system files.
|
|
||||||
cmake --build .
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Or, execute `build.sh` script, which contains the same commands mentioned above.
|
or
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Builds the example to run on host
|
||||||
|
./build.sh
|
||||||
|
```
|
||||||
|
|
||||||
## Flashing and Running this Example
|
## Flashing and Running this Example
|
||||||
|
|
||||||
To flash this example, we will have to invoke `esptool.py` and `idf_monitor.py` manually. While still in the build directory:
|
To flash and run the example, users can run either [run-esp32.sh](./run-esp32.sh) or [run.sh](./run.sh) depending
|
||||||
|
on what the example was built for. In the case of ``run-esp32.sh``, the port needs to be specified:
|
||||||
### Flashing to target
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Write project binaries to flash.
|
# Run the example on device connected to /dev/ttyUSB1
|
||||||
esptool.py --port /dev/ttyUSB0 write_flash @flash_project_args
|
./run-esp32.sh /dev/ttyUSB1
|
||||||
```
|
```
|
||||||
|
|
||||||
### Running on target
|
or
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Monitor the output of the flashed firmware.
|
# Run the example on the host
|
||||||
idf_monitor.py --port /dev/ttyUSB0 idf_as_lib.elf
|
./run.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Of course, you should replace the specified ports in the commands specified above to the proper one where your device
|
|
||||||
is connected.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
There is a discussion on using ESP-IDF in custom CMake projects in the programming guide under `API Guides` -> `Build System (CMake)` -> `Using ESP-IDF in Custom CMake Projects`
|
There is a discussion on using ESP-IDF in custom CMake projects in the programming guide under `API Guides` -> `Build System (CMake)` -> `Using ESP-IDF in Custom CMake Projects`
|
||||||
|
4
examples/build_system/cmake/idf_as_lib/build-esp32.sh
Executable file
4
examples/build_system/cmake/idf_as_lib/build-esp32.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
rm -rf build && mkdir build && cd build
|
||||||
|
cmake .. -DCMAKE_TOOLCHAIN_FILE=$IDF_PATH/tools/cmake/toolchain-esp32.cmake -DTARGET=esp32 -GNinja
|
||||||
|
cmake --build .
|
@ -1,8 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
rm -rf build && mkdir build && cd build
|
||||||
# Build this example, which does not use that standard IDF app template. See README.md for
|
cmake ..
|
||||||
# more information about the build and how to run this example on the target once built.
|
|
||||||
|
|
||||||
mkdir build; cd build
|
|
||||||
cmake .. -DCMAKE_TOOLCHAIN_FILE=$IDF_PATH/tools/cmake/toolchain-esp32.cmake -DIDF_TARGET=esp32
|
|
||||||
cmake --build .
|
cmake --build .
|
4
examples/build_system/cmake/idf_as_lib/run-esp32.sh
Executable file
4
examples/build_system/cmake/idf_as_lib/run-esp32.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
cd build
|
||||||
|
python $IDF_PATH/components/esptool_py/esptool/esptool.py -p $1 write_flash @flash_project_args
|
||||||
|
python $IDF_PATH/tools/idf_monitor.py -p $1 idf_as_lib.elf
|
3
examples/build_system/cmake/idf_as_lib/run.sh
Executable file
3
examples/build_system/cmake/idf_as_lib/run.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
cd build
|
||||||
|
./idf_as_lib.elf
|
@ -0,0 +1,6 @@
|
|||||||
|
add_library(stub_esp32 STATIC system_api.c flash_ops.c cpu_start.c)
|
||||||
|
target_include_directories(stub_esp32 PUBLIC .)
|
||||||
|
add_library(stub::esp32 ALIAS stub_esp32)
|
||||||
|
|
||||||
|
target_link_libraries(stub_esp32 "-u app_main")
|
||||||
|
target_link_libraries(stub_esp32 stub::spi_flash)
|
@ -0,0 +1,11 @@
|
|||||||
|
#include <stdbool.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
|
extern void app_main();
|
||||||
|
jmp_buf buf;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
setjmp(buf);
|
||||||
|
app_main();
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define CHIP_FEATURE_EMB_FLASH (1UL << 0)
|
||||||
|
#define CHIP_FEATURE_BT (1UL << 4)
|
||||||
|
#define CHIP_FEATURE_BLE (1UL << 5)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t features; //!< bit mask of CHIP_FEATURE_x feature flags
|
||||||
|
uint8_t cores; //!< number of CPU cores
|
||||||
|
uint8_t revision; //!< chip revision number
|
||||||
|
} esp_chip_info_t;
|
||||||
|
|
||||||
|
void esp_restart(void);
|
||||||
|
void esp_chip_info(esp_chip_info_t* out_info);
|
@ -0,0 +1,6 @@
|
|||||||
|
#include "esp_spi_flash.h"
|
||||||
|
|
||||||
|
int spi_flash_get_chip_size()
|
||||||
|
{
|
||||||
|
return (1024 * 1024 * 1024);
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include "esp_system.h"
|
||||||
|
|
||||||
|
extern jmp_buf buf;
|
||||||
|
|
||||||
|
void esp_restart(void)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
sleep(1); // pause for dramatic effect
|
||||||
|
longjmp(buf, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void esp_chip_info(esp_chip_info_t* out_info)
|
||||||
|
{
|
||||||
|
out_info->cores = 8;
|
||||||
|
out_info->features = (uint32_t) -1;
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
add_library(stub_freertos STATIC task.c)
|
||||||
|
target_include_directories(stub_freertos PUBLIC .)
|
||||||
|
add_library(stub::freertos ALIAS stub_freertos)
|
@ -0,0 +1,7 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define portTICK_PERIOD_MS 1000
|
||||||
|
|
||||||
|
void vTaskDelay( const uint32_t xTicksToDelay );
|
@ -0,0 +1,7 @@
|
|||||||
|
#include <unistd.h>
|
||||||
|
#include "freertos/task.h"
|
||||||
|
|
||||||
|
void vTaskDelay( const uint32_t xTicksToDelay )
|
||||||
|
{
|
||||||
|
sleep(xTicksToDelay);
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
add_library(stub_spi_flash INTERFACE)
|
||||||
|
target_include_directories(stub_spi_flash INTERFACE .)
|
||||||
|
add_library(stub::spi_flash ALIAS stub_spi_flash)
|
@ -0,0 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
int spi_flash_get_chip_size();
|
@ -66,7 +66,7 @@ LOG_SUSPECTED=${LOG_PATH}/common_log.txt
|
|||||||
touch ${LOG_SUSPECTED}
|
touch ${LOG_SUSPECTED}
|
||||||
SDKCONFIG_DEFAULTS_CI=sdkconfig.ci
|
SDKCONFIG_DEFAULTS_CI=sdkconfig.ci
|
||||||
|
|
||||||
EXAMPLE_PATHS=$( find ${IDF_PATH}/examples/ -type f -name CMakeLists.txt | grep -v "/components/" | grep -v "/common_components/" | grep -v "/main/" | sort )
|
EXAMPLE_PATHS=$( find ${IDF_PATH}/examples/ -type f -name CMakeLists.txt | grep -v "/components/" | grep -v "/common_components/" | grep -v "/main/" | grep -v "/idf_as_lib/stubs/" | sort )
|
||||||
|
|
||||||
if [ $# -eq 0 ]
|
if [ $# -eq 0 ]
|
||||||
then
|
then
|
||||||
@ -142,7 +142,7 @@ build_example () {
|
|||||||
idf.py build >>${BUILDLOG} 2>&1
|
idf.py build >>${BUILDLOG} 2>&1
|
||||||
else
|
else
|
||||||
rm -rf build &&
|
rm -rf build &&
|
||||||
./build.sh >>${BUILDLOG} 2>&1
|
./build-esp32.sh >>${BUILDLOG} 2>&1
|
||||||
fi ||
|
fi ||
|
||||||
{
|
{
|
||||||
RESULT=$?; FAILED_EXAMPLES+=" ${EXAMPLE_NAME}" ;
|
RESULT=$?; FAILED_EXAMPLES+=" ${EXAMPLE_NAME}" ;
|
||||||
|
@ -73,7 +73,10 @@ components/espcoredump/test/test_espcoredump.sh
|
|||||||
tools/ldgen/ldgen.py
|
tools/ldgen/ldgen.py
|
||||||
tools/ldgen/test/test_fragments.py
|
tools/ldgen/test/test_fragments.py
|
||||||
tools/ldgen/test/test_generation.py
|
tools/ldgen/test/test_generation.py
|
||||||
|
examples/build_system/cmake/idf_as_lib/build-esp32.sh
|
||||||
examples/build_system/cmake/idf_as_lib/build.sh
|
examples/build_system/cmake/idf_as_lib/build.sh
|
||||||
|
examples/build_system/cmake/idf_as_lib/run-esp32.sh
|
||||||
|
examples/build_system/cmake/idf_as_lib/run.sh
|
||||||
examples/storage/parttool/parttool_example.py
|
examples/storage/parttool/parttool_example.py
|
||||||
examples/system/ota/otatool/otatool_example.py
|
examples/system/ota/otatool/otatool_example.py
|
||||||
tools/check_kconfigs.py
|
tools/check_kconfigs.py
|
||||||
|
@ -342,6 +342,7 @@ function run_tests()
|
|||||||
rm sdkconfig.defaults;
|
rm sdkconfig.defaults;
|
||||||
|
|
||||||
print_status "Building a project with CMake library imported and PSRAM workaround, all files compile with workaround"
|
print_status "Building a project with CMake library imported and PSRAM workaround, all files compile with workaround"
|
||||||
|
# Test for libraries compiled within ESP-IDF
|
||||||
rm -rf build
|
rm -rf build
|
||||||
echo "CONFIG_SPIRAM_SUPPORT=y" >> sdkconfig.defaults
|
echo "CONFIG_SPIRAM_SUPPORT=y" >> sdkconfig.defaults
|
||||||
echo "CONFIG_SPIRAM_CACHE_WORKAROUND=y" >> sdkconfig.defaults
|
echo "CONFIG_SPIRAM_CACHE_WORKAROUND=y" >> sdkconfig.defaults
|
||||||
@ -349,7 +350,16 @@ function run_tests()
|
|||||||
idf.py -C $IDF_PATH/examples/build_system/cmake/import_lib -B `pwd`/build reconfigure -D SDKCONFIG_DEFAULTS="`pwd`/sdkconfig.defaults"
|
idf.py -C $IDF_PATH/examples/build_system/cmake/import_lib -B `pwd`/build reconfigure -D SDKCONFIG_DEFAULTS="`pwd`/sdkconfig.defaults"
|
||||||
grep -q '"command"' build/compile_commands.json || failure "compile_commands.json missing or has no no 'commands' in it"
|
grep -q '"command"' build/compile_commands.json || failure "compile_commands.json missing or has no no 'commands' in it"
|
||||||
(grep '"command"' build/compile_commands.json | grep -v mfix-esp32-psram-cache-issue) && failure "All commands in compile_commands.json should use PSRAM cache workaround"
|
(grep '"command"' build/compile_commands.json | grep -v mfix-esp32-psram-cache-issue) && failure "All commands in compile_commands.json should use PSRAM cache workaround"
|
||||||
rm sdkconfig.defaults
|
rm -r sdkconfig.defaults build
|
||||||
|
# Test for external libraries in custom CMake projects with ESP-IDF components linked
|
||||||
|
mkdir build && touch build/sdkconfig
|
||||||
|
echo "CONFIG_SPIRAM_SUPPORT=y" >> build/sdkconfig
|
||||||
|
echo "CONFIG_SPIRAM_CACHE_WORKAROUND=y" >> build/sdkconfig
|
||||||
|
# note: we just need to run cmake
|
||||||
|
(cd build && cmake $IDF_PATH/examples/build_system/cmake/idf_as_lib -DCMAKE_TOOLCHAIN_FILE=$IDF_PATH/tools/cmake/toolchain-esp32.cmake -DTARGET=esp32)
|
||||||
|
grep -q '"command"' build/compile_commands.json || failure "compile_commands.json missing or has no no 'commands' in it"
|
||||||
|
(grep '"command"' build/compile_commands.json | grep -v mfix-esp32-psram-cache-issue) && failure "All commands in compile_commands.json should use PSRAM cache workaround"
|
||||||
|
rm -r build
|
||||||
|
|
||||||
print_status "Make sure a full build never runs '/usr/bin/env python' or similar"
|
print_status "Make sure a full build never runs '/usr/bin/env python' or similar"
|
||||||
OLDPATH="$PATH"
|
OLDPATH="$PATH"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user