1

我有项目名称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()功能界面不会有太大变化。然而,实现将完全不同,更灵活,可动态更新。

4

0 回答 0