我有项目名称libtld,我首先在其中创建了一个工具¹:
project(tld_parser)
add_executable(${PROJECT_NAME}
../tools/tldc.cpp
tld_compiler.cpp
tld_file.cpp
tld_strings.c
)
然后我使用该工具生成tld_data.c
文件,这是一个包含所有 TLD 的表(在我的新版本库中,这是 RIFF/TLDS 二进制文件的副本,将在内部作为后备进行编译)。这是add_custom_command()
我用来生成所述文件的:
project(tld_data)
set(TLD_DATA_C ${PROJECT_BINARY_DIR}/tld_data.c)
file(GLOB_RECURSE TLD_FILES ${CMAKE_SOURCE_DIR}/conf/tlds/*.ini)
add_custom_command(
OUTPUT ${TLD_DATA_C}
COMMAND "tld_parser"
"--source"
"${CMAKE_SOURCE_DIR}/conf/tlds"
"--verify"
"--output-json"
"--include-offsets"
"--c-file"
"${TLD_DATA_C}"
"${PROJECT_BINARY_DIR}/tlds.tld"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
MAIN_DEPENDENCY tld_parser
DEPENDS ${TLD_FILES}
)
add_custom_target(${PROJECT_NAME} ALL DEPENDS ${TLD_DATA_C})
define_property(SOURCE
PROPERTY GENERATED
BRIEF_DOCS "The tld_data.c file is a table of all the TLDs defined in conf/tlds/... .ini files."
FULL_DOCS "In the new version, the tld_data.c is always generated on the fly since it can be done with just C/C++."
)
接下来我要生成 tld 动态和静态库。
set(LIBTLD_SOURCES
tld.cpp
tld_compiler.cpp
${TLD_DATA_C}
tld_domain_to_lowercase.c
tld_emails.cpp
tld_file.cpp
tld_object.cpp
tld_strings.c
)
##
## TLD library
##
project(tld)
configure_file(
tld.h.in
${PROJECT_BINARY_DIR}/tld.h
)
add_library(${PROJECT_NAME} SHARED
${LIBTLD_SOURCES}
)
set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION ${LIBTLD_VERSION_MAJOR}.${LIBTLD_VERSION_MINOR}
SOVERSION ${LIBTLD_VERSION_MAJOR}
)
install(
TARGETS ${PROJECT_NAME}
LIBRARY DESTINATION lib
COMPONENT runtime
)
install(
FILES ${PROJECT_BINARY_DIR}/tld.h
DESTINATION include
COMPONENT development
)
##
## TLD static library
##
project(tld_static)
add_library(${PROJECT_NAME} STATIC
${LIBTLD_SOURCES}
)
add_dependencies(${PROJECT_NAME}
tld
)
# We need the -fPIC to use this library as extension of PHP, etc.
set_target_properties(tld_static PROPERTIES COMPILE_FLAGS -fPIC)
install(
TARGETS ${PROJECT_NAME}
ARCHIVE DESTINATION lib
COMPONENT development
)
我将其添加add_dependencies()
到tld_static
项目中以依赖于对tld
我的情况有所帮助的想法,但我仍然看到两次运行tld_parser
...
我还有一个直接包含该tld_data.c
文件的测试(这样我可以直接验证该tld()
函数是否返回了我对确切源数据的期望)。
添加add_dependencies()
到测试中按预期工作。而不是tld_data.c
创建文件三次,现在只创建两次。
project(tld_internal_test)
add_executable(${PROJECT_NAME}
tld_internal_test.cpp
)
add_dependencies(${PROJECT_NAME}
tld
)
add_test(
NAME ${PROJECT_NAME}
COMMAND ${PROJECT_NAME}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
通过终止并行构建功能,它可以按预期工作,但是,我应该没有充分的理由这样做(请参阅此 cmake 问题以供参考)。
不过,我想知道的是:
你如何调试这样的问题?
cmake 的 Makefile 是巨大的,所以阅读它们是相当致命的。如果我知道要搜索什么,我想我至少可以查看特定目标,而不是试图了解那里发生的所有事情(其中大部分与我的问题无关)。
¹代码目前在一个分支中。我希望尽快将其全部结束,届时它将取代主分支。tld()
功能界面不会有太大变化。然而,实现将完全不同,更灵活,可动态更新。