1
0
mirror of https://gitee.com/drabel/LibQQt.git synced 2025-01-04 10:18:44 +08:00
LibQQt/multi-link/add_sdk.pri

440 lines
16 KiB
Plaintext
Raw Normal View History

2018-05-24 14:43:59 +08:00
################################################
##add_sdk.pri, making sdk function
##install to SDK path
##把Library按照SDK格式安装到LIB_SDK_ROOT
##发布到sdk是为Multi link准备的。
##依赖add_version.pri
##please don't modify this pri
################################################
THIS_PRI_PWD = $${PWD}
#在build path修复app (macOS专有)
#copy lib
#fix bundle路径链接
defineReplace(get_add_mac_sdk_fix_building_framework) {
#need QQT_BUILD_PWD
create_command = $$get_add_mac_sdk()
APP_DEST_DIR=$${DESTDIR}
isEmpty(APP_DEST_DIR):APP_DEST_DIR=.
libname = $$TARGET
libname_temp = $${libname}_Temp
libname_lower = $$lower($${libname})
command =
command += chmod +x $${THIS_PRI_PWD}/linux_cur_path.sh &&
command += . $${THIS_PRI_PWD}/linux_cur_path.sh &&
#create temp
command += $$MK_DIR $${APP_DEST_DIR}/$${libname_temp}.framework &&
#进去
command += cd $${APP_DEST_DIR}/$${libname_temp}.framework &&
#修复framework里的快捷方式
command += $${create_command} &&
command += chmod +x $${THIS_PRI_PWD}/linux_cd_path.sh &&
command += . $${THIS_PRI_PWD}/linux_cd_path.sh &&
#拷贝prl到新的里
command += $$COPY $${APP_DEST_DIR}/$${libname}.framework/$${libname}.prl $${APP_DEST_DIR}/$${libname_temp}.framework/$${libname}.prl $$CMD_SEP
#del 原先的
command += $$RM_DIR $${APP_DEST_DIR}/$${libname}.framework &&
#rename 临时的 framework 到原先的
command += $$MOVE $${APP_DEST_DIR}/$${libname_temp}.framework $${APP_DEST_DIR}/$${libname}.framework
#message($$command)
return ($${command})
}
2018-05-24 14:43:59 +08:00
################################################
##lib install functions
##variable can be private and default inherit
##内部实现
################################################
defineReplace(get_add_sdk_dir_struct) {
2018-05-24 14:43:59 +08:00
#if it's qt library, don't create
command =
!equals(LIB_SDK_PWD , $$[QT_INSTALL_DATA]){
!contains(QSYS_PRIVATE, macOS) {
command += $$MK_DIR $$LIB_INC_DIR $$CMD_SEP
}
command += $$MK_DIR $$LIB_BIN_DIR $$CMD_SEP
2018-05-24 14:43:59 +08:00
command += $$MK_DIR $$LIB_LIB_DIR $$CMD_SEP
command += $$MK_DIR $$LIB_CMAKE_DIR $$CMD_SEP
command += $$MK_DIR $$LIB_PRI_PATH
}
return ($$command)
}
defineReplace(get_add_windows_sdk) {
2018-05-24 14:43:59 +08:00
#need cd sdk root
command =
#copy header
command += $${COPY_DIR} $${LIB_SRC_PWD}\\*.h* $${LIB_INC_DIR} $$CMD_SEP
#should be *.dll *.lib
command += $${COPY_DIR} $${LIB_BUILD_PWD}\\* $${LIB_LIB_DIR} $$CMD_SEP
#move *.dll
command += $${MOVE} $${LIB_LIB_DIR}\\*.dll $${LIB_BIN_DIR}
2018-05-24 14:43:59 +08:00
return ($$command)
}
defineReplace(get_add_linux_sdk) {
2018-05-24 14:43:59 +08:00
#need cd sdk root
copy_command = $$get_copy_dir_and_file($${LIB_SRC_PWD}, "*.h*", $${LIB_INC_DIR})
command =
command += $${copy_command} $$CMD_SEP
#should be *.so.* *.a
command += $$COPY_DIR $${LIB_BUILD_PWD}/* $${LIB_LIB_DIR}
return ($$command)
}
2018-05-26 09:24:11 +08:00
#理论上只要用户设置了Version就能读到Version Major
#add_version里面有初始化版本号所以用户什么都不设置将会是0版本号。
defineReplace(get_add_mac_sdk){
2018-05-24 14:43:59 +08:00
#need cd framework root
#LIB_BUILD_PWD libname libmajorver
libname = $$TARGET
2018-05-26 09:24:11 +08:00
libmajorver = $$VER_MAJ
isEmpty(libmajorver){
error(Have you modifyed add_version.pri, please dont modify it.)
}
#这里的isEmpty没有用。
#isEmpty(libmajorver):libmajorver = $$system(readlink $${LIB_BUILD_PWD}/$${libname}.framework/Versions/Current)
#message($${LIB_BUILD_PWD}/$${libname}.framework/Versions/Current $$TARGET major version $$libmajorver)
2018-05-24 14:43:59 +08:00
LIB_BUNDLE_VER_DIR = Versions/$${libmajorver}
LIB_BUNDLE_CUR_DIR = Versions/Current
LIB_BUNDLE_INC_DIR = $${LIB_BUNDLE_VER_DIR}/Headers
LIB_BUNDLE_RES_DIR = $${LIB_BUNDLE_VER_DIR}/Resources
LIB_BUNDLE_EXE_FILE = $${LIB_BUNDLE_VER_DIR}/$${libname}
LIB_BUNDLE_CUR_INC_DIR = $${LIB_BUNDLE_CUR_DIR}/Headers
LIB_BUNDLE_CUR_RES_DIR = $${LIB_BUNDLE_CUR_DIR}/Resources
LIB_BUNDLE_CUR_EXE_FILE = $${LIB_BUNDLE_CUR_DIR}/$${libname}
LIB_BUNDLE_CUR_LINK = Current
LIB_BUNDLE_INC_LINK = Headers
LIB_BUNDLE_RES_LINK = Resources
LIB_BUNDLE_EXE_LINK = $${libname}
command =
command += $$MK_DIR $$LIB_BUNDLE_VER_DIR $$CMD_SEP
command += $$MK_DIR $$LIB_BUNDLE_INC_DIR $$CMD_SEP
#copy lib
#should be *
command += $$COPY_DIR $${LIB_BUILD_PWD}/$${libname}.framework/$${LIB_BUNDLE_VER_DIR}/* $$LIB_BUNDLE_VER_DIR $$CMD_SEP
#copy header
copy_command = $$get_copy_dir_and_file($${LIB_SRC_PWD}, "*.h*", $${LIB_BUNDLE_INC_DIR})
command += $${copy_command} $$CMD_SEP
#link header current resources
command += $$CD Versions $$CMD_SEP
command += $$LN $${libmajorver} $${LIB_BUNDLE_CUR_LINK} $$CMD_SEP
command += $$CD .. $$CMD_SEP
command += $$LN $$LIB_BUNDLE_CUR_INC_DIR $${LIB_BUNDLE_INC_LINK} $$CMD_SEP
command += $$LN $$LIB_BUNDLE_CUR_RES_DIR $${LIB_BUNDLE_RES_LINK} $$CMD_SEP
command += $$LN $$LIB_BUNDLE_CUR_EXE_FILE $${LIB_BUNDLE_EXE_LINK}
lessThan(QT_MAJOR_VERSION, 5){
command += $$CMD_SEP
command += chmod +x $${THIS_PRI_PWD}/mac_deploy_qt4.sh $$CMD_SEP
command += $${THIS_PRI_PWD}/mac_deploy_qt4.sh $${LIB_BUNDLE_VER_DIR}/$${libname}
2018-05-24 14:43:59 +08:00
}
return ($$command)
}
#这个函数是支持发布Qt Library用的add_sdk用到了。
defineReplace(get_add_Qt_lib_pri){
2018-05-24 14:43:59 +08:00
#need cd sdk root
#LIB_BASE_DIR libname LIB_VERSION MODULE_CNAME
##write qt_lib_qqtcore.pri
command =
command += $$get_empty_file($${LIB_PRI_FILEPATH}) $$CMD_SEP
2018-05-27 16:22:25 +08:00
command += echo "QT.$${libname_lower}.VERSION = $${APP_VERSION}" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
2018-05-24 14:43:59 +08:00
command += echo "QT.$${libname_lower}.name = $${libname}" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT.$${libname_lower}.module = $${libname}" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
2018-05-26 19:43:44 +08:00
contains(QSYS_PRIVATE, Win32|Windows|Win64) {
2018-05-24 14:43:59 +08:00
command += echo "QT.$${libname_lower}.libs = \$$QT_MODULE_LIB_BASE" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT.$${libname_lower}.bins = \$$QT_MODULE_BIN_BASE" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
} else {
command += echo "QT.$${libname_lower}.libs = '\$$QT_MODULE_LIB_BASE'" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT.$${libname_lower}.bins = '\$$QT_MODULE_BIN_BASE'" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
}
2018-05-26 19:43:44 +08:00
contains(QSYS_PRIVATE, Win32|Windows|Win64) {
2018-05-24 14:43:59 +08:00
command += echo "QT.$${libname_lower}.includes = \$$QT_MODULE_INCLUDE_BASE \$$QT_MODULE_INCLUDE_BASE/$${libname}" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT.$${libname_lower}.frameworks = " >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT.$${libname_lower}.module_config = v2 " >> $${LIB_PRI_FILEPATH} $$CMD_SEP
}else:equals(QSYS_PRIVATE, macOS) {
command += echo "QT.$${libname_lower}.includes = '\$$QT_MODULE_LIB_BASE/$${libname}.framework/Headers'" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT.$${libname_lower}.frameworks = '\$$QT_MODULE_LIB_BASE'" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT.$${libname_lower}.module_config = v2 lib_bundle" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
} else {
command += echo "QT.$${libname_lower}.includes = '\$$QT_MODULE_INCLUDE_BASE \$$QT_MODULE_INCLUDE_BASE/$${libname}'" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT.$${libname_lower}.frameworks = " >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT.$${libname_lower}.module_config = v2 " >> $${LIB_PRI_FILEPATH} $$CMD_SEP
}
greaterThan(QT_MAJOR_VERSION, 4):{
command += echo "QT.$${libname_lower}.depends = core sql network gui xml widgets" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
} else {
command += echo "QT.$${libname_lower}.depends = core sql network gui xml" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
}
command += echo "QT.$${libname_lower}.uses =" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT.$${libname_lower}.DEFINES = LIB_LIBRARY" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT.$${libname_lower}.enabled_features =" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT.$${libname_lower}.disabled_features =" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT_CONFIG +=" >> $${LIB_PRI_FILEPATH} $$CMD_SEP
command += echo "QT_MODULES += $${libname_lower}" >> $${LIB_PRI_FILEPATH}
return ($$command)
}
################################################
##Lib deploy sdk workflow
##SDK发布过程
################################################
defineReplace(get_add_sdk_work_flow){
2018-05-24 14:43:59 +08:00
#need cd sdk root
libname = $$TARGET
libname_lower = $$lower($${libname})
command =
contains(QSYS_PRIVATE, macOS) {
#在编译路径里创作一次sdk完成framework链接等的修复工作
command += $$get_add_mac_sdk_fix_building_framework() $$CMD_SEP
2018-05-26 09:24:11 +08:00
#command += echo $$libname fix framework success. $$CMD_SEP
}
2018-05-24 14:43:59 +08:00
command += $$RM_DIR $${LIB_SDK_PWD} $$CMD_SEP
command += $$MK_DIR $${LIB_SDK_PWD} $$CMD_SEP
command += $$CD $${LIB_SDK_PWD} $$CMD_SEP
command += $$get_add_sdk_dir_struct() $$CMD_SEP
2018-05-24 14:43:59 +08:00
#这里不是目标为Windows才拷贝而是开发机是Windows就得这么拷贝。
#Windows下Win目标、Android目标都走这里。
2018-05-26 19:43:44 +08:00
#contains(QSYS_PRIVATE, Win32|Windows|Win64) {
2018-05-24 14:43:59 +08:00
equals(QMAKE_HOST.os, Windows) {
#message(create lib windows struct library)
command += $$get_add_windows_sdk() $$CMD_SEP
2018-05-24 14:43:59 +08:00
command += $$COPY $${LIB_BUILD_PWD}\\*.prl lib $$CMD_SEP
} else {
contains(QSYS_PRIVATE, macOS) {
#message(create lib mac bundle framework)
2018-05-24 14:43:59 +08:00
command += $$MK_DIR lib/$${libname}.framework $$CMD_SEP
command += $$CD lib/$${libname}.framework $$CMD_SEP
command += $$get_add_mac_sdk() $$CMD_SEP
2018-05-24 14:43:59 +08:00
command += $$CD ../../ $$CMD_SEP
#create prl
command += $$COPY $${LIB_BUILD_PWD}/$${libname}.framework/$${libname}.prl lib/$${libname}.framework/$${libname}.prl $$CMD_SEP
} else {
#Android在linux开发机下也会走这里Android目标Lib可以发布Win和Linux两种格式的SDK。
#message(create lib linux struct library)
command += $$get_add_linux_sdk() $$CMD_SEP
2018-05-24 14:43:59 +08:00
command += $$COPY $${LIB_BUILD_PWD}/*.prl lib $$CMD_SEP
}
}
2018-05-26 09:24:11 +08:00
command += $$get_add_Qt_lib_pri()
#$$CMD_SEP
#command += echo $$libname create sdk success.
2018-05-24 14:43:59 +08:00
return ($$command)
}
################################################
##Lib deploy sdk work flow
##初始化SDK发布过程需要的变量
################################################
defineReplace(get_add_sdk_private){
2018-05-24 14:43:59 +08:00
libname = $$TARGET
libname_lower = $$lower($${libname})
#qqt defined these dir struct, used from qt library
LIB_INC_DIR = include/$${libname}
LIB_BIN_DIR = bin
2018-05-24 14:43:59 +08:00
LIB_LIB_DIR = lib
LIB_CMAKE_DIR=lib/cmake/$${libname}
LIB_PRI_PATH=mkspecs/modules
LIB_PRI_FILEPATH=$${LIB_PRI_PATH}/qt_lib_$${libname_lower}.pri
#不仅仅发布目标为Windows的时候需要改变
#开发Host是Windows的时候都要改变。路径问题是两种操作系统固有的痛。
2018-05-26 19:43:44 +08:00
#contains(QSYS_PRIVATE, Win32|Windows|Win64) {
2018-05-24 14:43:59 +08:00
equals(QMAKE_HOST.os, Windows) {
#on windows every path must use \ sep.
LIB_SRC_PWD~=s,/,\\,g
LIB_BUILD_PWD~=s,/,\\,g
LIB_SDK_PWD~=s,/,\\,g
LIB_INC_DIR~=s,/,\\,g
LIB_BIN_DIR = bin
2018-05-24 14:43:59 +08:00
LIB_LIB_DIR = lib
LIB_CMAKE_DIR~=s,/,\\,g
LIB_PRI_PATH~=s,/,\\,g
LIB_PRI_FILEPATH~=s,/,\\,g
#ignored
HEADERS_WIN=$${HEADERS}
HEADERS_WIN~=s,/,\\,g
#on windows, copy all *.h*, include closed feature header.
#qmake regexp use perl grammer
#HEADERS_WIN~=s/[d ]+/h+/g how to mod space to +
}
#create library struct
#create platform sdk
#create mkspec module pri
command = $$get_add_sdk_work_flow()
2018-05-24 14:43:59 +08:00
#message ($$command)
return ($${command})
}
2018-05-24 14:43:59 +08:00
################################################
##用户调用的函数
################################################
2018-05-25 22:47:08 +08:00
#依赖 libname libsrcdir libdstdir
2018-05-24 14:43:59 +08:00
defineTest(add_sdk){
#isEmpty(1):error(add_sdk(libname, libsrcdir, libdstdir) need at last one argument)
contains(QSYS_PRIVATE, macOS) {
2018-05-24 20:03:03 +08:00
#equals(APP_MAJOR_VERSION, 0):message(add_sdk(libname, libsrcdir, libdstdir) macos app major version is "0," have you setted it?)
2018-05-24 14:43:59 +08:00
}
2018-05-28 00:21:30 +08:00
libname = $$1
isEmpty(1):libname = $$TARGET
2018-05-24 14:43:59 +08:00
libname_lower = $$lower($${libname})
#LIB std dir is not same to app std dir
LIB_STD_DIR = $${libname}/$${QSYS_STD_DIR}
#create platform sdk need this
#源代码目录
LIB_SRC_PWD=$$2
2018-05-24 20:03:03 +08:00
isEmpty(2):LIB_SRC_PWD=$${PWD}
2018-05-24 14:43:59 +08:00
2018-05-28 00:21:30 +08:00
#编译目标位置
LIB_DST_DIR=$$DESTDIR
!isEmpty(3):LIB_DST_DIR = $$3
2018-05-24 14:43:59 +08:00
#need use qqt subdir proj
LIB_BUILD_PWD=$${APP_BUILD_ROOT}/$${LIB_STD_DIR}
!isEmpty(LIB_DST_DIR):LIB_BUILD_PWD=$${LIB_BUILD_PWD}/$${LIB_DST_DIR}
#sdk path
LIB_SDK_PWD = $${LIB_SDK_ROOT}/$${LIB_STD_DIR}
#message(QQt sdk install here:$${LIB_SDK_PWD})
#这里不仅仅目标为windows的时候才会转换
#开发Host为Windows的时候都要转换。
2018-05-26 19:43:44 +08:00
#contains(QSYS_PRIVATE, Win32|Windows||Win64) {
2018-05-24 14:43:59 +08:00
equals(QMAKE_HOST.os, Windows) {
APP_BUILD_ROOT~=s,/,\\,g
LIB_SDK_ROOT~=s,/,\\,g
APP_DEPLOY_ROOT~=s,/,\\,g
QSYS_STD_DIR~=s,/,\\,g
LIB_STD_DIR~=s,/,\\,g
LIB_DST_DIR~=s,/,\\,g
LIB_BUILD_PWD~=s,/,\\,g
LIB_SDK_PWD~=s,/,\\,g
}
command += $$get_add_sdk_private()
2018-05-25 20:03:31 +08:00
#message($$command)
!isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK += $$CMD_SEP
2018-05-24 14:43:59 +08:00
QMAKE_POST_LINK += $$command
export(QMAKE_POST_LINK)
return (1)
}
2018-05-26 14:49:18 +08:00
#依赖 libname libsrcdir libdstdir
2018-05-28 00:21:30 +08:00
#添加一个参数 subdirs列表 包含subdirs层 子文件夹层 说的是build路径比较深的情况
2018-05-26 14:49:18 +08:00
#TARGET
#PWD
#DESTDIR
#sub层列表 从头到尾 如果为空则等于add_sdk()
#支持Qt5不支持Qt4. Qt4 qmake比较落后。
2018-05-28 00:21:30 +08:00
defineTest(add_sdk_from_subdirs){
2018-05-26 14:49:18 +08:00
#isEmpty(1):error(add_subdir_sdk(libname, libsrcdir, libdstdir) need at last one argument)
contains(QSYS_PRIVATE, macOS) {
#equals(APP_MAJOR_VERSION, 0):message(add_sdk(libname, libsrcdir, libdstdir) macos app major version is "0," have you setted it?)
}
libname=$$1
isEmpty(1):libname = $$TARGET
libname_lower = $$lower($${libname})
#LIB std dir is not same to app std dir
LIB_STD_DIR = $${libname}/$${QSYS_STD_DIR}
#create platform sdk need this
#源代码目录
LIB_SRC_PWD=$$2
isEmpty(2):LIB_SRC_PWD=$${PWD}
#编译目标相对位置
LIB_DST_DIR=$$3
isEmpty(3):LIB_DST_DIR = $$DESTDIR
#编译目录的完全位置
LIB_BUILD_PWD=
isEmpty(4){
#add sdk level
LIB_BUILD_PWD=$${APP_BUILD_ROOT}/$${LIB_STD_DIR}
!isEmpty(LIB_DST_DIR):LIB_BUILD_PWD=$${LIB_BUILD_PWD}/$${LIB_DST_DIR}
} else {
#sub dir level
LIB_SUBDIR_LIST=$$4
first_value = $$first(LIB_SUBDIR_LIST)
LIB_BUILD_PWD=$${APP_BUILD_ROOT}/$${first_value}/$${QSYS_STD_DIR}
LIB_SUBDIR_LIST -= $$first_value
for(dir, LIB_SUBDIR_LIST) {
LIB_BUILD_PWD=$${LIB_BUILD_PWD}/$${dir}
}
LIB_BUILD_PWD=$${LIB_BUILD_PWD}/$${TARGET}
!isEmpty(LIB_DST_DIR):LIB_BUILD_PWD=$${LIB_BUILD_PWD}/$${LIB_DST_DIR}
}
#sdk path
LIB_SDK_PWD = $${LIB_SDK_ROOT}/$${LIB_STD_DIR}
#message($${TARGET} sdk install here:$${LIB_SDK_PWD})
#这里不仅仅目标为windows的时候才会转换
#开发Host为Windows的时候都要转换。
2018-05-26 19:43:44 +08:00
#contains(QSYS_PRIVATE, Win32|Windows||Win64) {
2018-05-26 14:49:18 +08:00
equals(QMAKE_HOST.os, Windows) {
APP_BUILD_ROOT~=s,/,\\,g
LIB_SDK_ROOT~=s,/,\\,g
APP_DEPLOY_ROOT~=s,/,\\,g
QSYS_STD_DIR~=s,/,\\,g
LIB_STD_DIR~=s,/,\\,g
LIB_DST_DIR~=s,/,\\,g
LIB_BUILD_PWD~=s,/,\\,g
LIB_SDK_PWD~=s,/,\\,g
}
command += $$get_add_sdk_private()
#message($$command)
!isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK += $$CMD_SEP
QMAKE_POST_LINK += $$command
export(QMAKE_POST_LINK)
return (1)
}
2018-05-24 14:43:59 +08:00
#if you want to use QQt with QT += QQt please open this feature
#unimplete: CONFIG += add_sdk_to_Qt
defineTest(add_sdk_to_Qt){
libname=QQt
#LIB_BUILD_PWD
LIB_SDK_PWD=$$[QT_INSTALL_DATA]
message(QQt sdk install here:$${LIB_SDK_PWD})
return (1)
}