qmake 3.1(Qt 5.14.0使用)用户手册7——qmake语言

许多qmake项目文件使用“名称=值”和“名称+=值”定义的列表来简单描述项目使用的源文件和头文件。 qmake还提供了其他运算符,函数和域,可用于处理变量声明中提供的信息。 这些高级功能允许从单个项目文件为多个平台生成Makefile。

操作符

在许多项目文件中,赋值(=)和追加(+=)运算符可用于包括有关项目的所有信息。 典型的使用模式是为变量分配值列表,并根据各种测试的结果附加更多值。 由于qmake使用默认值定义某些变量,因此有时有必要使用remove(-=)运算符过滤掉不需要的值。 以下各节描述如何使用运算符来操纵变量的内容。

赋值

=运算符为变量分配一个值:

  TARGET = myapp

上一行将TARGET变量设置为myapp。 这将覆盖先前使用myapp为TARGET设置的任何值。

追加值

+=运算符将新值附加到变量的值列表中:

  DEFINES += USE_MY_STUFF

上一行将USE_MY_STUFF追加到要预处理程序定义列表中。预处理器定义列表中的值将用于生成Makefile文件。

去除价值

-=运算符从变量的值列表中删除一个值:

  DEFINES -= USE_MY_STUFF

上一行从预处理器定义列表中删除了USE_MY_STUFF。预处理器定义列表中的值将用于生成Makefile文件。

添加唯一值

*=运算符将一个值添加到变量的值列表中,但前提是其尚不存在变量的值列表中。 这样可以防止将值多次包含在变量中。 例如:

  DEFINES *= USE_MY_STUFF

在上一行中,如果尚未定义USE_MY_STUFF,则只会将其添加到预处理器定义列表中。 请注意,unique()函数还可用于确保变量仅包含每个值的一个实例。

替换值

〜=运算符将所有与正则表达式匹配的值替换为指定的值:

  DEFINES ~= s/QT_[DT].+/QT

在上一行中,列表中以QT_D或QT_T开头的任何值都将替换为QT。

变量扩展

$$运算符用于提取变量的内容,并可用于在变量之间传递值或将其提供给函数:

  EVERYTHING = $$SOURCES $$HEADERS
  message("The project contains the following files:")
  message($$EVERYTHING)

变量可用于存储环境变量的内容。 可以在运行qmake时对其进行扩展,或者在生成项目时将其包含在生成的Makefile中进行扩展。

要在运行qmake时获取环境变量的内容,请使用$$(...)运算符:

  DESTDIR = $$(PWD)
  message(The project will be installed in $$DESTDIR)

在上述设置中,当处理项目文件时,将读取PWD环境变量的值。

要在处理生成的Makefile时获取环境值的内容,请使用$(...)运算符:

  DESTDIR = $$(PWD)
  message(The project will be installed in $$DESTDIR)

  DESTDIR = $(PWD)
  message(The project will be installed in the value of PWD)
  message(when the Makefile is processed.)

在上面的设置中,当处理项目文件时,立即读取PWD的值,但是在生成的Makefile中将$(PWD)分配给DESTDIR。 只要在处理Makefile时正确设置了环境变量,构建过程就会更加灵活。

访问qmake属性

特殊的$$ [...]运算符可用于访问qmake属性:

  message(Qt version: $$[QT_VERSION])
  message(Qt is installed in $$[QT_INSTALL_PREFIX])
  message(Qt resources can be found in the following locations:)
  message(Documentation: $$[QT_INSTALL_DOCS])
  message(Header files: $$[QT_INSTALL_HEADERS])
  message(Libraries: $$[QT_INSTALL_LIBS])
  message(Binary files (executables): $$[QT_INSTALL_BINS])
  message(Plugins: $$[QT_INSTALL_PLUGINS])
  message(Data files: $$[QT_INSTALL_DATA])
  message(Translation files: $$[QT_INSTALL_TRANSLATIONS])
  message(Settings: $$[QT_INSTALL_CONFIGURATION])
  message(Examples: $$[QT_INSTALL_EXAMPLES])

有关更多信息,请参见配置qmake。
该操作符可访问的属性通常用于使第三方插件和组件能够集成到Qt中。 例如,如果在其项目文件中进行了以下声明,则可以将Qt Designer插件与Qt Designer的内置插件一起安装:

  target.path = $$[QT_INSTALL_PLUGINS]/designer
  INSTALLS += target

 范围
范围类似于过程编程语言中的if语句。 如果满足某个条件,则将处理范围内的声明。
范围语法
范围由条件组成,后跟同一行的右括号,一系列命令和定义以及新行的右括号:

  <condition> {
      <command or definition>
      ...
  }

开括号必须写在与条件相同的行上。 范围可以串联起来,以包含多个条件,如以下各节所述。
范围和条件
范围被写为条件,后跟一对大括号中包含的一系列声明。 例如:

  win32 {
      SOURCES += paintwidget_win.cpp
  }

在为Windows平台构建时,以上代码会将paintwidget_win.cpp文件添加到生成的Makefile中列出的源中。 当为其他平台构建时,定义将被忽略。
给定范围中使用的条件也可以取反,以提供一组替代声明,仅当原始条件为false时才进行处理。 例如,要为除Windows以外的所有平台构建内容时进行处理,请取消范围,如下所示:

  !win32 {
      SOURCES -= paintwidget_win.cpp
  }

范围可以嵌套以合并多个条件。 例如,要仅在启用调试的情况下为特定平台包括特定文件,请编写以下内容:

  macx {
      CONFIG(debug, debug|release) {
          HEADERS += debugging.h
      }
  }

要节省编写许多嵌套范围的工作,可以使用:运算符来嵌套范围。 上例中的嵌套作用域可以通过以下方式重写:

  macx:CONFIG(debug, debug|release) {
      HEADERS += debugging.h
  }

您也可以使用:运算符来执行单行条件分配。 例如:

  win32:DEFINES += USE_MY_STUFF

上一行仅在为Windows平台构建时才将USE_MY_STUFF添加到DEFINES变量中。 通常,:运算符的行为类似于逻辑AND运算符,将多个条件结合在一起,并且要求所有条件都为真。
还有| 运算符的行为类似于逻辑OR运算符,将多个条件结合在一起,并且仅要求其中一个为真。

  win32|macx {
      HEADERS += debugging.h
  }

您还可以使用else范围为范围内的对象提供替代声明。 如果先前范围的条件为false,则处理其他每个范围。 与其他合并范围结合使用时,这可以使您编写复杂的测试(如上所述,由:运算符分隔)。 例如:

  win32:xml {
      message(Building for Windows)
      SOURCES += xmlhandler_win.cpp
  } else:xml {
      SOURCES += xmlhandler.cpp
  } else {
      message("Unknown configuration")
  }

 
配置和范围
qmake专门处理CONFIG变量中存储的值。 每个可能的值都可以用作范围的条件。 例如,可以使用opengl值扩展由CONFIG保留的值的列表:

  CONFIG += opengl

作为此操作的结果,将处理所有测试opengl的范围。 我们可以使用此功能为最终可执行文件指定适当的名称:

  opengl {
      TARGET = application-gl
  } else {
      TARGET = application
  }

通过此功能,可以轻松更改项目的配置,而不会丢失特定配置可能需要的所有自定义设置。在上面的代码中,第一个作用域中的声明被处理,最终的可执行文件称为application-gl。但是,如果未指定opengl,则将处理第二个作用域中的声明,最终的可执行文件将称为application。
由于可以在CONFIG行上放置自己的值,因此这为您提供了一种方便的方法来自定义项目文件并微调生成的Makefile。
平台范围值
除了在许多范围条件下使用的win32,macx和unix值之外,还可以使用范围测试各种其他内置平台和特定于编译器的值。这些基于Qt的mkspecs目录中提供的平台规范。例如,项目文件中的以下几行显示了当前使用的规范,并测试了linux-g ++规范:

  message($$QMAKESPEC)

  linux-g++ {
      message(Linux)
  }

您可以测试任何其他平台-编译器组合,只要在mkspecs目录中存在针对它的规范即可。
变数
项目文件中使用的许多变量是qmake生成Makefile时使用的特殊变量,例如DEFINES,SOURCES和HEADERS。 另外,您可以创建自己使用的变量。 当qmake遇到给该名称的赋值时,它将使用给定名称创建新变量。 例如:

  MY_VARIABLE = value

您对自己的变量执行的操作没有任何限制,因为qmake会忽略它们,除非在处理范围时需要评估它们。
您还可以通过在变量名称前添加$$来将当前变量的值分配给另一个变量。 例如:

  MY_DEFINES = $$DEFINES

现在,MY_DEFINES变量包含了项目文件中此时DEFINES变量中的内容。 这也等效于:

  MY_DEFINES = $${DEFINES}

第二种表示法允许您将变量的内容附加到另一个值,而不用空格将两者分开。 例如,以下内容将确保为最终的可执行文件指定一个名称,其中包括正在使用的项目模板:

  TARGET = myproject_$${TEMPLATE}


 替换功能
qmake提供了一些内置函数,以允许处理变量的内容。 这些函数处理提供给它们的参数,并返回一个值或值列表。 要将结果分配给变量,可以将$$运算符与此类函数一起使用,就像将一个变量的内容分配给另一个一样:

  HEADERS = model.h
  HEADERS += $$OTHER_HEADERS
  HEADERS = $$unique(HEADERS)

此类函数应在赋值的右侧使用(即,作为操作数)。
您可以定义自己的函数来处理变量的内容,如下所示:

  defineReplace(functionName){
      #function code
  }

以下示例函数将变量名作为唯一参数,使用内置函数eval()从变量中提取值列表,并编译文件列表: 

defineReplace(headersAndSources) {
      variable = $$1
      names = $$eval($$variable)
      headers =
      sources =

      for(name, names) {
          header = $${name}.h
          exists($$header) {
              headers += $$header
          }
          source = $${name}.cpp
          exists($$source) {
              sources += $$source
          }
      }
      return($$headers $$sources)
  }

测试功能
qmake提供了内置函数,可以在编写范围时用作条件。 这些函数不返回值,而是指示成功或失败:

  count(options, 2) {
      message(Both release and debug specified.)
  }

此类函数应仅在条件表达式中使用。
可以定义自己的功能以提供范围条件。 以下示例测试列表中的每个文件是否存在,如果全部存在,则返回true,否则返回false:

  defineTest(allFiles) {
      files = $$ARGS

      for(file, files) {
          !exists($$file) {
              return(false)
          }
      }
      return(true)
  }
发布了21 篇原创文章 · 获赞 0 · 访问量 1162

猜你喜欢

转载自blog.csdn.net/xuyouqiang1987/article/details/104082513