HiroIshida / snippets

fraction of codes which may be grepped later
6 stars 2 forks source link

cmakeに関する?質問 #10

Open HiroIshida opened 4 years ago

HiroIshida commented 4 years ago

前提

pybulletのshared objectを作る際に, CMakeLIsts.txt 内は次のようになっています.

SET(pybullet_SRCS
    pybullet.c
)
# 略
ADD_LIBRARY(pybullet SHARED ${pybullet_SRCS})
# 略
TARGET_LINK_LIBRARIES(pybullet BulletRoboticsGUI BulletExampleBrowserLib BulletRobotics BulletFileLoader BulletWorldImporter BulletSoftBody BulletDynamics BulletCollision BulletInverseDynamicsUtils BulletInverseDynamics LinearMath OpenGLWindow gwen BussIK Bullet3Common)

同じディレクトリ内にあるpybullet.cの中では

#include "../SharedMemory/PhysicsClientC_API.h"
#include "../SharedMemory/PhysicsDirectC_API.h"
// 略

みたいな感じでSharedMemoryディレクトリ以下のヘッダがincludeされています.

質問

こういう場合に上記のヘッダ内関数を使うためには, [方法1]pybullet_SRCS

SET(pybullet_SRCS
    pybullet.c
        ../SharedMemory/PhysicsClientC_API.cpp
        ../SharedMemory/PhysicsDirectC_API.cpp
# etc...
)

みたいにソースファイルを追加するという方法と, [方法2] SharedMemoryディレクトリ内のオブジェクトをまとめたライブラリ, 例えばSharedMemory.soを作って, 上記のTARGET_LINK_LIBRARIESSharedMemoryを追加する, という2つの方法が考えられると思うんだけど, 上記のpyullet.soをビルドするためのCMakefile内はこのどちらもなされていなくて, どうやって, ../SharedMemory/PhysicsClientC_API.cppを使っているのか疑問なので教えてもらえないでしょうか.

pazeshun commented 4 years ago

bullet3/examples/pybullet/CMakeLists.txtは、bullet3/examples/CMakeLists.txtから呼び出されます。 https://github.com/bulletphysics/bullet3/blob/6b6cfa6f03a54de484e15520f0a86ea81c9831ae/examples/CMakeLists.txt#L7 (リンク切れを防ぐため、masterブランチの現在の最新コミットを参照しています) で、その前にbullet3/examples/SharedMemory/CMakeLists.txtを呼び出しているので、ここで何かやっているんじゃないだろうかという気分になります。 https://github.com/bulletphysics/bullet3/blob/6b6cfa6f03a54de484e15520f0a86ea81c9831ae/examples/CMakeLists.txt#L3 ただ、bullet3/examples/SharedMemory/CMakeLists.txtを見ても、ADD_EXECUTABLEしかなくて、ADD_LIBRARYがないので困りました。 https://github.com/bulletphysics/bullet3/blob/6b6cfa6f03a54de484e15520f0a86ea81c9831ae/examples/SharedMemory/CMakeLists.txt

困ったので、git cloneしてみて、grepを試みます。

$ git clone https://github.com/bulletphysics/bullet3.git
$ cd bullet3/
$ grep -r "PhysicsClientC_API.cpp" |grep CMake
examples/SharedMemory/CMakeLists.txt:   PhysicsClientC_API.cpp
examples/ExampleBrowser/CMakeLists.txt: ../SharedMemory/PhysicsClientC_API.cpp
examples/TwoJoint/CMakeLists.txt:       ../../examples/SharedMemory/PhysicsClientC_API.cpp
Extras/BulletRobotics/CMakeLists.txt:       ../../examples/SharedMemory/PhysicsClientC_API.cpp
test/SharedMemory/CMakeLists.txt:       ../../examples/SharedMemory/PhysicsClientC_API.cpp

どうやら、SharedMemoryディレクトリの上層・下層とは別の場所からも、SharedMemoryディレクトリの中身が参照されているようです。 ヒットしたものの一つであるbullet3/Extras/BulletRobotics/CMakeLists.txtを見ると、BulletRobotics_SRCSにbullet3/examples/SharedMemory/PhysicsClientC_API.cppが入っています。 https://github.com/bulletphysics/bullet3/blob/6b6cfa6f03a54de484e15520f0a86ea81c9831ae/Extras/BulletRobotics/CMakeLists.txt#L122 で、このBulletRobotics_SRCSがコンパイルされ、BulletRoboticsライブラリが生成されています。 https://github.com/bulletphysics/bullet3/blob/6b6cfa6f03a54de484e15520f0a86ea81c9831ae/Extras/BulletRobotics/CMakeLists.txt#L242

ここで、 bullet3/examples/pybullet/CMakeLists.txtを見返すと、BulletRoboticsライブラリがpybulletライブラリにリンクされています。 https://github.com/bulletphysics/bullet3/blob/6b6cfa6f03a54de484e15520f0a86ea81c9831ae/examples/pybullet/CMakeLists.txt#L78 よって、pybulletライブラリにリンクされたBulletRoboticsライブラリ経由で、PhysicsClientC_API.h/cppの関数が使えることがわかります。

なお、BulletRoboticsライブラリがpybulletライブラリにリンクされるまでは、pybullet_SRCSにPhysicsClientC_API.h/cppが含まれていたようなので、この時の方がわかりやすかったのかもしれないですね。 https://github.com/bulletphysics/bullet3/commit/fde6cffecc8fcead423a3ebdc101457289531bf2#diff-8a5a760f3e46c787d2f11c67db1dcefdL85