我目前正在尝试从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 -我不知道如何处理或找到类型错误,所以稍后会处理它们。
1条答案
按热度按时间rkue9o1l1#
TL;DR:使用选项3:你需要散列一个
bytes
对象要散列的字符串的前缀为
b
:评论回顾
CMake退出并返回一个错误,因为定义了多个名为“ALL”的目标。这是欠行的
其中
_target
是未设置的变量。所以这一行变成(我用伪符号<unset>
表示未设置的变量):而CMake只能看到:
根据
add_custom_target
的签名,第一个参数是目标的名称,而可选的ALL
作为第二个参数将导致总是构建目标。如果没有第一个arg,ALL
将成为第一个,并导致我们看到的错误。这只是一个次要错误,让我们深入挖掘。自定义目标被添加到函数
GR_UNIQUE_TARGET
中,并重复调用此函数。在回复 “时,我可以只给它赋一个字符串值吗?“ -不。设置一个静态字符串将不起作用,只是把你扔回你的 * 目标名称不唯一 * 条件。为了给每个目标给予一个唯一的名称,最初的开发人员想出了一个很小的Python代码片段,从输入文件中生成一个散列,并从中生成一个目标名称。
查看Python代码
我复制了Python代码并运行它,并立即收到以下错误:
因为Python 3's
hashlib
需要一个unicodebytes
对象。如果通过prefixing ab
或调用encode
方法给它一个给予,代码就可以工作。尝试以下函数(注意添加的b
):在回答 *“它能成功吗?”““是的,我确实这么认为。也许不是最优雅的方法来做这件事,它看起来有点像这些 * 如果你唯一的工具是锤子. * 解决方案(我没有一个更好的想法在我的抽屉里,但是),但绝对可行。巧合的是,Python 2.7's
hashlib
对str
对象很满意,所以它在当时就可以工作。