如何将扩展名替换为文件名的 cmake 列表
How to substitute the extension for a cmake list of filenames
我正在尝试使用 cmake 从一些 protobuf
定义构建一个 c++ 库。
我添加了一个自定义命令来将 proto
编译为 C++,但输出部分存在一些问题。
在 protoc
完成工作后,我需要指定哪些是预期的输出文件。为此,我想在我的 PROTO_SOURCE
文件 glob 中替换 proto
扩展名 .pb.cc
和 .pb.h
我基本上需要像 this 这样的东西,但是对于 cmake。
我正在手动构建此命令,因为我没有可用的 protobuf cmake 支持。
project(messages)
set(PROTO_PATH "${CMAKE_CURRENT_SOURCE_DIR}/proto_definitions")
file(GLOB PROTO_FILES "${PROTO_PATH}/*.proto")
#set(PROTO_SOURCES ???) # This needs to contain '*.pb.cc' and '*.pb.h'
add_custom_command(COMMAND protoc --cpp_out=${CMAKE_CURRENT_SOURCE_DIR}/compiled_proto ${PROTO_FILES}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS ${PROTO_FILES}
OUTPUT ${PROTO_SOURCES})
add_library(${PROJECT_NAME} STATIC ${PROTO_SOURCES})
# Replace .proto -> .pb.cc
string(REGEX REPLACE "[.]proto$" ".pb.cc" OUTPUT_SOURCES ${PROTO_FILES})
# Replace .proto -> .pb.h
string(REGEX REPLACE "[.]proto$" ".pb.h" OUTPUT_HEADERS ${PROTO_FILES})
add_custom_command(COMMAND protoc <...>
OUTPUT ${OUTPUT_SOURCES} ${OUTPUT_HEADERS})
接受的答案对我不起作用,因为列表中的前几个元素没有被正确替换。
所以我遍历列表,将它们一一替换,然后将每一个添加到列表中:
foreach (CXX_SRC ${LIST_OF_CXX})
string(REGEX REPLACE "[.]cpp$" ".o" OBJ ${CXX_SRC})
set(OBJ_FILES ${OBJ_FILES} ${OBJ})
endforeach ()
message(STATUS "Object files compiled from *.cpp: ${OBJ_FILES}")
我正在尝试使用 cmake 从一些 protobuf
定义构建一个 c++ 库。
我添加了一个自定义命令来将 proto
编译为 C++,但输出部分存在一些问题。
在 protoc
完成工作后,我需要指定哪些是预期的输出文件。为此,我想在我的 PROTO_SOURCE
文件 glob 中替换 proto
扩展名 .pb.cc
和 .pb.h
我基本上需要像 this 这样的东西,但是对于 cmake。
我正在手动构建此命令,因为我没有可用的 protobuf cmake 支持。
project(messages)
set(PROTO_PATH "${CMAKE_CURRENT_SOURCE_DIR}/proto_definitions")
file(GLOB PROTO_FILES "${PROTO_PATH}/*.proto")
#set(PROTO_SOURCES ???) # This needs to contain '*.pb.cc' and '*.pb.h'
add_custom_command(COMMAND protoc --cpp_out=${CMAKE_CURRENT_SOURCE_DIR}/compiled_proto ${PROTO_FILES}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS ${PROTO_FILES}
OUTPUT ${PROTO_SOURCES})
add_library(${PROJECT_NAME} STATIC ${PROTO_SOURCES})
# Replace .proto -> .pb.cc
string(REGEX REPLACE "[.]proto$" ".pb.cc" OUTPUT_SOURCES ${PROTO_FILES})
# Replace .proto -> .pb.h
string(REGEX REPLACE "[.]proto$" ".pb.h" OUTPUT_HEADERS ${PROTO_FILES})
add_custom_command(COMMAND protoc <...>
OUTPUT ${OUTPUT_SOURCES} ${OUTPUT_HEADERS})
接受的答案对我不起作用,因为列表中的前几个元素没有被正确替换。
所以我遍历列表,将它们一一替换,然后将每一个添加到列表中:
foreach (CXX_SRC ${LIST_OF_CXX})
string(REGEX REPLACE "[.]cpp$" ".o" OBJ ${CXX_SRC})
set(OBJ_FILES ${OBJ_FILES} ${OBJ})
endforeach ()
message(STATUS "Object files compiled from *.cpp: ${OBJ_FILES}")