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