提交
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
#声明编译环境
|
||||
|
||||
get_filename_component(MY_DIR_NAME "${CMAKE_SOURCE_DIR}" NAME)
|
||||
|
||||
#设备类型宏定义
|
||||
include($ENV{PROJECT_ROOT}/build/cmake/detect_target_product.cmake)
|
||||
|
||||
|
||||
# 定义宏 POWEROAD_COMPILED_LIB
|
||||
add_compile_definitions(POWEROAD_COMPILED_LIB)
|
||||
|
||||
#指定模块/程序名称 #-- 强制使用g++
|
||||
project(${MY_DIR_NAME} LANGUAGES CXX)
|
||||
|
||||
set(SRC_DIR "./")
|
||||
|
||||
message("--------------------------------cmake start [${PROJECT_NAME}]--------------------------------")
|
||||
|
||||
set(CURRENT_VERSION "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}")
|
||||
|
||||
#通用编译选项
|
||||
list(APPEND generic_compile_flags "-fPIC" "-rdynamic" "-Wno-psabi" "-Wno-unused-result" "-Wno-narrowing")
|
||||
|
||||
#根据环境变量配置编译参数
|
||||
if ($ENV{pd_complier_name} STREQUAL "complier_arm")
|
||||
#配置处理器
|
||||
set(CMAKE_SYSTEM_PROCESSOR arm)
|
||||
else()
|
||||
#配置处理器
|
||||
set(CMAKE_SYSTEM_PROCESSOR arm64)
|
||||
endif()
|
||||
|
||||
# 设置 C++ 标准
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
#配置系统名称
|
||||
set(CMAKE_SYSTEM_NAME Linux)#配置编译器
|
||||
message("-- Ready to set ${TARGET_PRODUCT} compile flags: $ENV{arm_compile_flags}")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} $ENV{arm_compile_flags}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} $ENV{arm_compile_flags}")
|
||||
|
||||
#配置sysroot路径
|
||||
set(CMAKE_SYSROOT $ENV{arm_sysroot_path})
|
||||
message("-- Ready to set ${TARGET_PRODUCT} sysroot path: $ENV{arm_sysroot_path}")
|
||||
|
||||
#根据编译器类型,声明导出库路径
|
||||
set(LIB_A_PATH "$ENV{PROJECT_ROOT}/out/$ENV{TARGET_PRODUCT}/lib/lib_a")
|
||||
set(LIB_SO_PATH "$ENV{PROJECT_ROOT}/out/$ENV{TARGET_PRODUCT}/lib/lib_so")
|
||||
|
||||
#配置输出目录
|
||||
set(LIB_EXE_OUT_PATH "$ENV{PROJECT_ROOT}/out/$ENV{TARGET_PRODUCT}/bin")
|
||||
message("-- Ready to set ${TARGET_PRODUCT} LIB_EXE_OUT_PATH: $ENV{LIB_EXE_OUT_PATH}")
|
||||
|
||||
#配置查找路径
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
||||
|
||||
#设置debug模式,断点有用
|
||||
set(CMAKE_BUILD_TYPE "Release") #Debug/Release
|
||||
|
||||
#依赖头文件路径
|
||||
include_directories(${CMAKE_SOURCE_DIR}/../../../include/public
|
||||
${CMAKE_SOURCE_DIR}/../../../include/interface
|
||||
${CMAKE_SOURCE_DIR}/../../../include/open
|
||||
${CMAKE_SOURCE_DIR}/../../../include/general_type
|
||||
${CMAKE_SOURCE_DIR}/../../../include/dev_model
|
||||
${CMAKE_SOURCE_DIR}/../../../include/tinyxml2
|
||||
${CMAKE_SOURCE_DIR}/../../../include/utility
|
||||
${CMAKE_SOURCE_DIR}/include
|
||||
)
|
||||
|
||||
#待编译源文件
|
||||
file(GLOB_RECURSE SELF_SRC ${CMAKE_SOURCE_DIR}/src/*.cpp)
|
||||
|
||||
#动态库输出路径
|
||||
set(LIBRARY_OUTPUT_PATH ${LIB_SO_PATH})
|
||||
|
||||
#依赖库路径:cmake版本小于3.13,则利用link_directories
|
||||
if (${CURRENT_VERSION} STRLESS "3.13")
|
||||
link_directories(${LIB_A_PATH})
|
||||
link_directories(${LIB_SO_PATH})
|
||||
endif()
|
||||
|
||||
#生成动态库.so文件:link_directories需在add_library之前,否则不生效
|
||||
add_library(${PROJECT_NAME} SHARED ${SELF_SRC})
|
||||
|
||||
#依赖库路径:cmake版本大于等于3.13,则利用target_link_directories
|
||||
if (${CURRENT_VERSION} STRGREATER_EQUAL "3.13")
|
||||
target_link_directories(${PROJECT_NAME} PUBLIC ${LIB_A_PATH})
|
||||
target_link_directories(${PROJECT_NAME} PUBLIC ${LIB_SO_PATH})
|
||||
endif()
|
||||
|
||||
#设置编译选项
|
||||
message("-- Ready to set generic compile flags: ${generic_compile_flags}")
|
||||
target_compile_options(${PROJECT_NAME} PRIVATE ${generic_compile_flags})
|
||||
|
||||
# 在Release模式下,添加自定义命令来strip动态库
|
||||
set(TARGET_PATH ${LIBRARY_OUTPUT_PATH}/lib${PROJECT_NAME}.so)
|
||||
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
|
||||
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
||||
COMMAND $ENV{STRIP} -s ${TARGET_PATH}
|
||||
COMMENT "Stripping symbols from ${TARGET_PATH}"
|
||||
)
|
||||
endif()
|
||||
|
||||
# 设置第二个输出路径,使用自定义命令复制文件
|
||||
add_custom_command(
|
||||
TARGET ${PROJECT_NAME}
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${PROJECT_NAME}> $ENV{BOARD_DIR}/lib
|
||||
)
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
#!/bin/bash
|
||||
|
||||
cd "$(dirname "$(readlink -f "$0")")"
|
||||
|
||||
script_name=$(basename "$0")
|
||||
#if [ "$0" = "$script_name" ]; then echo "脚本被自身调用,请检查无效路径"; exit 1 ;fi
|
||||
|
||||
# 显示脚本执行时间
|
||||
start_time=$(date +%s); trap 'echo "$(print_execution_time $?)"' EXIT
|
||||
|
||||
# 计算并打印脚本执行时间函数
|
||||
function print_execution_time {
|
||||
end_time=$(date +%s); execution_time=$((end_time - start_time)); execution_time_formatted=$(date -u -d @$execution_time +"%T")
|
||||
if [ $1 -eq 0 ];then SET_COLOR="\e[32m "; else SET_COLOR="\e[31m error at $(pwd) \n\e[1m"; fi
|
||||
mydir_name="$(d=$(pwd); echo ${d##*/})"
|
||||
echo -e "${SET_COLOR} [$1] 执行时间:$execution_time_formatted ( $mydir_name )\e[0m "
|
||||
}
|
||||
|
||||
current_project_path=$(pwd)
|
||||
export current_project_name=`echo ${current_project_path##*/}`
|
||||
echo "current_project_path = ${current_project_path}"
|
||||
|
||||
echo "====================================================build shell start [ ${current_project_name} ]===================================================="
|
||||
|
||||
pd_complier_type=${TARGET_PRODUCT}
|
||||
|
||||
if [ -z ${TARGET_PRODUCT} ];then
|
||||
PROJECT_ROOT=$(while [ ! -f "build/envsetup.sh" ]; do [ "$(pwd)" = "/" ] && exit 1; cd ..; done; pwd)
|
||||
if [ ! -z ${PROJECT_ROOT} ];then
|
||||
source ${PROJECT_ROOT}/build/envsetup.sh && lunch LAST
|
||||
if [ $? -eq 255 ];then exit 0; fi
|
||||
pd_complier_type=${TARGET_PRODUCT}
|
||||
fi
|
||||
fi
|
||||
echo -e " ready to build\e[34;1m ${pd_complier_type} \e[0m target [\e[34;1m ${current_project_name}\e[0m ] ......"
|
||||
unset LD_LIBRARY_PATH
|
||||
export pd_complier_name="$(if [[ "${TARGET_PRODUCT}" =~ "imx"* ]]; then echo "complier_arm"; else echo "complier_x86"; fi)"
|
||||
|
||||
export arm_sysroot_path=${SYSROOT}
|
||||
export arm_compile_flags=${CFLAGS}
|
||||
|
||||
echo "============================build shell start [lib${current_project_name}]===================================================="
|
||||
|
||||
|
||||
# set obj at: platform/out/build/xxxx/build
|
||||
check_dirs() { # check dir: process/ script/
|
||||
local dir="$1"; if [[ -d "$dir/process" && -d "$dir/script" ]]; then echo "$dir"; exit 0;fi
|
||||
local parent="${dir%/*}"; if [[ "$parent" != "$dir" ]]; then check_dirs "$parent"; else echo "$(pwd)"; fi
|
||||
}
|
||||
base_folder="$(echo ${PROJECT_ROOT}|tr -s '/')"
|
||||
|
||||
if [[ $current_project_path =~ "$base_folder" ]] && [ ! -z $base_folder ]; then
|
||||
echo ""
|
||||
else
|
||||
echo "base_folder = $base_folder"
|
||||
echo "current_project_path = $current_project_path"
|
||||
echo -e "\e[31m Error: 环境配置不匹配,在当前项目下请重新配置:\n\e[35m\t source build/envsetup.sh \e[0m"
|
||||
exit -2
|
||||
fi
|
||||
|
||||
build_path=$(echo "$current_project_path" | sed "s|${base_folder}|${base_folder}/out/build/${pd_complier_type}/|g")
|
||||
echo "build_path = ${build_path}"
|
||||
|
||||
if [[ $1 == "clean" ]] || [[ $1 == "-c" ]] || [[ $1 == "all" ]];then
|
||||
if [[ "$build_path" == *"/out/build/"* ]]; then
|
||||
rm -rvf ${build_path}
|
||||
else
|
||||
if [ -d ${build_path} ];then
|
||||
find "${build_path}" -name '*.o' -print0 | xargs -r0 rm -f
|
||||
find ${build_path} -name 'cmake_install.cmake' -print0 | xargs -r0 rm -f
|
||||
find ${build_path} -name 'CMakeCache.txt' -print0 | xargs -r0 rm -f
|
||||
find ${build_path} -type d -name 'CMakeFiles' -print0 | xargs -r0 rm -rf
|
||||
fi
|
||||
fi
|
||||
echo " clean done."
|
||||
echo "====================================================build shell end [lib${current_project_name}]===================================================="
|
||||
if [[ $1 != "all" ]];then exit 0; fi
|
||||
fi
|
||||
|
||||
|
||||
# build path
|
||||
mkdir -p ${build_path}
|
||||
cmake -B ${build_path}
|
||||
echo "----------------make start----------------"
|
||||
cmake --build "${build_path}" -j4 || exit $?
|
||||
|
||||
echo "===============================build shell end [lib${current_project_name}] [${pd_complier_type}]===================================================="
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,22 @@
|
||||
|
||||
MYNAME = $(notdir $(CURDIR))
|
||||
|
||||
|
||||
.PHONY: build all clean run
|
||||
|
||||
build:
|
||||
./build.sh $@
|
||||
|
||||
all: clean
|
||||
./build.sh $@
|
||||
|
||||
#rebuild: clean build
|
||||
# ./build.sh clean && ./build.sh
|
||||
|
||||
clean:
|
||||
./build.sh clean
|
||||
|
||||
|
||||
run: build
|
||||
../../board_dir/bin/$(MYNAME)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user