Browse Source

V0.1
1、新建库,一些编译脚本

Apple 8 months ago
commit
382f68e2dd
6 changed files with 589 additions and 0 deletions
  1. 507 0
      createDeb.sh
  2. 6 0
      编译CURL.txt
  3. 9 0
      编译FFMPEG.txt
  4. 23 0
      编译SPDLOG.txt
  5. 28 0
      编译fmt.txt
  6. 16 0
      编译hiredis.txt

+ 507 - 0
createDeb.sh

@@ -0,0 +1,507 @@
+#!/bin/bash
+
+#创建Deb包的脚本,需要先设置好变量位置,传入的第一个参数是可执行程序的名称
+
+
+#帮助字符串
+helpStr="
+deb打包脚本
+第一个参数是动作类型
+第二个参数是可执行程序的名称
+此脚本支持的动作类型有:\n 
+    -b|build:构建deb包\n 
+    -c|clean:清理\n 
+    -cd:拷贝依赖库\n
+    -d|dir:创建目录\n
+    -db|dirbuild:创建目录并构建deb包\n
+    -h|help:帮助 "
+
+
+#检查参数是否正确
+case $1 in
+    -b|build)
+        #检查是否提供了可执行程序的名称
+        if [ -z $2 ]; then
+            echo "未提供可执行程序的名称"
+            exit 1
+        fi
+        ;;
+    -c|clean)
+        echo "清理文件夹"
+        ;;
+    -cd)
+        echo "拷贝依赖库"
+    ;;
+    -d|dir)
+        #检查是否提供了可执行程序的名称
+        if [ -z $2 ]; then
+            echo "未提供可执行程序的名称"
+            exit 1
+        fi
+        ;;
+    -db|dirbuild)
+        #检查是否提供了可执行程序的名称
+        # if [ -z $2 ]; then
+        #     echo "未提供可执行程序的名称"
+        #     exit 1
+        # fi
+        ;;
+    -h|-help)
+        echo "$helpStr"
+        exit 0
+        ;;
+    *)
+        echo "参数错误,请输入 ./createDeb.sh -h 查看帮助"
+        exit 1
+        ;;
+esac
+
+
+#=========================================================================
+# ************************    自定义的一些变量    *************************
+#=========================================================================
+
+#可执行程序的名称
+AppName=$2
+#安装包名,转换成全小写
+PackageName=$(echo $AppName | awk '{print tolower($0)}')
+#版本信息
+Version=1.0.1.1
+#安装路径,绝对路径
+installPath=/opt/$AppName
+#软件描述
+AppComment="This is $AppName Application"
+#安装包大小
+InstalledSize=158900
+#作者信息
+Maintainer=HZLH
+#安装包的描述
+Description="ESM8C Upper Computer Program for ESM8C. ESM8C is a software for the upper computer of ESM8C."
+
+
+#设置临时环境变量,后面拷贝可执行程序依赖库的时候需要这些临时变量,就是Qt的安装位置
+PATH=/home/Apple/Programes/Qt/Qt5.15.2/5.15.2/gcc_64/bin:$PATH
+LD_LIBRARY_PATH=/home/Apple/Programes/Qt/Qt5.15.2/5.15.2/gcc_64/lib:$LD_LIBRARY_PATH
+QT_PLUGIN_PATH=/home/Apple/Programes/Qt/Qt5.15.2/5.15.2/gcc_64/plugins:$QT_PLUGIN_PATH
+QML2_IMPORT_PATH=/home/Apple/Programes/Qt/Qt5.15.2/5.15.2/gcc_64/qml:$QML2_IMPORT_PATH
+
+#添加自定义的库位置,这个是自己编译的第三方库
+#注意,因为是库文件,要设置成这个变量才行
+LD_LIBRARY_PATH=/home/Apple/Libs/Standard_Library/Libraries/linux_gcc8.3/lib:$LD_LIBRARY_PATH
+LD_LIBRARY_PATH=/home/Apple/Libs/Standard_Library/Libraries/sm_dll/libs/linux/x64:$LD_LIBRARY_PATH
+
+
+
+#============================================================================
+#拷贝依赖库
+func_copyDepend()
+{
+
+#先获取sudo权限
+sudo echo "获取sudo权限"
+
+#检测是否安装了linuxdeployqt
+if command -v "$linuxdeployqt" > /dev/null 2>&1; then
+    echo "未安装linuxdeployqt"
+    exit 1
+fi
+
+#=========================================================================
+# ************************    拷贝程序依赖库    *************************
+#=========================================================================
+
+echo "**********    开始拷贝Qt依赖库   **********"
+
+mkdir libs
+cd libs
+cp ../$AppName .
+
+#导出环境变量
+export PATH
+export LD_LIBRARY_PATH
+export QT_PLUGIN_PATH
+export QML2_IMPORT_PATH
+
+#查看qt版本
+echo "***** qmake Version:" $(qmake -v)
+echo "***** PATH:" $PATH
+echo "***** LD_LIBRARY_PATH:" $LD_LIBRARY_PATH
+echo "***** QT_PLUGIN_PATH:" $QT_PLUGIN_PATH
+echo "***** QML2_IMPORT_PATH:" $QML2_IMPORT_PATH
+
+
+#拷贝依赖库
+linuxdeployqt $AppName -appimage
+
+cd ..
+
+echo "**********    拷贝完成   **********"
+
+}
+
+#============================================================================
+
+#构建函数
+func_create()
+{
+
+#先获取sudo权限
+sudo echo "获取sudo权限"
+
+#检测可执行程序和图标是否存在
+if [ ! -e $AppName ]; then
+    echo "可执行程序不存在"
+    exit 1
+fi
+
+if [ ! -e $AppName.png ]; then
+    echo "图标“$AppName.png”不存在"
+    exit 1
+fi
+
+#检测是否安装了linuxdeployqt
+if command -v "$linuxdeployqt" > /dev/null 2>&1; then
+    echo "未安装linuxdeployqt"
+    exit 1
+fi
+
+echo "***** 开始创建相关目录 *****"
+echo "构建的程序名称:$AppName"
+
+echo "***** 创建目录 *****"
+mkdir -p output
+mkdir -p source/DEBIAN
+mkdir -p source$installPath
+
+#拷贝可执行文件,拷贝依赖库
+echo "***** 拷贝可执行文件 *****"
+cp $AppName source$installPath
+cp $AppName.png source$installPath
+
+#=========================================================================
+# ************************    拷贝程序依赖库    *************************
+#=========================================================================
+
+echo "**********    开始拷贝Qt依赖库   **********"
+
+#导出环境变量
+export PATH
+export LD_LIBRARY_PATH
+export QT_PLUGIN_PATH
+export QML2_IMPORT_PATH
+
+#查看qt版本
+echo "***** qmake Version:" $(qmake -v)
+echo "***** PATH:" $PATH
+echo "***** LD_LIBRARY_PATH:" $LD_LIBRARY_PATH
+echo "***** QT_PLUGIN_PATH:" $QT_PLUGIN_PATH
+echo "***** QML2_IMPORT_PATH:" $QML2_IMPORT_PATH
+
+#拷贝依赖库,先保存现在的路径
+srcPath=$(pwd)
+cd source$installPath
+echo "***** cd $(pwd)"
+
+#检测是否提供默认的.desktop文件
+if [ ! -e $srcPath/$AppName.desktop ]; then
+    #检测当前文件夹是否存在.desktop文件,如果有就删除
+    if [ -e $AppName.desktop ]; then
+        rm $AppName.desktop
+    fi
+    echo "***** 未提供默认的$AppName.desktop文件,使用默认生成的 *****"
+    echo "[Desktop Entry]" >> $AppName.desktop
+    echo "Type=Application" >> $AppName.desktop
+    echo "Name=$AppName" >> $AppName.desktop
+    echo "Exec=$installPath/$AppName" >> $AppName.desktop
+    echo "Icon=$installPath/$AppName.png" >> $AppName.desktop
+    echo "Comment=This is $AppName Application" >> $AppName.desktop
+    echo "Terminal=false" >> $AppName.desktop
+fi
+#赋予可执行权限,不然就是个普通文件
+chmod +x $AppName.desktop
+#拷贝依赖库
+linuxdeployqt $AppName -appimage
+
+
+cd $srcPath
+echo "***** cd $(pwd)"
+echo "**********    拷贝完成   **********"
+
+
+#=========================================================================
+# *******************    添加安装和卸载时运行的脚本    ********************
+#=========================================================================
+
+echo "***** 添加安装和卸载脚本 *****"
+
+cd source/DEBIAN
+echo "***** cd $(pwd)"
+
+#生成control文件,这个是Deb包的描述文件
+if [ ! -e $srcPath/control ]; then
+    echo "***** 未提供默认的control文件,生成默认的 *****"
+    #检查有没有默认生成的文件
+    if [ -e control ]; then
+        rm control
+    fi
+
+cat > control << EOF
+Package: $PackageName
+Version: $Version
+Section: utils
+Priority: optional
+Architecture: amd64
+Depends:
+Installed-Size: $InstalledSize
+Maintainer: $Maintainer
+Description: $Description
+EOF
+
+
+else
+    echo "***** 已提供control文件 *****"
+    cp $srcPath/control .
+
+fi
+
+#添加preinst文件,这个是安装程序之前运行的脚本
+if [ ! -e $srcPath/preinst ]; then
+    echo "***** 未提供默认的preinst文件,生成默认的 *****"
+    #检查有没有默认生成的文件
+    if [ -e preinst ]; then
+        rm preinst
+    fi
+
+cat > preinst << EOF
+#!/bin/bash
+
+echo "***** run preinst *****"
+echo "安装$AppName,先关闭 $AppName..."
+echo "当前用户是:\$whoami"
+echo "安装用户是:\$SUDO_USER"
+
+echo "***** end preinst *****"
+EOF
+
+else
+    echo "***** 已提供preinst文件 *****"
+    cp $srcPath/preinst .
+fi
+
+#添加postinst文件,这个是安装程序之后运行的脚本,主要是拷贝快捷方式
+if [ ! -e $srcPath/postinst ]; then
+    echo "***** 未提供默认的postinst文件,生成默认的 *****"
+    #检查有没有默认生成的文件
+    if [ -e postinst ]; then
+        rm postinst
+    fi
+
+
+cat > postinst << EOF
+#!/bin/bash
+
+echo "***** run postinst *****"
+chmod 777 $installPath/$AppName.desktop
+#拷贝至菜单文件夹
+cp $installPath/$AppName.desktop /usr/share/applications/
+
+#添加桌面文件,只添加当前用户
+if [ -d /home/\$SUDO_USER/Desktop ]
+then
+    #这一句用来添加桌面快捷方式,$SUDO_USER是执行sudo的用户,使用安装器安装的可能不会有桌面图标
+    cp $installPath/$AppName.desktop /home/\$SUDO_USER/Desktop/
+fi
+
+echo "***** end postinst *****"
+EOF
+
+else
+    echo "***** 已提供postinst文件 *****"
+    cp $srcPath/postinst .
+
+fi
+
+#添加prerm文件,这个是卸载程序之前运行的脚本
+if [ ! -e $srcPath/prerm ]; then
+    echo "***** 未提供默认的prerm文件,生成默认的 *****"
+    #检查有没有默认生成的文件
+    if [ -e prerm ]; then
+        rm prerm
+    fi
+
+
+cat > prerm << EOF
+#!/bin/bash
+
+echo "***** run prerm *****"
+echo "卸载$AppName,先关闭 $AppName..."
+#关闭前需要先判断有没有运行
+A=\$(ps -ef | grep $AppName | grep -v grep | awk '{print \$2}')
+echo "$AppName 的进程ID是:\$A"
+echo "删除$AppName,正在关闭 $AppName..."
+# kill -9 \$A
+echo "$AppName 已关闭"
+
+echo "***** end prerm *****"
+EOF
+
+
+else
+    echo "***** 已提供prerm文件 *****"
+    cp $srcPath/prerm .
+fi
+
+#添加postrm文件,这个是卸载程序之后运行的脚本
+if [ ! -e $srcPath/postrm ]; then
+    echo "***** 未提供默认的postrm文件,生成默认的 *****"
+    #检查有没有默认生成的文件
+    if [ -e postrm ]; then
+        rm postrm
+    fi
+
+
+cat > postrm << EOF
+#!/bin/bash
+
+echo "***** run postrm *****"
+echo "正在删除 $AppName..."
+#检查文件是否存在
+echo "检查$AppName.desktop是否存在"
+if [ -f /usr/share/applications/$AppName.desktop ]; then
+    echo "删除/usr/share/applications/$AppName.desktop"
+    rm /usr/share/applications/$AppName.desktop
+else
+    echo "/usr/share/applications/$AppName.desktop不存在"
+fi
+
+#删除桌面快捷方式
+echo "检查/home/*/Desktop/$AppName.desktop是否存在"
+for username in \`ls /home\`
+do
+    #文件存在则删除
+    if [ -e /home/\$username/Desktop/$AppName.desktop ]; then
+        echo "删除/home/\$username/Desktop/$AppName.desktop"
+        rm /home/\$username/Desktop/$AppName.desktop
+    else
+        echo "/home/$username/Desktop/$AppName.desktop 不存在"
+    fi
+done
+
+#删除$installPath
+echo "检查$installPath 是否存在"
+if [ -d $installPath ]; then
+    echo "删除$installPath"
+    rm -rf $installPath
+else
+    echo "$installPath 不存在"
+fi
+
+echo "$AppName 已删除"
+
+echo "***** end postrm *****"
+EOF
+
+else
+    echo "***** 已提供postrm文件 *****"
+    cp $srcPath/postrm .
+
+fi
+
+#给四个问价赋予可执行权限
+chmod 775 preinst
+chmod 775 postinst
+chmod 775 prerm
+chmod 775 postrm
+
+cd $srcPath
+echo "***** cd $(pwd)"
+
+echo "***** 目录和文件创建完成,输入 ./createDeb.h -b 构建Deb包 *****"
+
+}
+#end func_create
+
+#=========================================================================
+# **************************    打包成Deb包    ***************************
+#=========================================================================
+
+func_build()
+{
+
+#检查文件夹目录是否正确
+if [ ! -d source ]; then
+    echo "source文件夹不存在"
+    exit 1
+fi
+if [ ! -d output ]; then
+    echo "output文件夹不存在"
+    exit 1
+fi
+
+#检查可执行程序是否存在
+if [ ! -e source$installPath/$AppName ]; then
+    echo "可执行程序不存在"
+    exit 1
+fi
+
+
+echo "***** 开始生成Deb包 *****"
+debName="$AppName"_amd64_"$Version".deb
+
+#检查有没有生成的Deb包
+if [ -e output/$debName ]; then
+    rm output/$debName
+fi
+
+#打包
+sudo dpkg -b source output/$debName
+
+echo "***** Deb包生成完成:output/$debName *****"
+
+}
+#end func_build
+
+#=========================================================================
+# ***************************    清理函数    ****************************
+#=========================================================================
+
+func_clean()
+{
+    echo "***** 开始清理 *****"
+    rm -rf source
+    rm -rf output/*
+    echo "***** 清理完成 *****"
+}
+
+
+#=========================================================================
+# ***************************    执行函数    ****************************
+#=========================================================================
+
+
+case $1 in
+    -b|build)
+        # func_create
+        func_build
+        ;;
+    -c|clean)
+        func_clean
+        ;;
+    -cd)
+        func_copyDepend
+        ;;
+    -d|dir)
+        func_create
+        ;;
+    -db|dirbuild)
+        func_create
+        func_build
+        ;;
+    -h|-help)
+        echo "$helpStr"
+        ;;
+    *)
+        echo "参数错误,请输入 ./createDeb.sh -h 查看帮助"
+        ;;
+esac
+

+ 6 - 0
编译CURL.txt

@@ -0,0 +1,6 @@
+cmake .. \
+-DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \
+-DCMAKE_INSTALL_PREFIX="/home/Apple/Libs/Standard_Library/Libraries/linux_gcc8.3" \
+-DCMAKE_BUILD_TYPE=Release
+
+

+ 9 - 0
编译FFMPEG.txt

@@ -0,0 +1,9 @@
+../configure \
+--prefix=/data/home/Apple/Libs/ffmpeg4.4.5 \
+--target-os=linux \
+--arch=x86_64 \
+--disable-x86asm \
+--enable-shared \
+--enable-openssl
+
+编译FFMPEG,启用openssl

+ 23 - 0
编译SPDLOG.txt

@@ -0,0 +1,23 @@
+cmake .. \
+-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
+-DCMAKE_INSTALL_PREFIX="/home/Apple/Libs/Standard_Library/Libraries/linux_gcc8.3" \
+-DCMAKE_BUILD_TYPE=Release \
+-DSPDLOG_BUILD_SHARED=ON \
+-DSPDLOG_BUILD_EXAMPLE=OFF \
+-DSPDLOG_FMT_EXTERNAL=ON \
+-Dfmt_DIR=/data/home/Apple/Libs/Standard_Library/Libraries/linux_gcc8.3/lib
+
+
+这里使用的是外部fmt库,需要链接fmt,要直接指定.cmake文件
+
+
+编译成静态库
+cmake .. \
+-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
+-DCMAKE_INSTALL_PREFIX="/home/Apple/Libs/Standard_Library/Libraries/linux_gcc8.3_static" \
+-DCMAKE_BUILD_TYPE=Debug \
+-DSPDLOG_BUILD_SHARED=OFF \
+-DSPDLOG_BUILD_EXAMPLE=OFF \
+-DSPDLOG_FMT_EXTERNAL=ON \
+-Dfmt_DIR=/home/Apple/Libs/Standard_Library/Libraries/linux_gcc8.3_static/lib
+

+ 28 - 0
编译fmt.txt

@@ -0,0 +1,28 @@
+cmake .. \
+-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
+-DCMAKE_INSTALL_PREFIX="/home/Apple/Libs/Standard_Library/Libraries/linux_gcc8.3" \
+-DCMAKE_CXX_STANDARD=17 \
+-DCMAKE_BUILD_TYPE=Debug \
+-DBUILD_SHARED_LIBS=ON \
+-DFMT_TEST=OFF
+
+
+
+
+
+CMAKE_POSITION_INDEPENDENT_CODE 这个参数貌似是真正变成动态库,只使用一份代码,而不是拷贝这个库。
+这个参数在编译静态库的时候也需要,就是-fPIC,没有这个参数别的库链接这个静态库可能会报错
+
+目前编译10.2.1可以成功,编译11.0.1报错,禁止编译TEST就可以编译成功了
+
+
+
+编译成静态库
+cmake .. \
+-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
+-DCMAKE_INSTALL_PREFIX="/home/Apple/Libs/Standard_Library/Libraries/linux_gcc8.3_static" \
+-DCMAKE_CXX_STANDARD=17 \
+-DCMAKE_BUILD_TYPE=Release \
+-DBUILD_SHARED_LIBS=OFF \
+-DFMT_TEST=OFF
+

+ 16 - 0
编译hiredis.txt

@@ -0,0 +1,16 @@
+cmake .. \
+-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
+-DCMAKE_INSTALL_PREFIX="/data/home/Apple/Libs/Standard_Library/Libraries/linux_gcc8.3" \
+-DCMAKE_CXX_STANDARD=17 \
+-DCMAKE_BUILD_TYPE=Release
+
+
+
+
+
+默认开启动态库
+-DBUILD_SHARED_LIBS=ON \
+-DENABLE_SSL=ON 开启OPENSSL
+
+可以指定OPENSSL文件夹,默认指向"/usr/local/opt/openssl"
+OPENSSL_ROOT_DIR