aminya / project_options

A general-purpose CMake library that provides functions that improve the CMake experience following the best practices.
https://aminya.github.io/project_options/
MIT License
340 stars 52 forks source link

Cross-compiling #180

Open aminya opened 1 year ago

aminya commented 1 year ago

Future Ideas

Usage

The best you can do is add this to your cmake file:

# opt-in cross-compiling
option(ENABLE_CROSS_COMPILING "Detect cross compiler and setup toolchain" OFF)
if(ENABLE_CROSS_COMPILING)
  enable_cross_compiler()
endif()
run_vcpkg() # run_vcpkg AFTER enable_cross_compiler, when using vcpkg

and run cmake with these additional arguments:

-DENABLE_CROSS_COMPILING:BOOL=ON -DDEFAULT_TRIPLET=x64-mingw-dynamic

See Taskfile and docker examples

Notes

_Originally posted by @abeimler in https://github.com/aminya/project_options/issues/171#issuecomment-1345251104_

Upvote & Fund

Fund with Polar

glennvl commented 1 year ago

I am attempting to use project_options v0.26.3 for an embedded project. The idea is to write everything from scratch in C++, but as a first step I'm attempting to get the build system and tooling setup, for which I'm using the devkit demo code which is written in C. I am using vscode on windows with ubuntu in wsl (after I get everything to work I want to use docker).

What I noticed so far (when cross compiling for the target board) is:

[build] warning: argument unused during compilation: '-mcpu=cortex-m4' [clang-diagnostic-unused-command-line-argument]
[build] warning: argument unused during compilation: '-mfloat-abi=hard' [clang-diagnostic-unused-command-line-argument]
[build] warning: argument unused during compilation: '-mfpu=fpv4-sp-d16' [clang-diagnostic-unused-command-line-argument]
[build] warning: argument unused during compilation: '-mthumb' [clang-diagnostic-unused-command-line-argument]
[build] /projects/STM32F303-DISCOVERY/src/Demo/Inc/usbd_conf.h:26:10: error: 'stdio.h' file not found [clang-diagnostic-error]
[build] #include <stdio.h>
[build] /projects/STM32F303-DISCOVERY/src/Drivers/CMSIS/Include/cmsis_compiler.h:261:0: warning: #error Unknown compiler. [preprocessorErrorDirective]
[build]   #error Unknown compiler.
[build] ^
abeimler commented 1 year ago

What I noticed so far (when cross compiling for the target board) is:

  • clang-tidy complains about unused compiler arguments
[build] warning: argument unused during compilation: '-mcpu=cortex-m4' [clang-diagnostic-unused-command-line-argument]
[build] warning: argument unused during compilation: '-mfloat-abi=hard' [clang-diagnostic-unused-command-line-argument]
[build] warning: argument unused during compilation: '-mfpu=fpv4-sp-d16' [clang-diagnostic-unused-command-line-argument]
[build] warning: argument unused during compilation: '-mthumb' [clang-diagnostic-unused-command-line-argument]

Maybe related to https://github.com/aminya/project_options/issues/96 ? @aminya

glennvl commented 1 year ago

To follow up on the clang-tidy issue. Adding -p ${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json works when using the latest cmake version 3.25.1. It is then not needed to add --extra-arg=--target=arm-none-eabi-gcc.

glennvl commented 1 year ago

As for cppcheck, I haven't figured it out yet. When I manually run cppcheck using the following script

#!/bin/sh

cppcheck -D__GNUC__ \
         --project=build/arm-cortex-m4-gcc-debug/compile_commands.json \
         --platform=cmake/arm-cortex-m4-platform.xml \
         --cppcheck-build-dir=build/arm-cortex-m4-gcc-debug/cppcheck \
         --enable=style,performance,warning,portability \
         --inline-suppr \
         --suppress=cppcheckError \
         --suppress=internalAstError \
         --suppress=unmatchedSuppression \
         --suppress=passedByValue \
         --suppress=syntaxError \
         --inconclusive \
         --std=c11 \
         --template=gcc \
         --verbose

Everything appears to be working fine.

cppcheck_output.txt

But when I run it from within cmake with the same parameters, all sorts of weirdness (including regular crashes) happens...

cmake_output.txt

aminya commented 1 year ago

@abeimler Could you add some docs about Toolchains to the Readme?

I'd like to tag a new release, but we should add some basic docs for the new features.

abeimler commented 1 year ago

@abeimler Could you add some docs about Toolchains to the Readme?

I'd like to tag a new release, but we should add some basic docs for the new features.

Well, writing docs is not my most vital skill ^^
The best I can do is give some examples and Dockerfiles ...

  1. Add those to your CMakeLists.txt:

    # opt-in cross-compiling
    option(ENABLE_CROSS_COMPILING "Detect cross compiler and setup toolchain" OFF)
    if(ENABLE_CROSS_COMPILING)
    enable_cross_compiler()
    endif()
    run_vcpkg() # run_vcpkg AFTER enable_cross_compiler, when using vcpkg
  2. use -DENABLE_CROSS_COMPILING:BOOL=ON for enabling cross-compiling and set the target with -DDEFAULT_TRIPLET=x64-mingw-dynamic (using DEFAULT_TRIPLET is the easiest way and should be recommended).

The option for DEFAULT_TRIPLET are the simlary to vcpkg VCPKG_DEFAULT_TRIPLET

Alternatively, you can set the (cross)compiler directly with: -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ or set the environment variable for CC and CXX.


For arm-linux/arm64-linux, you must set the compiler:

For (bare-metal) you don't need/can't(?) set arm-linux/arm64-linux (for vcpkg):

Example:

Notes

(@aminya Hope this can help you to write a proper section)

aminya commented 1 year ago

clang-tidy complains about unused compiler arguments

Related to this discussion https://discourse.cmake.org/t/using-clang-tidy-with-cross-compilation/5435

aminya commented 1 year ago

Another remaining issue for Cross-compiling is that its options are using global CMake options instead of the function arguments. We should be using function arguments

Project579 commented 1 year ago

It would also be nice if clang based tools (clang-tidy and iwyu) actually worked when cross compiling, I have some ideas on how to make them work but they require refactoring in lot's of places, I may post a draft PR in the future with my current progress.

kassane commented 11 months ago

Is it intended to add support for clang/llvm-libcxx for cross-compilation?

Currently the zig toolchain allows portability to the LLVM toolchain. Integration with CMake is a bit problematic due to the space between the zig cc or zig c++ command.

The main difference between zig and conventional toolchain is that for C++ it restricts to using libcxx by default. However, it is possible to use another ABI.

e.g.: https://github.com/uber/hermetic_cc_toolchain - zig cc on bazel

References