Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compilation fails on RPi2B + Arch + distcc #92

Open
bronze51 opened this issue Jun 20, 2020 · 19 comments
Open

Compilation fails on RPi2B + Arch + distcc #92

bronze51 opened this issue Jun 20, 2020 · 19 comments

Comments

@bronze51
Copy link

bronze51 commented Jun 20, 2020

The first error I got could be fixed with this code:
doe300/VC4C#145 (comment)

But the second error:

[ 95%] Building CXX object test/CMakeFiles/TestVC4C.dir/TestMathFunctions.cpp.o
[E] Sat Jun 20 14:28:51 2020: Errors in precompilation:
[E] Sat Jun 20 14:28:51 2020: error: unknown argument: '-target'
distcc[26575] ERROR: compile (null) on localhost failed
distcc[26574] ERROR: compile (null) on localhost failed

[E] Sat Jun 20 14:28:51 2020:  (1) ~/dev/vc4cl-git/src/VC4C/build/src/libVC4CC.so.1.2 : vc4c::CompilationError::CompilationError(vc4c::CompilationStep, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)+0x2ac [0x76c81664]
[E] Sat Jun 20 14:28:51 2020:  (2) ~/dev/vc4cl-git/src/VC4C/build/src/libVC4CC.so.1.2 : runPrecompiler(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::istream*, std::ostream*)+0x300 [0x76e42e48]
[E] Sat Jun 20 14:28:51 2020:  (3) ~/dev/vc4cl-git/src/VC4C/build/src/libVC4CC.so.1.2 : vc4c::Precompiler::precompileStandardLibraryFiles(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)+0x468 [0x76e4b75c]
[E] Sat Jun 20 14:28:51 2020:  (4) ~/dev/vc4cl-git/src/VC4C/build/src/vc4c : main+0x944 [0x4a9b4c]
[E] Sat Jun 20 14:28:51 2020:  (5) /usr/lib/libc.so.6 : __libc_start_main+0x110 [0x768c1bb8]
terminate called after throwing an instance of 'vc4c::CompilationError'
  what():  Pre-compilation: Error in precompilation: error: unknown argument: '-target'
distcc[26575] ERROR: compile (null) on localhost failed
distcc[26574] ERROR: compile (null) on localhost failed

[E] Sat Jun 20 14:28:51 2020: Received signal: SIGABRT
[E] Sat Jun 20 14:28:51 2020:  (1) ~/dev/vc4cl-git/src/VC4C/build/src/libVC4CC.so.1.2 : +0xe33e8 [0x76cab3e8]
[E] Sat Jun 20 14:28:51 2020:  (2) /usr/lib/libc.so.6 : __default_rt_sa_restorer+0 [0x768d9300]
[E] Sat Jun 20 14:28:51 2020:  (3) /usr/lib/libc.so.6 : gsignal+0xb8 [0x768d7fcc]
make[2]: *** [src/CMakeFiles/VC4C.dir/build.make:108: src/vc4c] Error 6
make[2]: *** Deleting file 'src/vc4c'
make[1]: *** [CMakeFiles/Makefile2:2040: src/CMakeFiles/VC4C.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

@doe300
Copy link
Owner

doe300 commented Jun 20, 2020

What clang version do you have? What does <VC4C-build-directory>/src/vc4c --version output?

Judging by the error it looks like the command for you would be:

~/dev/vc4cl-git/src/VC4C/build/src/vc4c --version

@bronze51
Copy link
Author

clang ~/dev/vc4cl-git/src/VC4C/build/src/vc4c --version
clang version 10.0.0
Target: armv7l-unknown-linux-gnueabihf
Thread model: posix
InstalledDir: /usr/bin

@doe300
Copy link
Owner

doe300 commented Jun 20, 2020

And just running ~/dev/vc4cl-git/src/VC4C/build/src/vc4c --version ?

@bronze51
Copy link
Author

Sorry, I didn't read that correctly:
There is no vc4c in ~/dev/vc4cl-git/src/VC4C/build/src/vc4c

However, it was installed here:

whereis vc4c
vc4c: /usr/local/bin/vc4c
vc4c --version
Running VC4C in version: 0.4.9999
Build configuration:
multi-threaded optimization; clang 3.9+ OpenCL features; clang in /usr/lib/distcc/bin/clang; LLVM library front-end with libLLVM 10; LLVM linker; vc4asm verification

@doe300
Copy link
Owner

doe300 commented Jun 20, 2020

Can distcc even compile to SPIR?

@doe300
Copy link
Owner

doe300 commented Jun 21, 2020

To give a little bit more context:

VC4C(L) should be able to be compiled with any C++14 able compiler, including distcc.

But, additionally to that the VC4C compiler requires a clang (at runtime) to compile the OpenCL C sources to either a LLVM IR module or SPIR-V binary code (depending on the build configuration of VC4C). It looks like in your build, you also configured to use distcc here (see output clang in /usr/lib/distcc/bin/clang above, either specified manually or because it was detected as valid clang version). I don't know how/if distcc provides the complete functionality that clang provides, but I would guess therein lies the problem.

@bronze51
Copy link
Author

I successfully installed using pacman: VC4C and VC4CLstlib. With VC4CL I have a pre-compilation error?

I appreciate the above follow-up and the explanation. While right now the RPi is setup to invoke disctcc for everything that needs compiling, this can be changed. As far as I understand, if distcc remote compilation fails, the system tries again locally (on the RPi).

The errors above:

[E] Sat Jun 20 14:28:51 2020:  (1) ~/dev/vc4cl-git/src/VC4C/build/src/libVC4CC.so.1.2 : vc4c::CompilationError::CompilationError(vc4c::CompilationStep, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)+0x2ac [0x76c81664]
[E] Sat Jun 20 14:28:51 2020:  (2) ~/dev/vc4cl-git/src/VC4C/build/src/libVC4CC.so.1.2 : runPrecompiler(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::istream*, std::ostream*)+0x300 [0x76e42e48]
[E] Sat Jun 20 14:28:51 2020:  (3) ~/dev/vc4cl-git/src/VC4C/build/src/libVC4CC.so.1.2 : vc4c::Precompiler::precompileStandardLibraryFiles(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)+0x468 [0x76e4b75c]
[E] Sat Jun 20 14:28:51 2020:  (4) ~/dev/vc4cl-git/src/VC4C/build/src/vc4c : main+0x944 [0x4a9b4c]
[E] Sat Jun 20 14:28:51 2020:  (5) /usr/lib/libc.so.6 : __libc_start_main+0x110 [0x768c1bb8]
terminate called after throwing an instance of 'vc4c::CompilationError'
  what():  Pre-compilation: Error in precompilation: error: unknown argument: '-target'

and

[E] Sat Jun 20 14:28:51 2020: Received signal: SIGABRT
[E] Sat Jun 20 14:28:51 2020:  (1) ~/dev/vc4cl-git/src/VC4C/build/src/libVC4CC.so.1.2 : +0xe33e8 [0x76cab3e8]
[E] Sat Jun 20 14:28:51 2020:  (2) /usr/lib/libc.so.6 : __default_rt_sa_restorer+0 [0x768d9300]
[E] Sat Jun 20 14:28:51 2020:  (3) /usr/lib/libc.so.6 : gsignal+0xb8 [0x768d7fcc]

happen at VC4CL "compilation time" and not at "runtime"?

@doe300
Copy link
Owner

doe300 commented Jun 21, 2020

happen at VC4CL "compilation time" and not at "runtime"?

Yes, because at the end of the VC4C compilation, the vc4c executable itself is invoked to precompile the VC4CLStdLib standard library implementation.

The error looks like distcc does not know the -target compilation flag.

Can you run the following command and paste the output?

<path/to/VC4C/executable>/vc4c --precompile-stdlib -o /tmp/ <path/to/VC4CLStdLib>/include/VC4CLStdLib.h

This is the command that will be invoked at the end of compilation. Maybe a more verbose log output gives is some useful information...

@bronze51
Copy link
Author

I got:

/usr/local/bin/vc4c --precompile-stdlib -o /tmp/ /usr/local/include/vc4cl-stdlib/VC4CLStdLib.h
[E] Sun Jun 21 15:04:19 2020: Errors in precompilation:
[E] Sun Jun 21 15:04:19 2020: error: unknown argument: '-target'
distcc[32110] ERROR: compile (null) on localhost failed
distcc[32109] ERROR: compile (null) on localhost failed

terminate called after throwing an instance of 'vc4c::CompilationError'
  what():  Pre-compilation: Error in precompilation: error: unknown argument: '-target'
distcc[32110] ERROR: compile (null) on localhost failed
distcc[32109] ERROR: compile (null) on localhost failed

[E] Sun Jun 21 15:04:19 2020: Received signal: SIGABRT

I can try to disable dictcc.

@bronze51
Copy link
Author

Alternatively, it is possible to bypass any front-end of clang from within vc4c?

@doe300
Copy link
Owner

doe300 commented Jun 22, 2020

Can you run /usr/local/bin/vc4c --verbose --precompile-stdlib -o /tmp/ /usr/local/include/vc4cl-stdlib/VC4CLStdLib.h?

Alternatively, it is possible to bypass any front-end of clang from within vc4c?

I don't understand what you mean. The clang front-end is hard-coded into the VC4C executable on compilation. It is used as I said before for OpenCL C -> LLVM IR compilation. If you at runtime never pass OpenCL C code to the VC4CL implementation, the front-end is never used.
If you can live with this limitation, you can also circumvent the above error by creating empty files for:

  • /usr/local/include/vc4cl-stdlib/VC4CLStdLib.h.pch
  • /usr/local/include/vc4cl-stdlib/VC4CLStdLib.bc

@bronze51
Copy link
Author

I don't understand what you mean. The clang front-end is hard-coded into the VC4C executable on compilation. It is used as I said before for OpenCL C -> LLVM IR compilation.

Sorry, I was unclear. For me distcc is a front-end of clang. Can't you bypass any front-end of clang and invoke clang directly from vc4c (i.e. hard code a path? Or have an optoin to identify clang's path)?

And:

/usr/local/bin/vc4c --verbose --precompile-stdlib -o /tmp/ /usr/local/include/vc4cl-stdlib/VC4CLStdLib.h
[D] Mon Jun 22 16:53:58 2020: Pre-compiling '/usr/local/include/vc4cl-stdlib/VC4CLStdLib.h' into '/tmp/'...
[I] Mon Jun 22 16:53:58 2020: Pre-compiling standard library with: /usr/lib/distcc/bin/clang -cc1 -triple spir-unknown-unknown -O3 -ffp-contract=off -cl-std=CL1.2 -cl-kernel-arg-info -cl-single-precision-constant -fgnu89-inline -Wno-all -Wno-gcc-compat -Wdouble-promotion -Wno-undefined-inline -Wno-unknown-attributes -x cl -emit-pch -o /tmp//VC4CLStdLib.h.pch /usr/local/include/vc4cl-stdlib/VC4CLStdLib.h
[E] Mon Jun 22 16:54:00 2020: Errors in precompilation:
[E] Mon Jun 22 16:54:00 2020: error: unknown argument: '-target'
distcc[891] ERROR: compile (null) on localhost failed
distcc[890] ERROR: compile (null) on localhost failed

terminate called after throwing an instance of 'vc4c::CompilationError'
  what():  Pre-compilation: Error in precompilation: error: unknown argument: '-target'
distcc[891] ERROR: compile (null) on localhost failed
distcc[890] ERROR: compile (null) on localhost failed

[E] Mon Jun 22 16:54:00 2020: Received signal: SIGABRT

@doe300
Copy link
Owner

doe300 commented Jun 23, 2020

Can't you bypass any front-end of clang and invoke clang directly from vc4c (i.e. hard code a path? Or have an optoin to identify clang's path)?

I am using a hardcoded path to clang (see the output of vc4c --version above), but for your setup this clang is the distcc front-end.

Given the error message, that it fails on the -target argument, which is not explicitly passed by VC4C to the clang (distcc front-end), I assume that distcc adds it before actually calling clang.

Can you reconfigure and rebuild VC4C with the CMake option -DCLANG_FOUND=<path/to/actual/clang/executable>? This sets/updates the hardcoded clang path and should prevent from the VC4C using distcc on runtime.

@bronze51
Copy link
Author

bronze51 commented Jun 23, 2020

I assume my clang (v10) is better than the required v3.9?
I got:

-- Using CMake 3.14+ FetchContent to include dependencies...
-- CLang compiler found: /usr/bin
CMake Error at cmake/clang.cmake:19 (string):
  string sub-command REGEX, mode REPLACE needs at least 6 arguments total to
  command.
Call Stack (most recent call first):
  CMakeLists.txt:120 (include)

CMake Error at cmake/clang.cmake:21 (message):
  CLang version is not supported, update your CLang to version 3.9+!
Call Stack (most recent call first):
  CMakeLists.txt:120 (include)

-- Clang opt found: /usr/bin/opt
-- LLVM-link found: /usr/bin/llvm-link
-- Compiling LLVM library front-end with LLVM in version 10.0.0 located in '/usr/lib'

cmake/clang.cmake, lines 14-25:

if(CLANG_FOUND)  
  message(STATUS "CLang compiler found: " ${CLANG_FOUND})
  # check whether CLang is installed in the version 3.9 or greater
  # https://stackoverflow.com/questions/16150888/cmake-branch-on-clang-version
  EXECUTE_PROCESS( COMMAND ${CLANG_FOUND} --version OUTPUT_VARIABLE clang_full_version_string )
  string (REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+).*" "\\1" CLANG_VERSION_STRING {clang_full_version_string})
  if (CLANG_VERSION_STRING VERSION_LESS 3.9)
    message(SEND_ERROR "CLang version ${CLANG_VERSION_STRING} is not supported, update your CLang to version 3.9+!")
  else()
    message(STATUS "Using enhanced OpenCL features of Clang 3.9+!")
    set(ADVANCED_OPENCL_FEATURES ON)
  endif()

clang --version

clang version 10.0.0
Target: armv7l-unknown-linux-gnueabihf
Thread model: posix
InstalledDir: /usr/bin

I tried to print ${clang_full_version}, with message(STATUS "CLang version: " ${clang_full_version}), but got an empty variable?

-- CLang version:

@doe300
Copy link
Owner

doe300 commented Jun 24, 2020

Strange, manual tests using "clang version 10.0.0" as clang_full_version_string work as expected.

The CMake variable clang_full_version should not exist. Can you just add some prints for clang_full_version_string as well as CLANG_VERSION_STRING?

As a side note, in the code snippet you pasted, in the line

string (REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+).*" "\\1" CLANG_VERSION_STRING {clang_full_version_string})

there should be a $ before the opening bracket:

string (REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+).*" "\\1" CLANG_VERSION_STRING ${clang_full_version_string})

@bronze51
Copy link
Author

bronze51 commented Jun 24, 2020

I made a mistake when setting CLANG_FOUND variable. I initially set it to -DCLANG_FOUND=/usr/bin/
When setting it to -DCLANG_FOUND=/usr/bin/clang things work better ...

Compiling, and:

[E] Wed Jun 24 11:24:18 2020: Errors in precompilation:
[E] Wed Jun 24 11:24:18 2020: error: error reading '/VC4CLStdLib.h'
1 error generated.

terminate called after throwing an instance of 'vc4c::CompilationError'
  what():  Pre-compilation: Error in precompilation: error: error reading '/VC4CLStdLib.h'
1 error generated.

[E] Wed Jun 24 11:24:18 2020: Received signal: SIGABRT

Clean build make no difference. WIll have to look at all the output but see nothing obvious.

@bronze51
Copy link
Author

bronze51 commented Jun 24, 2020

OK, I did find this message that surprised me:

CMake Warning:
  Manually-specified variables were not used by the project:

    CLANG_FOUND

That is maybe because it wasn't needed here (on the first line):

	cmake "$srcdir/VC4CLStdLib-master" -DCLANG_FOUND=/usr/bin/clang
	make
	cd $srcdir/VC4C-master/build
	cmake -DCMAKE_BUILD_TYPE=Release -DMULTI_THREADED=true "$srcdir/VC4C-master" -DCLANG_FOUND=/usr/bin/clang

@bronze51
Copy link
Author

To be clear, I am compiling this package: https://aur.archlinux.org/packages/vc4c-git/

Looking at the error error reading '/VC4CLStdLib.h' I copied "VC4CLStdLib.h" to the root and that changed the error to:

[E] Wed Jun 24 16:39:52 2020: Errors in precompilation:
[E] Wed Jun 24 16:39:52 2020: /VC4CLStdLib.h:17:10: fatal error: '_config.h' file not found
#include "_config.h"
         ^~~~~~~~~~~
1 error generated.

terminate called after throwing an instance of 'vc4c::CompilationError'

So the following line in the cmake file seems to have an empty variable for ${VC4CL_STDLIB_DIR}

install(CODE "execute_process(COMMAND ${VC4C_PROGRAM_LOCATION} --quiet --precompile-stdlib -o $DESTDIR/${CMAKE_INSTALL_PREFIX}/include/vc4cl-stdlib/ ${VC4CL_STDLIB_DIR}/VC4CLStdLib.h)")

@doe300
Copy link
Owner

doe300 commented Jun 25, 2020

To be able to build VC4C, you also need the sources for VC4CLStdLib. There are several options where the VC4C CMake autodetects the location of the VC4CLStdLib sources:

  • If you have a folder <some/path>/VC4C containing the VC4C sources and a folder <some/path>/VC4CLStdLib containing the VC4CLStdLib sources (i.e. both folders are siblings in the same parent folder)
  • If you have the VC4CLStdLib source folder inside the VC4C source folder

In any other constellation, you need to specify the VC4CL_STDLIB_DIR CMake variable manually and set it to the <path/to>/VC4CLStdLib/include directory.

Note: This is only required for building, on "normal" runtime, the VC4C compiler also checks the /usr/local/include/vc4cl-stdlib and /usr/include/vc4cl-stdlib folders for the precompiled standard library files.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants