Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Aug 2023 14:08:31 +0200
From:      Ronald Klop <ronald@FreeBSD.org>
To:        Brooks Davis <brooks@freebsd.org>
Cc:        freebsd-current@freebsd.org
Subject:   Re: building with llvm16 pkg fails in tests
Message-ID:  <d998b9df-56d9-c2be-bda0-ba20f79e4d4d@FreeBSD.org>
In-Reply-To: <dc5a55c4-b1da-995a-6add-2faf79a5cf2e@FreeBSD.org>
References:  <76ecade1-3f42-a314-825d-6f1ba0b2dcaa@FreeBSD.org> <ZN52DRc5DJ7ouyYp@spindle.one-eyed-alien.net> <dc5a55c4-b1da-995a-6add-2faf79a5cf2e@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 8/19/23 22:28, Ronald Klop wrote:
> On 8/17/23 21:33, Brooks Davis wrote:
>> On Thu, Aug 17, 2023 at 12:45:06PM +0200, Ronald Klop wrote:
>>> Hi,
>>>
>>> To save time on my Raspberry Pi I would like to build FreeBSD using a llvm pkg instead of llvm in the tree.
>>>
>>> My /etc/make.conf:
>>> WITHOUT_TOOLCHAIN=yes
>>> LD=/usr/local/llvm16/bin/ld.lld
>>> CC=/usr/local/llvm16/bin/clang
>>> CXX=/usr/local/llvm16/bin/clang++
>>> CPP=/usr/local/llvm16/bin/clang-cpp
>>> OBJCOPY=/usr/local/llvm16/bin/llvm-objcopy
>>>
>>> #WITHOUT_CLEAN=yes
>>>
>>>
>>> This fails in:
>>>
>>> /usr/local/llvm16/bin/clang++ -O2 -pipe -fno-common -fPIE -Wno-format-zero-length -nobuiltininc -idirafter /usr/local/llvm16/lib/clang/16/include -fstack-protector-strong -Wsystem-headers -Werror -Wall -Wno-format-y2k -W -Wno-unused-parameter -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wshadow -Wunused-parameter -Wcast-align -Wchar-subscripts -Wdate-time -Wmissing-variable-declarations -Wno-empty-body -Wno-string-plus-int -Wno-unused-const-variable -Wno-error=unused-but-set-parameter -O0 -g0 -Qunused-arguments -I/usr/obj/usr/src/amd64.amd64/tmp/usr/include/private -I/usr/src/contrib/googletest/googlemock/include -I/usr/src/contrib/googletest/googlemock -I/usr/src/contrib/googletest/googletest/include -I/usr/src/contrib/googletest/googletest -I/usr/obj/usr/src/amd64.amd64/tmp/usr/include/private -DGTEST_HAS_POSIX_RE=1 -DGTEST_HAS_PTHREAD=1 -DGTEST_HAS_STREAM_REDIRECTION=1 -frtti -Wno-deprecated-copy -Wno-signed-unsigned-wchar -DGTEST_HAS_POSIX_RE=1 
>>> -DGTEST_HAS_PTHREAD=1 -DGTEST_HAS_STREAM_REDIRECTION=1 -frtti -Wno-deprecated-copy -Wno-signed-unsigned-wchar -fPIE -std=c++14 -Wno-deprecated-copy -Wno-error=inconsistent-missing-override -Wno-error=missing-variable-declarations -Wno-error=sign-compare -Wno-error=unused-parameter -Wno-c++11-extensions  -Wl,-zrelro -pie  --ld-path=/usr/local/llvm16/bin/ld.lld -o gmock-actions_test  gmock-actions_test.o -lprivategmock_main -lprivategmock -lprivategtest
>>> ld.lld: error: undefined symbol: testing::internal::DeathTest::Create(char const*, testing::Matcher<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&>, char const*, int, testing::internal::DeathTest**)
>>>>>> referenced by gmock-actions_test.cc
>>>>>>                gmock-actions_test.o:(testing::(anonymous namespace)::BuiltInDefaultValueDeathTest_IsUndefinedForReferences_Test::TestBody())
>>>>>> referenced by gmock-actions_test.cc
>>>>>>                gmock-actions_test.o:(testing::(anonymous namespace)::BuiltInDefaultValueDeathTest_IsUndefinedForReferences_Test::TestBody())
>>>>>> referenced by gmock-actions_test.cc
>>>>>>                gmock-actions_test.o:(testing::(anonymous namespace)::BuiltInDefaultValueDeathTest_IsUndefinedForNonDefaultConstructibleType_Test::TestBody())
>>>>>> referenced 4 more times
>>>
>>> ld.lld: error: undefined symbol: testing::Expectation::Expectation(std::__1::shared_ptr<testing::internal::ExpectationBase> const&)
>>>
>>>
>>> Any thoughts on how to fix this?
>>> Compiling with the in tree llvm does work properly.
>>
>> Did it work with exactly this git revision?  I suspect an issue with the
>> recent google test update rather than an llvm16 issue.  Note that for
>> every sync to github we build the tree with the llvm16 port (all be it
>> on amd64 by default).
>>
>> It's worth noting one difference between your configuration and the
>> CI one:  We don't set CC and friends directly.  Instead we use
>> CROSS_TOOLCHAIN=llvm16.
>>
>> -- Brooks
> 
> 
> Hi,
> 
> What I would like to accomplish is this:
> 
> CROSS_TOOLCHAIN=llvm16
> WITHOUT_TOOLCHAIN=yes
> 
> yes | make delete-old delete-old-libs
> make buildworld buildkernel
> 
> So I can run a system with only external toolchain.
> But doing this quickly errors out because /usr/bin/cc does not exist and the build uses that even though CROSS_TOOLCHAIN is set. To circumvent that I set CC, etc. instead of CROSS_TOOLCHAIN.
> 
> Regards,
> Ronald.
> 


Hi,

I found what was going on. Passing CC=/usr/local/llvm16/bin/clang does not pass the -target, --sysroot and -B option. If I set those in CFLAGS everything compiles fine.

What I do now is this:

pkg -j ${JAIL_NAME} install -y ${CROSS_TOOLCHAIN} byacc

jexec ${JAIL_NAME} sh -c "yes | /usr/bin/make CC=${LLVM_DIR}/bin/clang LD=${LLVM_DIR}/bin/ld.lld -C /usr/src delete-old delete-old-libs"

cd ${JAIL_PATH}/usr/bin && ln -fs ../local/llvm16/bin/clang cc
cd ${JAIL_PATH}/usr/bin && ln -fs ../local/llvm16/bin/clang CC
cd ${JAIL_PATH}/usr/bin && ln -fs ../local/llvm16/bin/clang++ c++
cd ${JAIL_PATH}/usr/bin && ln -fs ../local/llvm16/bin/clang-cpp cpp
cd ${JAIL_PATH}/usr/bin && ln -fs ../local/llvm16/bin/llvm-objcopy objcopy
cd ${JAIL_PATH}/usr/bin && ln -fs ../local/llvm16/bin/ld
cd ${JAIL_PATH}/usr/bin && ln -fs ../local/bin/yacc

jexec ${JAIL_NAME} /usr/bin/make -C /usr/src -j${NUM_CPUS} CROSS_TOOLCHAIN=llvm16 WITHOUT_TOOLCHAIN=yes buildworld buildkernel


This builds fine also. Because CC is not set SYSROOT is just the default.

Any advice on how to make set CC and use the proper sysroot instead of the (ugly) symlinking?
And why do parts of buildworld use CROSS_TOOLCHAIN and other parts don't?

Regards,
Ronald.




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?d998b9df-56d9-c2be-bda0-ba20f79e4d4d>