如何使用Cmake修复重复的目标?

gzjq41n4  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(178)

我目前正在尝试从GitHubLink安装gr-matchstiq,遇到了问题。代码不再符合CMake的标准。
具体来说,cmake 2.6引入了逻辑目标名称必须唯一的策略(请参阅:CMP0002)。然而,目标“ALL”被重复使用。我相信是这样的,因为我得到的错误:

$ cmake -Wno-dev ../
-- Build type not specified: defaulting to release.
Traceback (most recent call last):
  File "<string>", line 2, in <module>
TypeError: Strings must be encoded before hashing
Traceback (most recent call last):
  File "<string>", line 2, in <module>
TypeError: Strings must be encoded before hashing
CMake Error at cmake/Modules/GrPython.cmake:115 (add_custom_target):
  add_custom_target cannot create target "ALL" because another target with
  the same name already exists.  The existing target is a custom target
  created in source directory "/home/me/Projects/gr-matchstiq/swig".
  See documentation for policy CMP0002 for more details.
Call Stack (most recent call first):
  cmake/Modules/GrPython.cmake:214 (GR_UNIQUE_TARGET)
  python/CMakeLists.txt:31 (GR_PYTHON_INSTALL)

Traceback (most recent call last):
  File "<string>", line 2, in <module>
TypeError: Strings must be encoded before hashing
CMake Error at cmake/Modules/GrPython.cmake:115 (add_custom_target):
  add_custom_target cannot create target "ALL" because another target with
  the same name already exists.  The existing target is a custom target
  created in source directory "/home/me/Projects/gr-matchstiq/swig".
  See documentation for policy CMP0002 for more details.
Call Stack (most recent call first):
  cmake/Modules/GrPython.cmake:214 (GR_UNIQUE_TARGET)
  apps/CMakeLists.txt:22 (GR_PYTHON_INSTALL)

-- Configuring incomplete, errors occurred!
See also "/home/me/Projects/gr-matchstiq/build/CMakeFiles/CMakeOutput.log".
See also "/home/me/Projects/gr-matchstiq/build/CMakeFiles/CMakeError.log".

cmake/Modules/GrPython.cmake:115中的代码是:

add_custom_target(${_target} ALL DEPENDS ${ARGN})

cmake/Modules/GrPython.cmake:214中的代码是:

GR_UNIQUE_TARGET("pygen" ${python_install_gen_targets})

我几乎没有使用cmake的经验,所以我也不确定哪种修复方式最安全
1.在根CMakelists.txt文件中,添加行(注意:这不起作用,但也许我做错了什么):
set_property(GLOBAL ALLOW_DUPLICATE_TARGETS TRUE)
1.将'ALL' cmake/Modules/GrPython.cmake:115更改为类似于'ALL_PY'的内容-即
add_custom_target(${_target} ALL_PY DEPENDS ${ARGN})
1.以某种方式修改GR_UNIQUE_TARGET函数(GrPython.cmake的第107-116行):

########################################################################
# Create an always-built target with a unique name
# Usage: GR_UNIQUE_TARGET(<description> <dependencies list>)
########################################################################
function(GR_UNIQUE_TARGET desc)
    file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
    execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
unique = hashlib.md5('${reldir}${ARGN}').hexdigest()[:5]
print(re.sub('\\W', '_', '${desc} ${reldir} ' + unique))"
    OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE)
    add_custom_target(${_target} ALL DEPENDS ${ARGN})
endfunction(GR_UNIQUE_TARGET)

或者,我还应该做些什么?
PS -我需要做的另一个修复是在第95-102行:

########################################################################
# Sets the python installation directory GR_PYTHON_DIR
########################################################################
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "
from distutils import sysconfig
print (sysconfig.get_python_lib(plat_specific=True, prefix=''))
" OUTPUT_VARIABLE GR_PYTHON_DIR OUTPUT_STRIP_TRAILING_WHITESPACE
)

最初,Python的print语句没有Python所要求的“(“&“)”3)
PPS -我不知道如何处理或找到类型错误,所以稍后会处理它们。

rkue9o1l

rkue9o1l1#

TL;DR:使用选项3:你需要散列一个bytes对象

要散列的字符串的前缀为b

unique = hashlib.md5(b'${reldir}${ARGN}').hexdigest()[:5]

评论回顾

CMake退出并返回一个错误,因为定义了多个名为“ALL”的目标。这是欠行的

add_custom_target(${_target} ALL DEPENDS ${ARGN})

其中_target是未设置的变量。所以这一行变成(我用伪符号<unset>表示未设置的变量):

add_custom_target(<unset> ALL DEPENDS ${ARGN})

而CMake只能看到:

add_custom_target(ALL DEPENDS ${ARGN})

根据add_custom_target的签名,第一个参数是目标的名称,而可选的ALL作为第二个参数将导致总是构建目标。如果没有第一个arg,ALL将成为第一个,并导致我们看到的错误。这只是一个次要错误,让我们深入挖掘。
自定义目标被添加到函数GR_UNIQUE_TARGET中,并重复调用此函数。在回复 “时,我可以只给它赋一个字符串值吗?“ -不。设置一个静态字符串将不起作用,只是把你扔回你的 * 目标名称不唯一 * 条件。
为了给每个目标给予一个唯一的名称,最初的开发人员想出了一个很小的Python代码片段,从输入文件中生成一个散列,并从中生成一个目标名称。

查看Python代码

我复制了Python代码并运行它,并立即收到以下错误:

TypeError: Unicode-objects must be encoded before hashing

因为Python 3's hashlib需要一个unicode bytes对象。如果通过prefixing a b或调用encode方法给它一个给予,代码就可以工作。尝试以下函数(注意添加的b):

function(GR_UNIQUE_TARGET desc)
    file(RELATIVE_PATH reldir ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
    execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import re, hashlib
unique = hashlib.md5(b'${reldir}${ARGN}').hexdigest()[:5]
print(re.sub('\\W', '_', '${desc} ${reldir} ' + unique))"
    OUTPUT_VARIABLE _target OUTPUT_STRIP_TRAILING_WHITESPACE)
    add_custom_target(${_target} ALL DEPENDS ${ARGN})
endfunction(GR_UNIQUE_TARGET)

在回答 *“它能成功吗?”““是的,我确实这么认为。也许不是最优雅的方法来做这件事,它看起来有点像这些 * 如果你唯一的工具是锤子. * 解决方案(我没有一个更好的想法在我的抽屉里,但是),但绝对可行。巧合的是,Python 2.7's hashlibstr对象很满意,所以它在当时就可以工作。

相关问题