qt creator源码全方面分析(3-6)

目录

  • qtcreatorplugin.pri

    • 使用实例
    • 上半部
    • 下半部
    • 结果

qtcreatorplugin.pri

上一节我们介绍了qtcreatorlibrary.pri,现在我们介绍qtcreatorplugin.pri,其实插件的本质也是动态库,所以qtcreatorplugin.pri实现的内容和功能与qtcreatorlibrary.pri差不多。

使用实例

和上一节一样,为了分析这个文件,我们也再找个使用该pri的例子,源目录\src\plugins\cppeditor\cppeditor.pro。

DEFINES += CPPEDITOR_LIBRARY
include(../../qtcreatorplugin.pri)
...

以及依赖项,源目录\src\libs\cplusplus\cppeditor_dependencies.pri。

QTC_PLUGIN_NAME = CppEditor
QTC_LIB_DEPENDS +=     extensionsystem     utils     cplusplus
QTC_PLUGIN_DEPENDS +=     texteditor     coreplugin     cpptools     projectexplorer
QTC_TEST_DEPENDS +=     qmakeprojectmanager

这里我们也可以看见,设置了插件名QTC_PLUGIN_NAME,依赖的库名QTC_LIB_DEPENDS和依赖的插件名QTC_PLUGIN_DEPENDS,这在qtcreator.pri中解析依赖时会用到的。

上半部

depfile = $$replace(_PRO_FILE_PWD_, ([^/]+$), \\1/\\1_dependencies.pri)
exists($$depfile) {
    include($$depfile)
    isEmpty(QTC_PLUGIN_NAME):         error("$$basename(depfile) does not define QTC_PLUGIN_NAME.")
} else {
    isEmpty(QTC_PLUGIN_NAME):         error("QTC_PLUGIN_NAME is empty. Maybe you meant to create $$basename(depfile)?")
}
TARGET = $$QTC_PLUGIN_NAME

plugin_deps = $$QTC_PLUGIN_DEPENDS
plugin_test_deps = $$QTC_TEST_DEPENDS
plugin_recmds = $$QTC_PLUGIN_RECOMMENDS

include(../qtcreator.pri)

defineReplace(dependencyName) {
    dependencies_file =
    for(dir, QTC_PLUGIN_DIRS) {
        exists($$dir/$$1/$${1}_dependencies.pri) {
            dependencies_file = $$dir/$$1/$${1}_dependencies.pri
            break()
        }
    }
    isEmpty(dependencies_file):         error("Plugin dependency $$dep not found")
    include($$dependencies_file)
    return($$QTC_PLUGIN_NAME)
}

# for substitution in the .json
dependencyList =
for(dep, plugin_deps) {
    dependencyList += "        { \"Name\" : \"$$dependencyName($$dep)\", \"Version\" : \"$$QTCREATOR_VERSION\" }"
}
for(dep, plugin_recmds) {
    dependencyList += "        { \"Name\" : \"$$dependencyName($$dep)\", \"Version\" : \"$$QTCREATOR_VERSION\", \"Type\" : \"optional\" }"
}
for(dep, plugin_test_deps) {
    dependencyList += "        { \"Name\" : \"$$dependencyName($$dep)\", \"Version\" : \"$$QTCREATOR_VERSION\", \"Type\" : \"test\" }"
}
dependencyList = $$join(dependencyList, ",$$escape_expand(\\n)")

dependencyList = "\"Dependencies\" : [$$escape_expand(\\n)$$dependencyList$$escape_expand(\\n)    ]"

# use gui precompiled header for plugins by default
isEmpty(PRECOMPILED_HEADER):PRECOMPILED_HEADER = $$PWD/shared/qtcreator_gui_pch.h

isEmpty(USE_USER_DESTDIR) {
    DESTDIR = $$IDE_PLUGIN_PATH
} else {
    win32 {
        DESTDIRAPPNAME = "qtcreator"
        DESTDIRBASE = "$$(LOCALAPPDATA)"
        isEmpty(DESTDIRBASE):DESTDIRBASE="$$(USERPROFILE)\Local Settings\Application Data"
    } else:macx {
        DESTDIRAPPNAME = "Qt Creator"
        DESTDIRBASE = "$$(HOME)/Library/Application Support"
    } else:unix {
        DESTDIRAPPNAME = "qtcreator"
        DESTDIRBASE = "$$(XDG_DATA_HOME)"
        isEmpty(DESTDIRBASE):DESTDIRBASE = "$$(HOME)/.local/share/data"
        else:DESTDIRBASE = "$$DESTDIRBASE/data"
    }
    DESTDIR = "$$DESTDIRBASE/QtProject/$$DESTDIRAPPNAME/plugins/$$QTCREATOR_VERSION"
}
LIBS += -L$$DESTDIR
INCLUDEPATH += $$OUT_PWD

# copy the plugin spec
isEmpty(TARGET) {
    error("qtcreatorplugin.pri: You must provide a TARGET")
}

PLUGINJSON = $$_PRO_FILE_PWD_/$${TARGET}.json
PLUGINJSON_IN = $${PLUGINJSON}.in
exists($$PLUGINJSON_IN) {
    DISTFILES += $$PLUGINJSON_IN
    QMAKE_SUBSTITUTES += $$PLUGINJSON_IN
    PLUGINJSON = $$OUT_PWD/$${TARGET}.json
} else {
    # need to support that for external plugins
    DISTFILES += $$PLUGINJSON
}
  1. 第一部分实现的内容和qtcreatorlibrary.pri中的一样,

    1. 根据pro文件名获取对应的依赖文件,进行包含。这里只是多了个文件存在性判断,以及插件名是否设置判断。
    2. 设置插件文件名。
    3. 加载qtcreator.pri。
  2. 定义了替换函数dependencyName。

    代码和qtcreator.pri文件最后的递归解决插件依赖几乎一样。区别在于这里只分析了当前依赖的插件,而不是继续递归往下。

  3. 实现插件元数据的依赖信息替换。

    我们在Plugin Meta Data已经介绍过Dependencies键,示例如下:

    "Dependencies" : [
              { "Name" : "SomeOtherPlugin", "Version" : "2.3.0_2" },
              { "Name" : "EvenOther", "Version" : "1.0.0" }
    ]
    

    这里很明显,把依赖信息填充到dependencyList对象中。

  4. 添加预编译头文件。和qtcreatorlibrary.pri一样。
  5. 设置目标文件夹,并添加库和包含路径。

    win32系统下,有两个输出路径,一个为构建目录/lib/qtcreator/plugin,一个为用户路径,譬如C:/Users/codeForFamily/AppData/Local/QtProject/qtcreator/plugins/4.6.2。我们在Creating Your First Plugin的"部署到列表"中就提到过。

  6. *.json.in编译为*.json

    获取插件目录下的json.in文件。其实就是插件元数据的模板。

    {
        \"Name\" : \"CppEditor\",
        \"Version\" : \"$$QTCREATOR_VERSION\",
        ...
        $$dependencyList
    }
    

    并设置QMAKE_SUBSTITUTES对json.in文件进行变量替换,生成json文件。这种用法我们在qtcreator.pri中已经介绍过。

    {
        "Name" : "CppEditor",
        "Version" : "4.6.2",
        ...
        "Dependencies" : [
            { "Name" : "TextEditor", "Version" : "4.6.2" },
            { "Name" : "Core", "Version" : "4.6.2" },
            { "Name" : "CppTools", "Version" : "4.6.2" },
            { "Name" : "ProjectExplorer", "Version" : "4.6.2" },
            { "Name" : "QmakeProjectManager", "Version" : "4.6.2", "Type" : "test" }
        ]
    }
    

    该json文件最终输出到OUT_PWD目录,这也是步骤5中为什么要包含OUT_PWD路径的原因。

下半部


osx {
    QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/PlugIns/
    QMAKE_LFLAGS += -compatibility_version $$QTCREATOR_COMPAT_VERSION
}
include(rpath.pri)

contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols

TEMPLATE = lib
CONFIG += plugin plugin_with_soname
linux*:QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF

target.path = $$INSTALL_PLUGIN_PATH
INSTALLS += target

TARGET = $$qtLibraryTargetName($$TARGET)

这部分内容和qtcreatorlibrary.pri几乎一样。不再介绍。

结果

qtcreatorplugin.pri与qtcreatorlibrary.pri的主要区别,就在于多了生成dependencyList,以及json.in文件转为json文件这两部分。



原创造福大家,共享改变世界

献出一片爱心,温暖作者心灵



qt creator源码全方面分析(3-6)

原文地址:https://www.cnblogs.com/codeForFamily/p/qt-creator-ide-source-learn-3-6.html

时间: 2024-10-08 06:55:08

qt creator源码全方面分析(3-6)的相关文章

qt creator源码全方面分析(2-10-5)

目录 The Plugin Manager, the Object Pool, and Registered Objects 插件管理器 对象池和已注册对象 The Plugin Manager, the Object Pool, and Registered Objects 通常,插件不需要直接访问插件管理器. 交互主要间接的通过ExtensionSystem::IPlugin接口. 在某些情况下,则必须使用插件管理器API. 插件需要访问插件管理器的对象池,以扩展Qt Creator的某些方

qt creator源码全方面分析(2-0)

目录 Extending Qt Creator Manual 生成领域特定的代码和模板 代码片段 文件和项目模板 自定义向导 支持其他文件类型 MIME类型 高亮和缩进 自定义文本编辑器 其他自定义编辑器 运行外部工具 简单的外部工具 复杂的外部工具 所有主题 Extending Qt Creator Manual Qt Creator是为Qt开发人员的需求量身定制的跨平台集成开发环境(IDE). Qt Creator可以通过多种方式扩展. 例如,Qt Creator架构基于插件加载器,这意味着

qt creator源码全方面分析(2-10)

目录 Creating Plugins Creating Plugins Qt Creator的核心是一个插件加载程序,加载并运行一组插件,实际上是这些插件提供了您从Qt Creator IDE中了解的功能.甚至应用程序主窗口和菜单都由插件提供的.插件使用不同的方式,供其他插件访问本插件的功能,并允许它们扩展应用程序的某些方面. 例如,Core插件是Qt Creator完全运行所必须具备的非常基本的插件,它提供了主窗口,以及相关API,用于添加菜单项,模式,编辑器类型,导航面板和许多其他内容.

qt creator源码全方面分析(3-8)

目录 项目文件工作流程 多层目录模式 依赖解析模式 包含,链接和输出 包含 链接 输出 构建目录架构 项目文件工作流程 我们在前面已经讨论了所有的项目文件, qtcreator.pro qtcreator.pri qtcreatordata.pri qtcreatorlibrary.pri qtcreatorplugin.pri qtcreatortool.pri 下面我们再从头到尾来捋一遍. 多层目录模式 我们可以看到,所有的*.pro文件中,除了最底层的子项目.都采用TEMPLATE和SUB

qt creator源码全方面分析(4)

前置基础介绍 在继续我们的源码学习之前,我们在这里花费一章节来学习一些基础的编码范式. 这些编码范式在后面的几乎所有的源码中都会用到.因此,在这里提前进行介绍. 一方面,有助于理解源码,另一方面,也可以用到自己的日常编码中. 原创造福大家,共享改变世界 献出一片爱心,温暖作者心灵 qt creator源码全方面分析(4) 原文地址:https://www.cnblogs.com/codeForFamily/p/qt-creator-ide-source-learn-4.html

qt creator源码全方面分析(2)

目录 doc文件夹 帮助文档 qdoc工具 doxygen工具 配置文件 qtcreator-project.qdocconf qtcreator-developer.qdocconf doc文件夹 对于bin和dist文件夹这里就不做过多的介绍了.我们首先来重点关注doc文件夹.对于理解源码,帮助文档总是能起到非常有效的作用.其实,我们在第一章<目录介绍>中已经对doc文件夹进行了一个大概的介绍. 帮助文档 帮助文档的来源有两个组成部分: 源代码中的注释 qdoc文件 两者都采用一定约束规范

qt creator源码全方面分析(2-3)

目录 External Tool Specification Files 文件名 位置 文件格式 主要标签 描述标签 可执行规范标签 示例 External Tool Specification Files 外部工具规范文件描述了可以从工具>外部菜单运行的工具. 它指定工具的名称,要运行的可执行文件,可选参数以及如何处理工具的输出. 文件名 <yourtoolname>.xml 位置 用户指定工具位于Mac和Linux上的$HOME/.config/QtProject/qtcreator

qt creator源码全方面分析(2-2)

目录 Common Extension Tasks Common Extension Tasks 本节总结了可用于将UI组件添加到Qt Creator的API函数. 任务 详细 API 添加菜单或菜单项 你可以扩展现有菜单或者创建一个新的菜单 Core::ActionManager, Core::Command 添加可配置的键盘快捷方式 注册快捷方式,使用户可以在通用快捷方式设置对话框中对其进行配置 Core::ActionManager, Core::Command 添加一个模式 模式对应于完

qt creator源码全方面分析(2-10-2)

目录 Creating Your First Plugin 创建一个插件项目 构建并运行插件 文件结构 qmake项目 插件元数据模板 插件类 头文件 源文件 Creating Your First Plugin 本节介绍,如何使用Qt Creator提供的插件模板,来创建Qt Creator插件,并获取对插件的组成和结构的第一印象. 创建一个插件项目 Qt Creator附带了一个创建Qt Creator插件的向导,该向导会为您创建一个可运行的最小插件.我们强烈建议您使用两个不同的Qt Cre