0

My CMakeLists.txt:

cmake_minimum_required(VERSION 3.9)

project(Arkan)

# Specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# Build the native Arkan library
add_library(arkan SHARED
    lib/cpp/greeting.cpp
)
set_target_properties(arkan PROPERTIES VERSION ${PROJECT_VERSION})
set_target_properties(arkan PROPERTIES SOVERSION 0)
set_target_properties(arkan PROPERTIES PUBLIC_HEADER lib/cpp/include/arkan.hpp)

Just a simple library. I need to compile it on macOS for linux, so I've created a toolchain file:

set(triple  x86_64-linux-gnu)
set(llvm    /opt/homebrew/Cellar/llvm/13.0.1_1)

set(CMAKE_SYSTEM_NAME       Linux)
set(CMAKE_SYSTEM_PROCESSOR  x86_64)

set(CMAKE_IGNORE_PATH                       /Applications/Xcode.app)
set(CMAKE_PREFIX_PATH                       ${llvm})

set(CMAKE_C_COMPILER                        ${llvm}/bin/clang)
set(CMAKE_C_COMPILER_TARGET                 ${triple})
set(CMAKE_C_STANDARD_LIBRARIES              ${llvm}/lib)
set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES    ${llvm}/include/c++/v1)
set(CMAKE_C_LINK_EXECUTABLE                 ${llvm}/bin/llvm-link)

set(CMAKE_CXX_COMPILER                      ${llvm}/bin/clang++)
set(CMAKE_CXX_COMPILER_TARGET               ${triple})
set(CMAKE_CXX_STANDARD_LIBRARIES            ${llvm}/lib)
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES  ${llvm}/include/clang)
set(CMAKE_CXX_LINK_EXECUTABLE               ${llvm}/bin/llvm-link)

SET(CMAKE_AR      ${llvm}/bin/llvm-ar)
SET(CMAKE_LINKER  ${llvm}/bin/llvm-link)
SET(CMAKE_NM      ${llvm}/bin/llvm-nm)
SET(CMAKE_OBJDUMP ${llvm}/bin/llvm-objdump)
SET(CMAKE_RANLIB  ${llvm}/bin/llvm-ranlib)

However, when I configure the project, I get the error:

[100%] Built target arkan
-- The C compiler identification is Clang 13.0.1
-- The CXX compiler identification is Clang 13.0.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - failed
-- Check for working C compiler: /opt/homebrew/Cellar/llvm/13.0.1_1/bin/clang
-- Check for working C compiler: /opt/homebrew/Cellar/llvm/13.0.1_1/bin/clang - broken
CMake Error at /opt/homebrew/Cellar/cmake/3.23.2/share/cmake/Modules/CMakeTestCCompiler.cmake:69 (message):
  The C compiler

    "/opt/homebrew/Cellar/llvm/13.0.1_1/bin/clang"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: /Users/user/Projects/arkan/build/linux/x86_64/CMakeFiles/CMakeTmp
    
    Run Build Command(s):/usr/bin/make -f Makefile cmTC_bf6b9/fast && /Applications/Xcode.app/Contents/Developer/usr/bin/make  -f CMakeFiles/cmTC_bf6b9.dir/build.make CMakeFiles/cmTC_bf6b9.dir/build
    Building C object CMakeFiles/cmTC_bf6b9.dir/testCCompiler.c.o
    /opt/homebrew/Cellar/llvm/13.0.1_1/bin/clang --target=x86_64-linux-gnu  -isystem /opt/homebrew/Cellar/llvm/13.0.1_1/include/c++/v1  -MD -MT CMakeFiles/cmTC_bf6b9.dir/testCCompiler.c.o -MF CMakeFiles/cmTC_bf6b9.dir/testCCompiler.c.o.d -o CMakeFiles/cmTC_bf6b9.dir/testCCompiler.c.o -c /Users/user/Projects/arkan/build/linux/x86_64/CMakeFiles/CMakeTmp/testCCompiler.c
    Linking C executable cmTC_bf6b9
    /opt/homebrew/Cellar/cmake/3.23.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_bf6b9.dir/link.txt --verbose=1
    /opt/homebrew/Cellar/llvm/13.0.1_1/bin/llvm-link
    llvm-link: Not enough positional command line arguments specified!
    Must specify at least 1 positional argument: See: /opt/homebrew/Cellar/llvm/13.0.1_1/bin/llvm-link --help
    make[1]: *** [cmTC_bf6b9] Error 1
    make: *** [cmTC_bf6b9/fast] Error 2
    
    

  

  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:3 (project)

What do I need to set in my toolchain file yet? What am I doing wrongly?

UPD:
build.sh:

#!/bin/bash

# Variables
A_BUILDDIR=./build
A_OUTDIR=$A_BUILDDIR/out
A_THREADS=4


# Check for .env configuration
if [ -f .env ]; then
    source .env
fi

# Create build and output directories if they do not exist
mkdir -p $A_BUILDDIR
mkdir -p $A_OUTDIR


#################
# Linux platform
#################
for ABI in "x86_64"; do

    LINUX_BUILDDIR=$A_BUILDDIR/linux/$ABI
    LINUX_OUTDIR=$A_OUTDIR/linux/$ABI
    mkdir -p $LINUX_BUILDDIR
    mkdir -p $LINUX_OUTDIR

    cmake -S . -B $LINUX_BUILDDIR \
        -DCMAKE_TOOLCHAIN_FILE=toolchains/${ABI}_linux_gnu.toolchain.cmake

    cmake --build $LINUX_BUILDDIR -j $A_THREADS
    cp $LINUX_BUILDDIR/*.so $LINUX_OUTDIR

done

UPD2:
After changing a toolchain file according to KamilCuk's comment, I got the next:

set(triple  x86_64-linux-gnu)
set(llvm    /opt/homebrew/Cellar/llvm/13.0.1_1)

set(CMAKE_SYSTEM_NAME       Linux)
set(CMAKE_SYSTEM_PROCESSOR  x86_64)

set(CMAKE_IGNORE_PATH                       /Applications/Xcode.app)
set(CMAKE_PREFIX_PATH                       ${llvm})

set(CMAKE_C_COMPILER                        ${llvm}/bin/clang)
set(CMAKE_C_COMPILER_TARGET                 ${triple})
set(CMAKE_C_STANDARD_LIBRARIES              ${llvm}/lib)
set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES    ${llvm}/include/c++/v1)
set(CMAKE_C_LINK_EXECUTABLE                 "${llvm}/bin/llvm-link <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")

set(CMAKE_CXX_COMPILER                      ${llvm}/bin/clang++)
set(CMAKE_CXX_COMPILER_TARGET               ${triple})
set(CMAKE_CXX_STANDARD_LIBRARIES            ${llvm}/lib)
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES  ${llvm}/include/clang)
set(CMAKE_CXX_LINK_EXECUTABLE               "${llvm}/bin/llvm-link <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")

SET(CMAKE_AR      ${llvm}/bin/llvm-ar)
SET(CMAKE_LINKER  ${llvm}/bin/llvm-link)
SET(CMAKE_NM      ${llvm}/bin/llvm-nm)
SET(CMAKE_OBJDUMP ${llvm}/bin/llvm-objdump)
SET(CMAKE_RANLIB  ${llvm}/bin/llvm-ranlib)

Unfortunately, I also got a new problem:

Run Build Command(s):/usr/bin/make -f Makefile cmTC_1d33d/fast && /Applications/Xcode.app/Contents/Developer/usr/bin/make  -f CMakeFiles/cmTC_1d33d.dir/build.make CMakeFiles/cmTC_1d33d.dir/build
Building C object CMakeFiles/cmTC_1d33d.dir/testCCompiler.c.o
/opt/homebrew/Cellar/llvm/13.0.1_1/bin/clang --target=x86_64-linux-gnu  -isystem /opt/homebrew/Cellar/llvm/13.0.1_1/include/c++/v1  -MD -MT CMakeFiles/cmTC_1d33d.dir/testCCompiler.c.o -MF CMakeFiles/cmTC_1d33d.dir/testCCompiler.c.o.d -o CMakeFiles/cmTC_1d33d.dir/testCCompiler.c.o -c /Users/user/Projects/arkan/build/linux/x86_64/CMakeFiles/CMakeTmp/testCCompiler.c
Linking C executable cmTC_1d33d
/opt/homebrew/Cellar/cmake/3.23.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_1d33d.dir/link.txt --verbose=1
/opt/homebrew/Cellar/llvm/13.0.1_1/bin/llvm-link CMakeFiles/cmTC_1d33d.dir/testCCompiler.c.o -o cmTC_1d33d  /opt/homebrew/Cellar/llvm/13.0.1_1/lib 
/opt/homebrew/Cellar/llvm/13.0.1_1/bin/llvm-link: CMakeFiles/cmTC_1d33d.dir/testCCompiler.c.o:1:1: error: expected top-level entity
ELF          >                    �          @     @       UH���E�    �}�H�u��E���]� Homebrew clang version 13.0.1               zR x
                                                                                                                                                        A�C
/opt/homebrew/Cellar/llvm/13.0.1_1/bin/llvm-link: error:  loading file 'CMakeFiles/cmTC_1d33d.dir/testCCompiler.c.o'
make[1]: *** [cmTC_1d33d] Error 1
make: *** [cmTC_1d33d/fast] Error 2

UPD3:

I've simplified my toolchain file basing on Tsyvarev's comment:

set(triple  x86_64-linux-gnu)
set(llvm    /opt/homebrew/Cellar/llvm/13.0.1_1)

set(CMAKE_SYSTEM_NAME       Linux)
set(CMAKE_SYSTEM_PROCESSOR  x86_64)

set(CMAKE_IGNORE_PATH                       /Applications/Xcode.app)
set(CMAKE_PREFIX_PATH                       ${llvm})

set(CMAKE_C_COMPILER                        ${llvm}/bin/clang)
set(CMAKE_C_COMPILER_TARGET                 ${triple})
set(CMAKE_C_FLAGS                           "-fuse-ld=lld")

set(CMAKE_CXX_COMPILER                      ${llvm}/bin/clang++)
set(CMAKE_CXX_COMPILER_TARGET               ${triple})
set(CMAKE_CXX_FLAGS                         "-fuse-ld=lld")

And there are new errors:

clang-13: warning: argument unused during compilation: '-fuse-ld=lld' [-Wunused-command-line-argument]
Linking C executable cmTC_3631b
/opt/homebrew/Cellar/cmake/3.23.2/bin/cmake -E cmake_link_script CMakeFiles/cmTC_3631b.dir/link.txt --verbose=1
/opt/homebrew/Cellar/llvm/13.0.1_1/bin/clang --target=x86_64-linux-gnu -fuse-ld=lld  CMakeFiles/cmTC_3631b.dir/testCCompiler.c.o -o cmTC_3631b 
ld.lld: error: /Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/lib/crt1.o: unknown file type
ld.lld: error: cannot open crti.o: No such file or directory
ld.lld: error: cannot open crtbegin.o: No such file or directory
ld.lld: error: unable to find library -lgcc
ld.lld: error: unable to find library -lgcc_s
ld.lld: error: unable to find library -lc
ld.lld: error: unable to find library -lgcc
ld.lld: error: unable to find library -lgcc_s
ld.lld: error: cannot open crtend.o: No such file or directory
ld.lld: error: cannot open crtn.o: No such file or directory
Denis Sologub
  • 7,277
  • 11
  • 56
  • 123
  • 1
    `set(CMAKE_C_LINK_EXECUTABLE "llvm-link -o ")` – KamilCuk Jun 14 '22 at 13:36
  • @KamilCuk, thank you! It fixed my error, but I got a new one, unfortunately – Denis Sologub Jun 14 '22 at 14:25
  • 1
    [llvm-link](https://llvm.org/docs/CommandGuide/llvm-link.html) is a **bitcode** linker. Using it for common object files doesn't look correct. – Tsyvarev Jun 14 '22 at 15:04
  • @Tsyvarev, what should I use then from LLVM folder? I tried `lld` but there were problems too. – Denis Sologub Jun 14 '22 at 15:25
  • @Tsyvarev, I've also tried not to specify a linker, then **CMake** uses a default one from **Xcode**. However, it fails with errors: `ld: unknown option: --sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk` – Denis Sologub Jun 14 '22 at 15:39
  • 1
    You could follow [that answer](https://stackoverflow.com/a/64174822/3440745) and pass additional option "-fuse-ld=lld". – Tsyvarev Jun 14 '22 at 15:45
  • @Tsyvarev, `ld.lld: error: /Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/lib/crt1.o: unknown file type ld.lld: error: cannot open crti.o: No such file or directory ld.lld: error: cannot open crtbegin.o: No such file or directory ld.lld: error: unable to find library -lgcc ld.lld: error: unable to find library -lgcc_s ld.lld: error: unable to find library -lc ld.lld: error: unable to find library -lgcc ld.lld: error: unable to find library -lgcc_s` – Denis Sologub Jun 14 '22 at 16:04
  • @Tsyvarev, it leads to new problems – Denis Sologub Jun 14 '22 at 16:04
  • @Tsyvarev, I posted my current toolchain file and errors in **UPD3** section of my question. Can you have a look, plz? I can't get why it tries to use macOS SDK and how to fix this error – Denis Sologub Jun 14 '22 at 16:10

0 Answers0