option(BUILD_SHARED_LIBS "Build and use shared libraries" 0) option(CREATE_COMPILATION_DATABASE_LINK "Create compilation database link. Implies CMAKE_EXPORT_COMPILE_COMMANDS" 1) if (CREATE_COMPILATION_DATABASE_LINK) set(CMAKE_EXPORT_COMPILE_COMMANDS 1) endif () if (NOT DEFINED BAZEL_BIN) set(BAZEL_BIN "bazelisk") endif () if (NOT DEFINED CODEQL_BAZEL_WORKSPACE) set(CODEQL_BAZEL_WORKSPACE "codeql") endif () macro(bazel) message(STATUS "================================================================================") message(STATUS "Running: ${BAZEL_BIN} ${BAZEL_STARTUP_OPTIONS} ${ARGN}") message(STATUS "================================================================================") execute_process(COMMAND ${BAZEL_BIN} ${BAZEL_STARTUP_OPTIONS} ${ARGN} COMMAND_ERROR_IS_FATAL ANY OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) endmacro() macro(bazel_even_if_failing) message(STATUS "================================================================================") message(STATUS "Running: ${BAZEL_BIN} ${BAZEL_STARTUP_OPTIONS} ${ARGN}") message(STATUS "================================================================================") execute_process(COMMAND ${BAZEL_BIN} ${BAZEL_STARTUP_OPTIONS} ${ARGN} OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) endmacro() bazel(info workspace OUTPUT_VARIABLE BAZEL_WORKSPACE) bazel(info output_base OUTPUT_VARIABLE BAZEL_OUTPUT_BASE) set(BAZEL_EXEC_ROOT ${BAZEL_OUTPUT_BASE}/execroot/_main) set(BAZEL_BUILD_OPTIONS --nocheck_visibility --keep_going) macro(include_generated BAZEL_TARGET) bazel(build ${BAZEL_TARGET} ${BAZEL_BUILD_OPTIONS}) string(REPLACE "@" "/external/" BAZEL_TARGET_PATH ${BAZEL_TARGET}) string(REPLACE "//" "/" BAZEL_TARGET_PATH ${BAZEL_TARGET_PATH}) string(REPLACE ":" "/" BAZEL_TARGET_PATH ${BAZEL_TARGET_PATH}) include(${BAZEL_WORKSPACE}/bazel-bin${BAZEL_TARGET_PATH}.cmake) endmacro() macro(generate_and_include) file(REMOVE "${BAZEL_WORKSPACE}/.bazel-cmake/BUILD.bazel") # use aquery to only get targets compatible with the current platform bazel_even_if_failing(aquery "kind(\"cc_test|cc_binary\",${ARGN})" ${BAZEL_BUILD_OPTIONS} --output=jsonproto OUTPUT_VARIABLE BAZEL_AQUERY_RESULT) string(JSON BAZEL_JSON_TARGETS GET "${BAZEL_AQUERY_RESULT}" targets) string(JSON LAST_IDX LENGTH "${BAZEL_JSON_TARGETS}") math(EXPR LAST_IDX "${LAST_IDX} - 1") set(BAZEL_TARGETS_LIST "") foreach(IDX RANGE ${LAST_IDX}) string(JSON CUR_BAZEL_TARGET GET "${BAZEL_JSON_TARGETS}" ${IDX} label) string(APPEND BAZEL_TARGETS " '${CUR_BAZEL_TARGET}',\n") list(APPEND BAZEL_TARGETS_LIST ${CUR_BAZEL_TARGET}) endforeach () # Find and build targets that generate source files if(NOT "${BAZEL_TARGETS_LIST}" STREQUAL "") string(REPLACE ";" " " BAZEL_TARGETS_QUERY "${BAZEL_TARGETS_LIST}") bazel_even_if_failing(cquery "filter(\"\\\\.\\(h\\|c\\|cpp\\|hpp\\)$\", kind(\"generated file\", deps(set(${BAZEL_TARGETS_QUERY}))))" --output=label OUTPUT_VARIABLE GENERATED_SOURCE_TARGETS) # Build only the generator targets (strip configuration hashes) if(NOT "${GENERATED_SOURCE_TARGETS}" STREQUAL "") string(REGEX REPLACE " \\([^)]+\\)" "" GENERATED_SOURCE_TARGETS "${GENERATED_SOURCE_TARGETS}") string(REPLACE "\n" ";" GENERATED_SOURCE_TARGETS_LIST "${GENERATED_SOURCE_TARGETS}") list(REMOVE_DUPLICATES GENERATED_SOURCE_TARGETS_LIST) bazel(build ${GENERATED_SOURCE_TARGETS_LIST} ${BAZEL_BUILD_OPTIONS}) endif() endif() file(WRITE "${BAZEL_WORKSPACE}/.bazel-cmake/BUILD.bazel" "\ # this file was generated by cmake load('@${CODEQL_BAZEL_WORKSPACE}//misc/bazel/cmake:cmake.bzl', 'generate_cmake')\n\ \n\ generate_cmake(\n\ name = 'cmake',\n\ testonly = True,\n\ targets = [\n\ ${BAZEL_TARGETS}\ ],\n\ )\n") include_generated(//.bazel-cmake:cmake) endmacro() if (CREATE_COMPILATION_DATABASE_LINK) file(CREATE_LINK ${PROJECT_BINARY_DIR}/compile_commands.json ${PROJECT_SOURCE_DIR}/compile_commands.json SYMBOLIC) endif ()