NetBSD / pkgsrc

Automatic conversion of the NetBSD pkgsrc CVS module, use with care
https://www.pkgsrc.org
308 stars 164 forks source link

devel/cmake: CMake 3.22 not able to detect properly compiler on macOS Monterey #103

Closed bartoszkosiorek closed 2 years ago

bartoszkosiorek commented 2 years ago

devel/cmake (CMake 3.22.3) is not able to detect the compiler correctly on macOS 12.2.1 Monterey. A simple CMake project:

cmake_minimum_required(VERSION 3.22)
project(example-project)
add_executable(${PROJECT_NAME} main.cpp)

Fails accordingly with:

-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - failed
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - broken
CMake Error at /usr/local/pkg/share/cmake-3.22/Modules/CMakeTestCCompiler.cmake:69 (message):
  The C compiler

    "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: /Users/vanderhu/playground/testsimple/build/CMakeFiles/CMakeTmp

    Run Build Command(s):/usr/bin/make -f Makefile cmTC_a6dd3/fast && /Applications/Xcode.app/Contents/Developer/usr/bin/make  -f CMakeFiles/cmTC_a6dd3.dir/build.make CMakeFiles/cmTC_a6dd3.dir/build
    Building C object CMakeFiles/cmTC_a6dd3.dir/testCCompiler.c.o
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc    -MD -MT CMakeFiles/cmTC_a6dd3.dir/testCCompiler.c.o -MF CMakeFiles/cmTC_a6dd3.dir/testCCompiler.c.o.d -o CMakeFiles/cmTC_a6dd3.dir/testCCompiler.c.o -c /Users/vanderhu/playground/testsimple/build/CMakeFiles/CMakeTmp/testCCompiler.c
    Linking C executable cmTC_a6dd3
    /usr/local/pkg/bin/cmake -E cmake_link_script CMakeFiles/cmTC_a6dd3.dir/link.txt --verbose=1
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_a6dd3.dir/testCCompiler.c.o -o cmTC_a6dd3
    ld: library not found for -lSystem
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    make[1]: *** [cmTC_a6dd3] Error 1
    make: *** [cmTC_a6dd3/fast] Error 2

After reverting patch from: https://github.com/NetBSD/pkgsrc/commit/b04d79075da6b6bd0d19ad9de2b31d11b4db813a The cmake is working perfectly fine:

% /usr/local/pkg/bin/cmake ..                
zsh: sure you want to delete all 4 files in /Users/NavKit/dev/cmake-3.22/build [yn]? y
Re-run cmake no build system arguments
-- The C compiler identification is AppleClang 13.0.0.13000029
-- The CXX compiler identification is AppleClang 13.0.0.13000029
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/NavKit/dev/cmake-3.22/build
bartoszkosiorek commented 2 years ago

@jperkin @schmonz Do you think it will be possible to find another solution than https://github.com/NetBSD/pkgsrc/commit/b04d79075da6b6bd0d19ad9de2b31d11b4db813a? How to reproduce the building issue on arm64 in an x86_64 chroot ?

jperkin commented 2 years ago

Certainly if there's a solution that avoids this that'd be preferable. Hard to see how removing -arch causes ld: library not found for -lSystem though, it should just use the default.

It's currently impossible to create arm64 chroots at all, so the only way to build arm64 packages is inside an x86_64 chroot.

bartoszkosiorek commented 2 years ago

The patch is causing the sysroot and syslibroot are not added. With -arch patch:


Linking C executable cmTC_32a5e
/usr/local/pkg/bin/cmake -E cmake_link_script CMakeFiles/cmTC_32a5e.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Wl,-search_paths_first -Wl,-headerpad_max_install_names  -v -Wl,-v CMakeFiles/cmTC_32a5e.dir/CMakeCCompilerABI.c.o -o cmTC_32a5e 
Apple clang version 13.0.0 (clang-1300.0.29.30)
Target: x86_64-apple-darwin21.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -platform_version macos 12.0.0 12.0.0 -o cmTC_32a5e -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_32a5e.dir/CMakeCCompilerABI.c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/13.0.0/lib/darwin/libclang_rt.osx.a
@(#)PROGRAM:ld  PROJECT:ld64-711
BUILD 21:57:11 Nov 17 2021
configured to support archs: armv6 armv7 armv7s arm64 arm64e arm64_32 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em
Library search paths:
    /usr/lib
    /usr/local/lib
Framework search paths:
    /Library/Frameworks/
    /System/Library/Frameworks/
ld: library not found for -lSystem

Without -arch patch (working with sysroot and syslibroot):


Linking C executable cmTC_39687
/usr/local/Cellar/cmake/3.22.3/bin/cmake -E cmake_link_script CMakeFiles/cmTC_39687.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  -v -Wl,-v CMakeFiles/cmTC_39687.dir/CMakeCCompilerABI.c.o -o cmTC_39687 
Apple clang version 13.0.0 (clang-1300.0.29.30)
Target: x86_64-apple-darwin21.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -platform_version macos 12.0.0 12.1 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk -o cmTC_39687 -search_paths_first -headerpad_max_install_names -v CMakeFiles/cmTC_39687.dir/CMakeCCompilerABI.c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/13.0.0/lib/darwin/libclang_rt.osx.a
@(#)PROGRAM:ld  PROJECT:ld64-711
BUILD 21:57:11 Nov 17 2021
configured to support archs: armv6 armv7 armv7s arm64 arm64e arm64_32 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em
Library search paths:
    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/usr/lib
Framework search paths:
    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/

Parsed C implicit include dir info from above output: rv=done
jperkin commented 2 years ago

Yeh I see this now, I'll figure something out.

bartoszkosiorek commented 2 years ago

Is this patch is needed to add macOS M1 (arm based) support: https://en.wikipedia.org/wiki/Apple_M1 ?

I think such kind of patches should be submitted upstream in cmake: https://gitlab.kitware.com/cmake/cmake

It will allow to gather feedback about implementation and the new features will be available to everyone (not only in pkgsrc). Could you please create ticket on CMake project?

jperkin commented 2 years ago

No, it's a workaround to resolve the problem that you cannot create an arm64 chroot on M1 systems, so you are forced to build inside an x86_64 chroot, and cmake misinterprets that as you wanting to build for x86_64 natively.

I have a fix that I'm about to commit that should resolve this.

bartoszkosiorek commented 2 years ago

@jperkin Can you also backport this patch to pkgsrc-2021Q4 branch: https://github.com/NetBSD/pkgsrc/tree/pkgsrc-2021Q4/devel/cmake

bartoszkosiorek commented 2 years ago

Have you tried to use the CMAKE_APPLE_SILICON_PROCESSOR cmake variable, to choose which architecture has to be build: https://cmake.org/cmake/help/latest/variable/CMAKE_APPLE_SILICON_PROCESSOR.html