Files
codeql/misc/bazel/cmake/setup.cmake
Cornelius Riemenschneider cff78cca5e Cmake generator: Remove space in argument.
This space breaks when upgrading bazelisk on Windows.
Somehow, a space inside the argument messes up some argument-parsin
somewhere. Porbably due to Windows argument parsing
being not well-defined in how it splits a string into argv.
Removing the space works around the problem.

If the space is included, cmake suddenly can't find the bazelisk
binary anymore, despite happily executing `info output_base` earlier.
2024-06-02 23:56:31 +02:00

70 lines
2.6 KiB
CMake

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)
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)
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")
foreach(IDX RANGE ${LAST_IDX})
string(JSON CUR_BAZEL_TARGET GET "${BAZEL_JSON_TARGETS}" ${IDX} label)
string(APPEND BAZEL_TARGETS " '${CUR_BAZEL_TARGET}',\n")
endforeach ()
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 ()