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