Windows11下设置CMAKE_ARGS含空格参数的问题求助
问题描述
在Windows 11上安装llama-cpp-python,已配置CMAKE_ARGS环境变量指向MinGW的gcc和g++用于编译,但设置-G MinGW Makefiles生成器参数时,空格导致参数被拆分,尝试了-G MinGW Makefiles、-G 'MinGW Makefiles'、-G "MinGW Makefiles"、-G MinGW\ Makefiles这些方式都无效,报错如下:
Building wheel for llama-cpp-python (pyproject.toml) ... error
error: subprocess-exited-with-error× Building wheel for llama-cpp-python (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> [86 lines of output]
*** scikit-build-core 0.9.2 using CMake 3.29.1 (wheel)
*** Configuring CMake...
2024-04-26 23:46:20,586 - scikit_build_core - WARNING - Can't find a Python library, got libdir=None, ldlibrary=None, multiarch=None, masd=None
CMake Error: Could not create named generator "MinGWGenerators Visual Studio 17 2022 = Generates Visual Studio 2022 project files. Use -A option to specify architecture. Visual Studio 16 2019 = Generates Visual Studio 2019 project files. Use -A option to specify architecture. Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 12 2013 [arch] = Deprecated. Generates Visual Studio 2013 project files. Optional [arch] can be "Win64" or "ARM". Visual Studio 9 2008 [arch] = Deprecated. Generates Visual Studio 2008 project files. Optional [arch] can be "Win64" or "IA64". Borland Makefiles = Generates Borland makefiles. * NMake Makefiles = Generates NMake makefiles. NMake Makefiles JOM = Generates JOM makefiles. MSYS Makefiles = Generates MSYS makefiles. MinGW Makefiles = Generates a make file for use with mingw32-make. Green Hills MULTI = Generates Green Hills MULTI files (experimental, work-in-progress). Unix Makefiles = Generates standard UNIX makefiles. Ninja = Generates build.ninja files. Ninja Multi-Config = Generates build-<Config>.ninja files. Watcom WMake = Generates Watcom WMake makefiles. CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files (deprecated). CodeBlocks - NMake Makefiles = Generates CodeBlocks project files (deprecated). CodeBlocks - NMake Makefiles JOM = Generates CodeBlocks project files (deprecated). CodeBlocks - Ninja = Generates CodeBlocks project files (deprecated). CodeBlocks - Unix Makefiles = Generates CodeBlocks project files (deprecated). CodeLite - MinGW Makefiles = Generates CodeLite project files (deprecated). CodeLite - NMake Makefiles = Generates CodeLite project files (deprecated). CodeLite - Ninja = Generates CodeLite project files (deprecated). CodeLite - Unix Makefiles = Generates CodeLite project files (deprecated). Eclipse CDT4 - NMake Makefiles = Generates Eclipse CDT 4.0 project files (deprecated). Eclipse CDT4 - MinGW Makefiles = Generates Eclipse CDT 4.0 project files (deprecated). Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files (deprecated). Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files (deprecated). Kate - MinGW Makefiles = Generates Kate project files (deprecated). Kate - NMake Makefiles = Generates Kate project files (deprecated). Kate - Ninja = Generates Kate project files (deprecated). Kate - Ninja Multi-Config = Generates Kate project files (deprecated). Kate - Unix Makefiles = Generates Kate project files (deprecated). Sublime Text 2 - MinGW Makefiles = Generates Sublime Text 2 project files (deprecated). Sublime Text 2 - NMake Makefiles = Generates Sublime Text 2 project files (deprecated). Sublime Text 2 - Ninja = Generates Sublime Text 2 project files (deprecated). Sublime Text 2 - Unix Makefiles = Generates Sublime Text 2 project files (deprecated). CMake Warning: Ignoring extra path from command line: "Makefiles"" *** CMake configuration failed [end of output]
解决方案
方法1:CMD环境下使用双层双引号
在CMD中设置CMAKE_ARGS时,用双层双引号包裹带空格的生成器参数,确保参数完整传递:
set CMAKE_ARGS="-G ""MinGW Makefiles"" -DCMAKE_C_COMPILER=C:/path/to/mingw/bin/gcc.exe -DCMAKE_CXX_COMPILER=C:/path/to/mingw/bin/g++.exe" pip install llama-cpp-python
方法2:PowerShell环境下用单引号包裹整体
PowerShell中直接用单引号包裹整个CMAKE_ARGS内容,内部保留双引号即可:
$env:CMAKE_ARGS = '-G "MinGW Makefiles" -DCMAKE_C_COMPILER=C:/path/to/mingw/bin/gcc.exe -DCMAKE_CXX_COMPILER=C:/path/to/mingw/bin/g++.exe' pip install llama-cpp-python
方法3:通过pyproject.toml配置
在项目目录创建或修改pyproject.toml,添加scikit-build的CMake参数配置:
[tool.scikit-build] cmake.args = [ "-G", "MinGW Makefiles", "-DCMAKE_C_COMPILER=C:/path/to/mingw/bin/gcc.exe", "-DCMAKE_CXX_COMPILER=C:/path/to/mingw/bin/g++.exe" ]
然后执行本地安装:
pip install .
原理说明
Windows命令行的参数解析逻辑和类Unix系统不同,环境变量中的空格会被直接拆分。使用双层双引号(CMD)或单引号包裹整体(PowerShell),能让CMake识别到MinGW Makefiles是一个完整的生成器名称,不会被拆分成两个独立参数。
内容的提问来源于stack exchange,提问作者Leo Turoff

