3.5.1.33 HLS Makefile
(Ask a Question)All SmartHLS™ projects have a Makefile that can contain variables that affect the SmartHLScompilation flow.
Makefile Supported Syntax
- Variable assignment operators
=
,?=
,+=
- Variable interpolation
$(VAR)
- Supported Code blocks
ifdef VAR ... #endif #ifndef VAR ... #endif
Nestedifdef
blocks andelse
are not supported.- Include statements
include Makefile.user
- Comments
# put your comments here
- Multi-line statements
- Multi-line statements with lines ending in
\
MakeFile Variables
There are several Makefile variables that the user can assign to change the SmartHLS compilation. The description of each variable is listed below:
Variable | Description |
---|---|
SRCS | The SRCS variable in Makefile should list all the source files (.cpp or .c ).Header files should not be added to SRCS , but should be properly included by the source files.shls init will automatically add the file names for the existing source files in the current directory. If source files are created after shls init , please update SRCS (e.g., SRCS = foo.cpp bar.cpp ). |
NAME | The NAME variable stands for the project name, e.g., NAME = MY_PROJECT .The default project name is the current directory name when NAME is not specified in Makefile . |
BOARD_PATH | Specify the path where the test will be run on board. The default is /home/root/ .BOARD_PATH is always prefixed by /home/root/ as programs are run as root on the board. |
PROGRAM_ARGUMENTS | PROGRAM_ARGUMENTS can be used to specify the arguments of the software testbench (i.e., int main(int argc, char *argv[]) ).Here is an example: PROGRAM_ARGUMENTS = input_file.bmp golden_output_file.bmp . More details can be found in Simulate HLS Hardware (SW/HW Co-Simulation). |
NUM_LIBERO_PnR_PASSES | Defines the maximum number of Place and Route passes to go through in order to meet the timing requirement. |
INPUT_FILES_RISCV | Specifies the input files to the program to be copied to the development board, separated by a space. The path used for the files should be based on the path on the development local machine. For example:INPUT_FILES_RISCV = lane3.avi lane3_golden.txt` This will copy lane3.avi and lane3_golden.txt from the project folder to the Icicle board before running the program on board. |
OUTPUT_FILES_RISCV | Specifies the output files of the program ran on the development board, separated by a space. The path used for the files should be based on the path on the development board. Example:OUTPUT_FILES_RISCV = output.avi output.txt will copy output.avi and output.txt This will copy output.avi and output.txt from the the Icicle board to the project folder after running the program on board. |
USER_CXX_FLAG | Additional flags used for compilation such as -I .Example:USER_CXX_FLAG = -I$(OPENCV_PATH)/include/opencv4 The above compiler option will be added to all the compile command to include the OpenCV include directory. |
USER_CXX_FLAG_RISCV | Additional flags used for compilation such as -I .USER_CXX_FLAG_RISCV is defaulted to USER_CXX_FLAG. Defining USER_CXX_FLAG_RISCV will override the default, including when it is defined but empty. User can define this flag for adding specific flags for compiling the binary running on the on-board RISCV processor. Example:USER_CXX_FLAG_RISCV = -I$(OPENCV_PATH)/include/opencv4 The above compiler option will added to all the compile command to include the OpenCV include directory. |
USER_LINK_FLAG | Flags for linking dynamic libraries such as -L and -l .Example:USER_LINK_FLAG = -L$(FFMPEG_PATH)/lib -lavcodec The above compiler option will link FFMPEG’s avcodec library. |
USER_LINK_FLAG_RISCV | Flags for linking dynamic libraries such as -L and -l .USER_LINK_FLAG_RISCV is defaulted to USER_LINK_FLAG. Defining USER_LINK_FLAG_RISCV will override the default, including when it is defined but empty. User can define this flag for adding specific flags for linking the binary running on the on-board RISCV processor. Example:USER_LINK_FLAG_RISCV = -L$(FFMPEG_PATH)/lib -lavcodec The above compiler option will link FFMPEG’s avcodec library for the RISCV processor. |
USER_ENV_VARS | Set the environment variable used for running the program on development host. Example:USER_ENV_VARS = LD_LIBRARY_PATH=$(OPENCV_PATH)/lib The above compiler option will set LD_LIBRARY_PATH to $(OPENCV_PATH)/lib when running the program. Windows users should specify PATH instead of LD_LIBRARY_PATH for linking libraries, like so:USER_ENV_VARS = PATH=$(OPENCV_PATH)/bin |
USER_ENV_VARS_RISCV | Set the environment variable used for running the program on RISCV on the development board. USER_ENV_VARS_RISCV is defaulted to USER_ENV_VARS. Defining USER_ENV_VARS_RISCV will override the default, including when it is defined but empty. Example:USER_ENV_VARS_RISCV = LD_LIBRARY_PATH=$(OPENCV_PATH)/lib The above compiler option will set LD_LIBRARY_PATH to $(OPENCV_PATH)/lib when running the program. |
HLS_PATH_SEP | Automatically set to : when running on Linux or ; when running on Windows. |
HLS_OS | Automatically set to linux when running on Linux or win when running on Windows. |
HLS_INSTRUMENT_ENABLE |
Used to enable instrumentation when using the
SmartHLS SoC flow. When set to 1 and See Using a Custom Instrumentation Flow when using SmartHLS IP flow. |
Makefile Example
(Ask a Question)The example below shows how to define some of the above Makefile variables.
For IDE projects, you should create a new Makefile.user
file and put your custom Makefile settings there (any changes in the makefile
of an IDE project will be overwritten).
# Path to place files on the Icicle kit, relative to root home dir. BOARD_PATH=tests/lane-detection-shls # To pass timing for this project, we require more PnR passes NUM_LIBERO_PnR_PASSES = 10 # Extra defines to include shared opencv/ffmpeg libraries below: OPENCV_PATH_RISCV = $(SHLS_ROOT_DIR)/smarthls-library/external/vision/precompiled_sw_libraries/opencv4.5.4-riscv_64 FFMPEG_PATH_RISCV = $(SHLS_ROOT_DIR)/smarthls-library/external/vision/precompiled_sw_libraries/ffmpeg4.4-riscv_64 OPENCV_PATH = $(SHLS_ROOT_DIR)/smarthls-library/external/vision/precompiled_sw_libraries/opencv4.5.4-x86_64 FFMPEG_PATH = $(SHLS_ROOT_DIR)/smarthls-library/external/vision/precompiled_sw_libraries/ffmpeg4.4-x86_64 ########################################################################################### # User Define variables # Specify input and optput files to copy to and from the board. # INPUT_FILES_RISCV should use host paths. # OUTPUT_FILES should use on-board paths. INPUT_FILES_RISCV = lane3.avi lane3_golden.txt OUTPUT_FILES_RISCV = outputlane3.avi lane3_lane_distances.txt # Secify input arguments PROGRAM_ARGUMENTS = lane3.avi lane3_golden.txt # Additional flags used for compilation, such as -I USER_CXX_FLAG += -I$(OPENCV_PATH)/include/opencv4 -fexceptions \ -Wno-sign-compare -Wno-unused-function \ -Wno-unused-variable # Flags for additional link libraries such as -L and -l # This variable is for running on local host machine (i.e., x86 target). # -B/usr/lib/x86_64-linux-gnu specifies which library to reference # when your platform has cross platform compilation capability # Specify opencv and ffmpeg libs. USER_LINK_FLAG += -B/usr/lib/x86_64-linux-gnu \ -L$(OPENCV_PATH)/lib \ -lopencv_videoio -lopencv_core -lopencv_imgcodecs -lopencv_imgproc \ -L$(FFMPEG_PATH)/lib \ -lavcodec -lavformat -lavutil -lswscale -lswresample \ -Wl,-rpath,$(FFMPEG_PATH)/lib # Flags for additional link libraries such as -L and -l for # This variable is for running on the SOC. # Include opencv and ffmpeg libs in the cross compiler linker. USER_LINK_FLAG_RISCV = -L$(OPENCV_PATH_RISCV)/lib \ -lopencv_videoio -lopencv_core -lopencv_imgcodecs -lopencv_imgproc -latomic \ -L$(FFMPEG_PATH_RISCV)/lib \ -lavcodec -lavformat -lavutil -lswscale -lswresample \ -Wl,-rpath-link,$(FFMPEG_PATH_RISCV)/lib # Additional user-defined environment variables that user might need to run their program # This variable is for running on local host machine # Windows needs libraries on PATH USER_ENV_VARS = PATH=$(OPENCV_PATH)/lib$(HLS_PATH_SEP)$(FFMPEG_PATH)/bin$(HLS_PATH_SEP)/usr/x86_64-w64-mingw32/sys-root/mingw/bin$(HLS_PATH_SEP)$$PATH # Linux needs libraries on LD_LIBRARY_PATH USER_ENV_VARS += LD_LIBRARY_PATH=$(OPENCV_PATH)/lib$(HLS_PATH_SEP)$(FFMPEG_PATH)/lib # Additional user-defined environment variables that user might need to run their program # This variable is for running on the SOC # LD_LIBRARY_PATH is needed for dynamically linking OpenCV USER_ENV_VARS_RISCV = LD_LIBRARY_PATH=/home/root/shls_sw_dependencies/opencv4.5.4-riscv_64/lib:/home/root/shls_sw_dependencies/ffmpeg4.4-riscv_64/lib # The IP adddress of the ethernet-cable-connected Icicle kit. BOARD_IP ?= 192.168.X.X # The programmer ID for programming the Icicle kit. PROGRAMMER_ID ?= 445F3438