最初にツールを作成するプロジェクト名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()
あまり変更されていません。ただし、実装はまったく異なり、より柔軟で、動的に更新可能です。