Hi all,
I'm building v8 with gn, and embedding in my cmake.
I've upgraded to 12.3.x and I'm getting problems with
v8_generate_external_defines_header=true
These problems also occur in the 12.1 and 12.2 series.
I don't see anyone mentioning this flag anywhere, how are people managing
their build flags?
Anyway, back to the problems:
There are several stages of problems, actually.
Stage 1: Can't find the generated header file.
Stage 2: Build doesn't work with generated header files (order of #includes
are wrong)
Stage 3: Success if I adjust BUILD.gn to include headers on command line
AND header file.
*Stage 1: Can't find the generated header file.*
Note the parameter is -Igen but it should be -Igen/include
[1/3906] CXX obj/cppgc_base/name-trait.o
FAILED: obj/cppgc_base/name-trait.o
../../third_party/llvm-build/Release+Asserts/bin/clang++ -MMD -MF
obj/cppgc_base/name-trait.o.d -DUSE_UDEV -DUSE_AURA=1 -DUSE_GLIB=1
-DUSE_OZONE=1 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS
-D_FORTIFY_SOURCE=2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE -D_GNU_SOURCE
-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE
-DCR_CLANG_REVISION=\"llvmorg-18-init-16072-gc4146121e940-5\"
-DCR_SYSROOT_KEY=20230611T210420Z-2 -DNDEBUG -DNVALGRIND
-DDYNAMIC_ANNOTATIONS_ENABLED=0 -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64
-DENABLE_GDB_JIT_INTERFACE -DV8_INTL_SUPPORT
-DV8_ATOMIC_OBJECT_FIELD_WRITES -DV8_ENABLE_LAZY_SOURCE_POSITIONS
-DV8_SHARED_RO_HEAP -DV8_WIN64_UNWINDING_INFO
-DV8_ENABLE_REGEXP_INTERPRETER_THREADED_DISPATCH -DV8_SHORT_BUILTIN_CALLS
-DV8_EXTERNAL_CODE_SPACE -DV8_ENABLE_SPARKPLUG -DV8_ENABLE_MAGLEV
-DV8_ENABLE_TURBOFAN -DV8_ENABLE_WEBASSEMBLY
-DV8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA -DV8_ALLOCATION_FOLDING
-DV8_ALLOCATION_SITE_TRACKING -DV8_ADVANCED_BIGINT_ALGORITHMS
-DV8_STATIC_ROOTS -DV8_USE_ZLIB -DV8_USE_LIBM_TRIG_FUNCTIONS
-DV8_ENABLE_WASM_SIMD256_REVEC -DV8_ENABLE_MAGLEV_GRAPH_PRINTER
-DV8_ENABLE_BUILTIN_JUMP_TABLE_SWITCH -DV8_ENABLE_EXTENSIBLE_RO_SNAPSHOT
-DV8_GN_HEADER -DV8_TARGET_ARCH_X64 -DV8_HAVE_TARGET_OS
-DV8_TARGET_OS_LINUX -I../.. *-Igen* -I../../include -Wall -Wextra
-Wimplicit-fallthrough -Wextra-semi -Wunreachable-code-aggressive
-Wthread-safety -Wno-missing-field-initializers -Wno-unused-parameter
-Wno-psabi -Wloop-analysis -Wno-unneeded-internal-declaration
-Wenum-compare-conditional -Wno-ignored-pragma-optimize
-Wno-deprecated-builtins -Wno-bitfield-constant-conversion
-Wno-deprecated-this-capture -Wno-invalid-offsetof -Wno-vla-extension
-Wno-thread-safety-reference-return -Wshadow -Werror
-fno-delete-null-pointer-checks -fno-ident -fno-strict-aliasing
-fstack-protector -funwind-tables -fPIC -pthread -fcolor-diagnostics
-fmerge-all-constants
-fcrash-diagnostics-dir=../../tools/clang/crashreports -mllvm
-instcombine-lower-dbg-declare=0 -mllvm
-split-threshold-for-reg-with-hint=0 -ffp-contract=off -m64 -msse3
-Wno-builtin-macro-redefined -D__DATE__= -D__TIME__= -D__TIMESTAMP__=
-ffile-compilation-dir=. -no-canonical-prefixes -fno-omit-frame-pointer -g0
-Wheader-hygiene -Wstring-conversion -Wtautological-overlap-compare
-Wmissing-field-initializers -Wunreachable-code -Wno-shadow
-Wctad-maybe-unsupported -Wshorten-64-to-32 -Wno-invalid-offsetof -O3
-fdata-sections -ffunction-sections -fno-unique-section-names
-fno-math-errno -fvisibility=default -Wexit-time-destructors
-Wno-c++11-narrowing-const-reference -std=c++20 -Wno-trigraphs
-gsimple-template-names -fno-exceptions -fno-rtti
--sysroot=../../build/linux/debian_bullseye_amd64-sysroot -c
../../src/heap/cppgc/name-trait.cc -o obj/cppgc_base/name-trait.o
In file included from ../../src/heap/cppgc/name-trait.cc:5:
In file included from ../../include/cppgc/internal/name-trait.h:12:
In file included from ../../include/cppgc/name-provider.h:8:
../../include/v8config.h:10:2: error: Missing v8-gn.h. The configuration
for v8 is missing from the include path. Add it with -I<path> to the
command line
10 | #error Missing v8-gn.h. The configuration for v8 is missing from
the include \
| ^
../../include/v8config.h:13:10: fatal error: 'v8-gn.h' file not found
13 | #include "v8-gn.h" // NOLINT(build/include_directory)
| ^~~~~~~~~
2 errors generated.
To get past this step, I adjusted BUILD.gn:746
include_dirs = [
....
"$target_gen_dir*/include*"
]
*Stage 2: Build fails with external defines file*
$ ninja -C out.gn/x64.release.sample/ v8_monolith
ninja: Entering directory `out.gn/x64.release.sample/'
[1075/1084] LINK ./mksnapshot
FAILED: mksnapshot
"python3" "../../build/toolchain/gcc_link_wrapper.py"
--output="./mksnapshot" --
../../third_party/llvm-build/Release+Asserts/bin/clang++ -pie -Werror
-fuse-ld=lld -Wl,--fatal-warnings -Wl,--build-id -fPIC -Wl,-z,noexecstack
-Wl,-z,relro -Wl,-z,now -Wl,--icf=all -Wl,--color-diagnostics
-Wl,--undefined-version -Wl,--no-call-graph-profile-sort -m64
-no-canonical-prefixes -Wl,-z,defs -Wl,--as-needed
--sysroot=../../build/linux/debian_bullseye_amd64-sysroot -rdynamic -pie
-Wl,--disable-new-dtags -Wl,-O2 -Wl,--gc-sections -o "./mksnapshot"
-Wl,--start-group @"./mksnapshot.rsp" -Wl,--end-group -latomic -ldl
-lpthread -lrt
ld.lld: error: undefined symbol:
cppgc::internal::OldToNewRememberedSet::AddSlot(void*)
>>> referenced by write-barrier.cc
>>> obj/cppgc_base/write-barrier.o:(void
cppgc::internal::WriteBarrier::CombinedWriteBarrierSlow<(cppgc::internal::WriteBarrierSlotType)1>(void
const*))
>>> referenced by write-barrier.cc
>>> obj/cppgc_base/write-barrier.o:(void
cppgc::internal::WriteBarrier::CombinedWriteBarrierSlow<(cppgc::internal::WriteBarrierSlotType)0>(void
const*))
>>> referenced by write-barrier.cc
>>>
obj/cppgc_base/write-barrier.o:(cppgc::internal::WriteBarrier::GenerationalBarrierSlow(cppgc::internal::CagedHeapLocalData
const&, cppgc::internal::AgeTable const&, void const*, unsigned long,
cppgc::HeapHandle*))
I did some poking, and the code is seeing different #define values for the
key settings.
I have solved this problem in the past, in the 11.x series IIRC,
by patching a bunch of v8 source files to rearrange the #include order so
the v8-gn.h file gets included earlier.
This time, I solved it by adjusting BUILD.gn again, around line 988
config("cppgc_header_features") {
visibility = [ ":*" ]
if (v8_generate_external_defines_header) {
* defines = enabled_external_cppgc_defines defines += [
"V8_GN_HEADER" ]*
} else {
defines = enabled_external_cppgc_defines
}
}
ie define BOTH V8_GN_HEADER *and* all of the defines so they are added to
the command line, as usual.
cheers,
Paul
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups
"v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/v8-dev/05208cc2-cc6f-4b42-89d6-eefaed2acbf8n%40googlegroups.com.