_C_DEFINES_ANDROID= _C_DEFINES_ANDROID_OTHERWISE= when ($OS_ANDROID == "yes") { _C_DEFINES_ANDROID=-DANDROID_FAKEID=$ANDROID_FAKEID } otherwise { # There is no usable _FILE_OFFSET_BITS=64 support in Androids until API 21. And it's incomplete until at least API 24. # https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md # Arcadia have API 16 for 32-bit Androids. _C_DEFINES_ANDROID_OTHERWISE=-D_FILE_OFFSET_BITS=64 } _C_DEFINES_GNU_SOURCE= when ($OS_LINUX == "yes" || $OS_ANDROID == "yes" || $OS_CYGWIN == "yes") { _C_DEFINES_GNU_SOURCE=-D_GNU_SOURCE } _C_DEFINES_CLANG_LINUX_X86_64= when ($CLANG == "yes" && $OS_LINUX == "yes" && $ARCH_X86_64 == "yes") { _C_DEFINES_CLANG_LINUX_X86_64=-D_YNDX_LIBUNWIND_ENABLE_EXCEPTION_BACKTRACE } _C_DEFINES_IOS= when ($OS_IOS == "yes") { _C_DEFINES_IOS=-D_XOPEN_SOURCE -D_DARWIN_C_SOURCE } _C_DEFINES_WITH_VALGRIND= when ($WITH_VALGRIND == "yes") { _C_DEFINES_WITH_VALGRIND=-DWITH_VALGRIND=1 } C_DEFINES =-DFAKEID=$CPP_FAKEID C_DEFINES+=$_C_DEFINES_ANDROID C_DEFINES+=\ -DARCADIA_ROOT=${ARCADIA_ROOT} \ -DARCADIA_BUILD_ROOT=${ARCADIA_BUILD_ROOT} \ -D_THREAD_SAFE \ -D_PTHREADS \ -D_REENTRANT \ -D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES \ -D_LARGEFILE_SOURCE \ -D__STDC_CONSTANT_MACROS \ -D__STDC_FORMAT_MACROS C_DEFINES+=$_C_DEFINES_ANDROID_OTHERWISE C_DEFINES+=$_C_DEFINES_GNU_SOURCE C_DEFINES+=$_C_DEFINES_CLANG_LINUX_X86_64 C_DEFINES+=$_C_DEFINES_IOS C_DEFINES+=$_C_DEFINES_WITH_VALGRIND C_DEFINES+=$_C_DEFINES_NDEBUG _C_FOPTIONS_INIT_ARRAY= when ($CLANG == "yes" && $OS_LINUX == "yes") { # Use .init_array instead of .ctors (default for old clang versions) # See: https://maskray.me/blog/2021-11-07-init-ctors-init-array _C_FOPTIONS_INIT_ARRAY=-fuse-init-array } _C_FOPTIONS_COLOR= _C_FOPTIONS_ALIGNED_ALLOCATION= when ($CLANG == "yes") { # Set up output colorization _C_FOPTIONS_COLOR=-fcolor-diagnostics # Enable aligned allocation _C_FOPTIONS_ALIGNED_ALLOCATION=-faligned-allocation } elsewhen ($GCC == "yes") { # Set up output colorization _C_FOPTIONS_COLOR=-fdiagnostics-color=always # It looks like there is no way to enable aligned allocation in gcc } _C_FOPTIONS_MAPSMOBI_ARM= when ($OS_IOS == "yes") { when ($MAPSMOBI_BUILD_TARGET == "yes" && $ARCH_ARM == "yes") { _C_FOPTIONS_MAPSMOBI_ARM=-fembed-bitcode } } _C_WARNINGS_CLANG= _CXX_WARNINGS_CLANG= when ($CLANG == "yes") { _CXX_WARNINGS_CLANG=\ -Wimport-preprocessor-directive-pedantic \ -Wno-ambiguous-reversed-operator \ -Wno-defaulted-function-deleted \ -Wno-deprecated-anon-enum-enum-conversion \ -Wno-deprecated-enum-enum-conversion \ -Wno-deprecated-enum-float-conversion \ -Wno-deprecated-volatile \ -Wno-pessimizing-move \ -Wno-range-loop-construct \ -Wno-return-std-move \ -Wno-undefined-var-template # -Wno-unknown-warning-option # For nvcc to accept the above. _C_WARNINGS_CLANG=\ -Wno-implicit-const-int-float-conversion \ -Wno-unknown-warning-option } _C_FOPTIONS_GCC= when ($GCC == "yes") { _C_FOPTIONS_GCC=-fno-delete-null-pointer-checks -fabi-version=8 } _C_FOPTIONS_IOS= when ($OS_IOS != "yes") { # Split all functions and data into separate sections for DCE and ICF linker passes # NOTE: iOS build uses -fembed-bitcode which conflicts with -ffunction-sections (only relevant for ELF targets) _C_FOPTIONS_IOS=-ffunction-sections -fdata-sections } _C_FOPTIONS_DEBUG= when ($_BUILD_DEBUG == "yes") { _C_FOPTIONS_DEBUG=$FSTACK } _C_FLAGS_RELEASE= _C_FOPTIONS_RELEASE= _OPTIMIZE_RELEASE= when ($_BUILD_RELEASE == "yes") { _C_FLAGS_RELEASE=$OPTIMIZE when ($_BUILD_SIZE_OPTIMIZED == "yes") { # -Oz is clang's more size-aggressive version of -Os # For ARM specifically, clang -Oz is on par with gcc -Os: # https://github.com/android/ndk/issues/133#issuecomment-365763507 when($CLANG == "yes") { _OPTIMIZE_RELEASE=-Oz } otherwise { _OPTIMIZE_RELEASE=-Os } # Generate sections with address significance tables for ICF linker pass when($CLANG == "yes") { _C_FOPTIONS_RELEASE=-faddrsig } } otherwise { _OPTIMIZE_RELEASE=-O3 } } _C_FOPTIONS_PROFILER= when ($_BUILD_PROFILER_TYPE != "") { when ($_BUILD_PROFILER_TYPE in ["generic", "gprof"]) { _C_FOPTIONS_PROFILER=-fno-omit-frame-pointer } } _C_FOPTIONS = # Enable C++ exceptions (and allow them to be throw through pure C code) _C_FOPTIONS+=-fexceptions # Enable standard-conforming behavior and generate duplicate symbol error in case of duplicated global constants. # See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85678#c0 _C_FOPTIONS+=-fno-common _C_FOPTIONS+=$_C_FOPTIONS_INIT_ARRAY _C_FOPTIONS+=$_C_FOPTIONS_COLOR _C_FOPTIONS+=$_C_FOPTIONS_ALIGNED_ALLOCATION _C_FOPTIONS+=$_C_FOPTIONS_MAPSMOBI_ARM _C_FOPTIONS+=$_C_FOPTIONS_DEBUG _C_FOPTIONS+=$_C_FOPTIONS_RELEASE _C_FOPTIONS+=$_C_FOPTIONS_PROFILER _C_FOPTIONS+=$_C_FOPTIONS_GCC _C_FOPTIONS+=$_C_FOPTIONS_IOS # Enable default warnings subset _C_WARNINGS =-Wall -Wextra # Disable some warnings which will fail compilation at the time _C_WARNINGS+=-Wno-parentheses _C_WARNINGS+=$_C_WARNINGS_CLANG # Issue a warning if certain overload is hidden due to inheritance _CXX_WARNINGS =-Woverloaded-virtual _CXX_WARNINGS+=$_CXX_WARNINGS_CLANG _C_FLAGS_ARCH= when ($ARCH_I386 == "yes") { _C_FLAGS_ARCH=-m32 } when ($ARCH_X86_64 == "yes") { _C_FLAGS_ARCH=-m64 } _C_FLAGS_FAST_DEBUG= when ($_BUILD_FAST_DEBUG == "yes") { _C_FLAGS_FAST_DEBUG=-Og } _C_DEFINES_NDEBUG=-UNDEBUG when ($_BUILD_WITH_NDEBUG == "yes") { _C_DEFINES_NDEBUG=-DNDEBUG } _C_FLAGS_PROFILER= when ($_BUILD_PROFILER_TYPE == "gprof") { _C_FLAGS_PROFILER=-pg } _C_FLAGS=\ $CL_DEBUG_INFO $CL_DEBUG_INFO_DISABLE_CACHE__NO_UID__ $_C_FLAGS_ARCH_OPT -pipe _C_FLAGS+=$_C_FLAGS_ARCH _C_FLAGS+=$_C_FLAGS_FAST_DEBUG _C_FLAGS+=$_C_FLAGS_RELEASE _C_FLAGS+=$_C_FLAGS_PROFILER _SFDL_FLAGS=-E -C -x c++ when ($CLANG == "yes") { _SFDL_FLAGS+=-Qunused-arguments } _DEBUG_INFO_FLAGS=-g when ($OS_LINUX == "yes") { _DEBUG_INFO_FLAGS=-g -ggnu-pubnames } _CROSS_SUFFIX=.pic when ($FORCE_NO_PIC == "yes") { _CROSS_SUFFIX= } C_COMPILER=${quo:C_COMPILER_UNQUOTED} OPTIMIZE=$_OPTIMIZE_RELEASE FSTACK=-fstack-protector DUMP_DEPS= GCC_PREPROCESSOR_OPTS=$DUMP_DEPS $C_DEFINES C_WARNING_OPTS=$_C_WARNINGS CXX_WARNING_OPTS=$_CXX_WARNINGS # PIE is only valid for executables, while PIC implies a shared library # `-pie` with a shared library is either ignored or fails to link when ($PIC == "yes") { CFLAGS+=-fPIC LDFLAGS+=-fPIC } elsewhen ($PIE == "yes") { CFLAGS+=-fPIE LDFLAGS+=-fPIE -pie } CFLAGS+=$_C_FLAGS $DEBUG_INFO_FLAGS $_C_FOPTIONS $C_WARNING_OPTS $GCC_PREPROCESSOR_OPTS $USER_CFLAGS $USER_CFLAGS_GLOBAL CXXFLAGS+=$CFLAGS $_CXX_STD $CXX_WARNING_OPTS $USER_CXXFLAGS $USER_CXXFLAGS_GLOBAL CONLYFLAGS+=$USER_CONLYFLAGS $USER_CONLYFLAGS_GLOBAL CXX_COMPILER=${quo:CXX_COMPILER_UNQUOTED} NOGCCSTACKCHECK=yes SFDL_FLAG=$_SFDL_FLAGS -o $SFDL_TMP_OUT WERROR_FLAG=-Werror DEBUG_INFO_FLAGS=$_DEBUG_INFO_FLAGS when ($NO_WSHADOW == "yes") { C_WARNING_OPTS += -Wno-shadow } # Though -w is intended to switch off all the warnings, # it does not switch at least -Wregister and -Wreserved-user-defined-literal under clang. # # Use -Wno-everything to force warning suppression. when ($NO_COMPILER_WARNINGS == "yes") { C_WARNING_OPTS = -w CXX_WARNING_OPTS = -Wno-everything } when ($NO_OPTIMIZE == "yes") { OPTIMIZE = -O0 } when ($SAVE_TEMPS == "yes") { CXXFLAGS += -save-temps } when ($NOGCCSTACKCHECK != "yes") { FSTACK += -fstack-check } when ($FORCE_CONSISTENT_DEBUG == "yes") { when ($CLANG == "yes") { CL_DEBUG_INFO=-fdebug-prefix-map=${ARCADIA_BUILD_ROOT}=/-B -fdebug-prefix-map=${ARCADIA_ROOT}=/-S -fdebug-prefix-map=$(TOOL_ROOT)=/-T -Xclang -fdebug-compilation-dir -Xclang /tmp } otherwise { CL_DEBUG_INFO=-fdebug-prefix-map=${ARCADIA_BUILD_ROOT}=/-B -fdebug-prefix-map=${ARCADIA_ROOT}=/-S -fdebug-prefix-map=$(TOOL_ROOT)=/-T } YASM_DEBUG_INFO=--replace=${ARCADIA_BUILD_ROOT}=/-B --replace=${ARCADIA_ROOT}=/-S --replace=$(TOOL_ROOT)=/-T } elsewhen ($CONSISTENT_DEBUG == "yes") { when ($CLANG == "yes") { CL_DEBUG_INFO_DISABLE_CACHE__NO_UID__=-fdebug-prefix-map=${ARCADIA_BUILD_ROOT}=/-B -fdebug-prefix-map=${ARCADIA_ROOT}=/-S -fdebug-prefix-map=$(TOOL_ROOT)=/-T -Xclang -fdebug-compilation-dir -Xclang /tmp } otherwise { CL_DEBUG_INFO_DISABLE_CACHE__NO_UID__=-fdebug-prefix-map=${ARCADIA_BUILD_ROOT}=/-B -fdebug-prefix-map=${ARCADIA_ROOT}=/-S -fdebug-prefix-map=$(TOOL_ROOT)=/-T } YASM_DEBUG_INFO_DISABLE_CACHE__NO_UID__=--replace=${ARCADIA_BUILD_ROOT}=/-B --replace=${ARCADIA_ROOT}=/-S --replace=$(TOOL_ROOT)=/-T } elsewhen ($CONSISTENT_DEBUG_LIGHT == "yes") { when ($CLANG == "yes") { CL_DEBUG_INFO_DISABLE_CACHE__NO_UID__=-fdebug-prefix-map=${ARCADIA_BUILD_ROOT}=/-B -Xclang -fdebug-compilation-dir -Xclang /tmp } otherwise { CL_DEBUG_INFO_DISABLE_CACHE__NO_UID__=-fdebug-prefix-map=${ARCADIA_BUILD_ROOT}=/-B } YASM_DEBUG_INFO_DISABLE_CACHE__NO_UID__=--replace=${ARCADIA_BUILD_ROOT}=/-B } when ($FORCE_CONSISTENT_BUILD == "yes") { CL_MACRO_INFO=-Wno-builtin-macro-redefined -D__DATE__=\""Sep 31 2019\"" -D__TIME__=\"00:00:00\" -fmacro-prefix-map=${ARCADIA_BUILD_ROOT}/= -fmacro-prefix-map=${ARCADIA_ROOT}/= -fmacro-prefix-map=$(TOOL_ROOT)/= } elsewhen ($CONSISTENT_BUILD == "yes") { CL_MACRO_INFO_DISABLE_CACHE__NO_UID__=-Wno-builtin-macro-redefined -D__DATE__=\""Sep 31 2019\"" -D__TIME__=\"00:00:00\" -fmacro-prefix-map=${ARCADIA_BUILD_ROOT}/= -fmacro-prefix-map=${ARCADIA_ROOT}/= -fmacro-prefix-map=$(TOOL_ROOT)/= } _CFLAGS_ARCH_I386= when ($ARCH_I386 == "yes" && $ARCH_I686 != "yes") { _CFLAGS_ARCH_I386=-march=pentiumpro -mtune=pentiumpro } CFLAGS+=$_CFLAGS_ARCH_I386 BC_CFLAGS+=$CFLAGS BC_CXXFLAGS+=$CXXFLAGS C_DEFINES+=-D__LONG_LONG_SUPPORTED OBJ_CROSS_SUF=$OBJ_SUF$_CROSS_SUFFIX OBJECT_SUF=$OBJ_SUF$_CROSS_SUFFIX.o GCC_COMPILE_FLAGS=$EXTRA_C_FLAGS -c -o $_COMPILE_OUTPUTS ${pre=-I:_C__INCLUDE} EXTRA_COVERAGE_OUTPUT=${output;noauto;hide;suf=${OBJECT_SUF}.gcno:SRC} CLANG_TIDY_OUTPUT_FILE=${output;noauto;suf=${OBJECT_SUF}.tidyjson:SRC} YNDEXER_OUTPUT_FILE=${output;noauto;suf=${OBJECT_SUF}${COMPILE_OUT_SUFFIX}.ydx.pb2:SRC} when ($DUMP_COMPILER_DEPS == "yes") { DUMP_DEPS=-MD ${output;hide;noauto;suf=${OBJ_SUF}.o.d:SRC} } elsewhen ($DUMP_COMPILER_DEPS_FAST == "yes") { DUMP_DEPS=-E -M -MF ${output;noauto;suf=${OBJ_SUF}.o.d:SRC} } _COMPILER_TIME_TRACE_GRANULARITY=500 when ($TIME_TRACE_GRANULARITY && $TIME_TRACE_GRANULARITY != "") { _COMPILER_TIME_TRACE_GRANULARITY=$TIME_TRACE_GRANULARITY } _COMPILER_TIME_TRACE_FLAGS= _COMPILER_TIME_TRACE_POSTPROCESS= when (($TIME_TRACE == "yes" || $COMPILER_TIME_TRACE == "yes") && $CLANG == "yes" && $_TC_VERSION_AT_LEAST_9 == "yes") { _COMPILER_TIME_TRACE_FLAGS=-ftime-trace -ftime-trace-granularity=$_COMPILER_TIME_TRACE_GRANULARITY _COMPILER_TIME_TRACE_POSTPROCESS=$YMAKE_PYTHON ${input:"build/scripts/find_time_trace.py"} $_COMPILE_OUTPUTS $_COMPILE_TIME_TRACE_OUTPUTS } _C_CPP_KV_STYLE=${hide;kv:"p CC"} ${hide;kv:"pc green"} _CPP_ARGS=\ $CLANG_TIDY_ARGS \ $YNDEXER_ARGS \ $CXX_COMPILER \ $C_FLAGS_PLATFORM \ $GCC_COMPILE_FLAGS \ $CXXFLAGS \ $CL_MACRO_INFO \ $CL_MACRO_INFO_DISABLE_CACHE__NO_UID__ \ $_COMPILER_TIME_TRACE_FLAGS \ $EXTRA_OUTPUT \ $SRCFLAGS \ $_LANG_CFLAGS_VALUE \ ${input:SRC} \ $TOOLCHAIN_ENV \ $YNDEXER_OUTPUT \ && $_COMPILER_TIME_TRACE_POSTPROCESS \ $_C_CPP_KV_STYLE _C_ARGS=\ $CLANG_TIDY_ARGS \ $YNDEXER_ARGS \ $C_COMPILER \ $C_FLAGS_PLATFORM \ $GCC_COMPILE_FLAGS \ $CFLAGS \ $CL_MACRO_INFO \ $CL_MACRO_INFO_DISABLE_CACHE__NO_UID__ \ $_COMPILER_TIME_TRACE_FLAGS \ $CONLYFLAGS \ $EXTRA_OUTPUT \ $SRCFLAGS \ ${input:SRC} \ $TOOLCHAIN_ENV \ $YNDEXER_OUTPUT \ $_C_CPP_KV_STYLE ### _SRC_C_NODEPS_CMD is obtained from _C_ARGS by filtering the following elements: ### ${input:SRC} ### $CL_MACRO_INFO ### $CL_MACRO_INFO_DISABLE_CACHE__NO_UID__ ### $CLANG_TIDY_ARGS ### $EXTRA_OUTPUT ### $EXTRA_COVERAGE_OUTPUT ### $SRCFLAGS ### $YNDEXER_ARGS ### $YNDEXER_OUTPUT ### ### $GCC_COMPILE_FLAGS is substituted for $EXTRA_C_FLAGS -c -o ${OUTFILE} ${SRC} ${pre=-I:INC} _SRC_C_NODEPS_CMD=\ $C_COMPILER \ $C_FLAGS_PLATFORM \ $EXTRA_C_FLAGS -c -o ${OUTFILE} ${SRC} ${pre=-I:INC} \ $CFLAGS \ $CONLYFLAGS \ $TOOLCHAIN_ENV \ $_C_CPP_KV_STYLE _SRC_CPP_CMD=$_CPP_ARGS _SRC_C_CMD=$_C_ARGS _SRC_M_CMD=$SRC_c($SRC $SRCFLAGS) _SRC_MASM_CMD=$_EMPTY_CMD # fuzzing configuration when ($CLANG == "yes") { when ($_TC_VERSION_AT_LEAST_12 == "yes") { LIBFUZZER_PATH=contrib/libs/libfuzzer12 } }