带有目录树 zlib 构建错误的 libpng

问题描述

我有以下 cmake 文件

cmake_minimum_required(VERSION 3.15)

add_subdirectory(googletest)
add_subdirectory(zlib)

# libpng setup
option(PNG_TESTS OFF)
set(PNG_TESTS OFF)
option(PNG_SHARED OFF)
set(PNG_SHARED OFF)
option(PNG_EXECUTABLES OFF)
set(PNG_EXECUTABLES OFF)
option(PNG_BUILD_ZLIB ON)
set(PNG_BUILD_ZLIB ON)
set(ZLIB_INCLUDE_Dirs "${CMAKE_CURRENT_LIST_DIR}/zlib" "${CMAKE_CURRENT_BINARY_DIR}/zlib")
set(ZLIB_LIBRARY "zlib")
add_subdirectory(libpng)

这会正确生成项目并且 zlib/googletest 构建正常。 pnglib 另一方面不构建:

1>Generating pnglibconf.out
1>Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29337 for x64
1>copyright (C) Microsoft Corporation.  All rights reserved.
1>
1>pnglibconf.c
1>build/thirdparty/libpng/pnglibconf.c(34): Fatal error C1083: Cannot open include file: 'zlib.h': No such file or directory
1>CMake Error at scripts/genout.cmake:78 (message):
1>  Failed to generate build/thirdparty/libpng/pnglibconf.out.tf1
1>
1>
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(238,5): error MSB8066: Custom build for 'build\CMakeFiles\4c907688e112b5b30b06f56662306981\pnglibconf.out.rule;build\CMakeFiles\4c907688e112b5b30b06f56662306981\pnglibconf.h.rule;build\CMakeFiles\5a2501006db4b4e75991d2f2c16bfadf\sym.out.rule;build\CMakeFiles\4c907688e112b5b30b06f56662306981\libpng.sym.rule;build\CMakeFiles\5a2501006db4b4e75991d2f2c16bfadf\vers.out.rule;build\CMakeFiles\4c907688e112b5b30b06f56662306981\libpng.vers.rule;build\CMakeFiles\5a2501006db4b4e75991d2f2c16bfadf\intprefix.out.rule;build\CMakeFiles\5a2501006db4b4e75991d2f2c16bfadf\prefix.out.rule;build\CMakeFiles\5a2501006db4b4e75991d2f2c16bfadf\symbols.chk.rule;build\CMakeFiles\e5199c38ed750451ee22eda432b56e2c\genfiles.rule' exited with code 1.
1>Done building project "genfiles.vcxproj" -- Failed.

如果我手动将 ${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt 复制到 ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h 作为 genfiles 目标应该做 pnglib_static 编译正常。

...
if(NOT AWK OR ANDROID OR IOS)
  # No awk available to generate sources; use pre-built pnglibconf.h
  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt
                 ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
  add_custom_target(genfiles) # Dummy
else()
...

知道如何解决这个问题吗?我不想将 CMakeLists.txtlibpng 更改为更容易更新到较新版本。我使用的是 url = git://git.code.sf.net/p/libpng/code 的最新版本,如 http://www.libpng.org/pub/png/libpng.html

所述

解决方法

阅读genout.cmake后,我发现了这一行:

set(AWK "C:/Program Files/Git/usr/bin/gawk.exe")

如果我从 cmd 而不是 git bash genout.cmake 运行 CMake 包含:

set(AWK "AWK-NOTFOUND")

可能从 git bash 运行 CMake 会混淆构建系统,但从 cmd 运行 CMake 会正确生成项目。