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、私のケースに役立つと考えていますが、まだ 2 つの実行が表示されtld_parserます ...

また、ファイルを直接インクルードするテストも行いました(そうすれば、関数が正確なソース データから期待されるものを返すことをtld_data.c直接確認できます)。tld()

add_dependencies()をテストに追加すると、期待どおりに機能しました。tld_data.cファイルを 3 回作成する代わりに、 2 回だけになりました。

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