<html><head></head><body><div style="color:#000; background-color:#fff; font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, Sans-Serif;font-size:16px"><div id="yui_3_16_0_ym19_1_1464811707895_6507">Hi cmake users, </div><div id="yui_3_16_0_ym19_1_1464811707895_6507" dir="ltr">    Reposting question from stackoverflow (http://stackoverflow.com/questions/37449511/cmake-searching-for-shared-libraries-in-invalid-paths) since I didn't get a good answer there:</div><div id="yui_3_16_0_ym19_1_1464811707895_6507"><br></div><div id="yui_3_16_0_ym19_1_1464811707895_6507">I noticed that the cmake generation step in my project was taking a long time and so I ran cmake through strace to figure out the root cause. I found that cmake was trying to find internal shared libraries in the wrong locations repeatedly, which was causing a lot of unnecessary file system lookups. Here is a simple project that illustrates the problem:</div><div id="yui_3_16_0_ym19_1_1464811707895_6508"><br id="yui_3_16_0_ym19_1_1464811707895_6509"></div><div id="yui_3_16_0_ym19_1_1464811707895_6510">    $ ll -R                                                                                                                                                                                                                                                     </div><div id="yui_3_16_0_ym19_1_1464811707895_6511">    .:</div><div id="yui_3_16_0_ym19_1_1464811707895_6512">    total 20K</div><div id="yui_3_16_0_ym19_1_1464811707895_6513">    drwxr-xr-x 2 mark mark 4.0K May 25 16:22 alpha</div><div id="yui_3_16_0_ym19_1_1464811707895_6514">    drwxr-xr-x 2 mark mark 4.0K May 25 16:22 beta</div><div id="yui_3_16_0_ym19_1_1464811707895_6515">    drwxr-xr-x 2 mark mark 4.0K May 25 16:42 build</div><div id="yui_3_16_0_ym19_1_1464811707895_6516">    -rw-r--r-- 1 mark mark  185 May 25 16:20 CMakeLists.txt</div><div id="yui_3_16_0_ym19_1_1464811707895_6517">    -rw-r--r-- 1 mark mark    0 May 25 16:16 dummy.cc</div><div id="yui_3_16_0_ym19_1_1464811707895_6518">    drwxr-xr-x 2 mark mark 4.0K May 25 16:22 gamma</div><div id="yui_3_16_0_ym19_1_1464811707895_6519">    </div><div id="yui_3_16_0_ym19_1_1464811707895_6520">    ./alpha:</div><div id="yui_3_16_0_ym19_1_1464811707895_6521">    total 4.0K</div><div id="yui_3_16_0_ym19_1_1464811707895_6522">    -rw-r--r-- 1 mark mark  0 May 25 16:16 alpha.cc</div><div id="yui_3_16_0_ym19_1_1464811707895_6523">    -rw-r--r-- 1 mark mark 69 May 25 16:20 CMakeLists.txt</div><div id="yui_3_16_0_ym19_1_1464811707895_6524">    </div><div id="yui_3_16_0_ym19_1_1464811707895_6525">    ./beta:</div><div id="yui_3_16_0_ym19_1_1464811707895_6526">    total 4.0K</div><div id="yui_3_16_0_ym19_1_1464811707895_6527">    -rw-r--r-- 1 mark mark  0 May 25 16:16 beta.cc</div><div id="yui_3_16_0_ym19_1_1464811707895_6528">    -rw-r--r-- 1 mark mark 67 May 25 16:18 CMakeLists.txt</div><div id="yui_3_16_0_ym19_1_1464811707895_6529">    </div><div id="yui_3_16_0_ym19_1_1464811707895_6530">    ./build:</div><div id="yui_3_16_0_ym19_1_1464811707895_6531">    total 0</div><div id="yui_3_16_0_ym19_1_1464811707895_6532">    </div><div id="yui_3_16_0_ym19_1_1464811707895_6533">    ./gamma:</div><div id="yui_3_16_0_ym19_1_1464811707895_6534">    total 4.0K</div><div id="yui_3_16_0_ym19_1_1464811707895_6535">    -rw-r--r-- 1 mark mark 35 May 25 16:19 CMakeLists.txt</div><div id="yui_3_16_0_ym19_1_1464811707895_6536">    -rw-r--r-- 1 mark mark  0 May 25 16:16 gamma.cc </div><div id="yui_3_16_0_ym19_1_1464811707895_6537"><br id="yui_3_16_0_ym19_1_1464811707895_6538"></div><div id="yui_3_16_0_ym19_1_1464811707895_6539">alpha.cc, beta.cc, gamma.cc and dummy.cc are all empty cc files. Here are the contents of all the CMakLists.txt files:</div><div id="yui_3_16_0_ym19_1_1464811707895_6540"><br id="yui_3_16_0_ym19_1_1464811707895_6541"></div><div id="yui_3_16_0_ym19_1_1464811707895_6542">Top level CMakeLists.txt</div><div id="yui_3_16_0_ym19_1_1464811707895_6543"><br id="yui_3_16_0_ym19_1_1464811707895_6544"></div><div id="yui_3_16_0_ym19_1_1464811707895_6545">    $ cat CMakeLists.txt </div><div id="yui_3_16_0_ym19_1_1464811707895_6546">    cmake_minimum_required(VERSION 2.8)</div><div id="yui_3_16_0_ym19_1_1464811707895_6547"><br id="yui_3_16_0_ym19_1_1464811707895_6548"></div><div id="yui_3_16_0_ym19_1_1464811707895_6549">    add_subdirectory(alpha)</div><div id="yui_3_16_0_ym19_1_1464811707895_6550">    add_subdirectory(beta)</div><div id="yui_3_16_0_ym19_1_1464811707895_6551">    add_subdirectory(gamma)</div><div id="yui_3_16_0_ym19_1_1464811707895_6552"><br id="yui_3_16_0_ym19_1_1464811707895_6553"></div><div id="yui_3_16_0_ym19_1_1464811707895_6554">    add_executable(dummy_exec dummy.cc)</div><div id="yui_3_16_0_ym19_1_1464811707895_6555">    target_link_libraries(dummy_exec alpha)</div><div id="yui_3_16_0_ym19_1_1464811707895_6556"><br id="yui_3_16_0_ym19_1_1464811707895_6557"></div><div id="yui_3_16_0_ym19_1_1464811707895_6558">alpha/CMakeLists.txt </div><div id="yui_3_16_0_ym19_1_1464811707895_6559"><br id="yui_3_16_0_ym19_1_1464811707895_6560"></div><div id="yui_3_16_0_ym19_1_1464811707895_6561">    $ cat alpha/CMakeLists.txt </div><div id="yui_3_16_0_ym19_1_1464811707895_6562">    add_library(alpha SHARED alpha.cc)</div><div id="yui_3_16_0_ym19_1_1464811707895_6563">    target_link_libraries(alpha beta)</div><div id="yui_3_16_0_ym19_1_1464811707895_6564"><br id="yui_3_16_0_ym19_1_1464811707895_6565"></div><div id="yui_3_16_0_ym19_1_1464811707895_6566">beta/CMakeLists.txt</div><div id="yui_3_16_0_ym19_1_1464811707895_6567"><br id="yui_3_16_0_ym19_1_1464811707895_6568"></div><div id="yui_3_16_0_ym19_1_1464811707895_6569">    $ cat beta/CMakeLists.txt </div><div id="yui_3_16_0_ym19_1_1464811707895_6570">    add_library(beta SHARED beta.cc)</div><div id="yui_3_16_0_ym19_1_1464811707895_6571">    target_link_libraries(beta gamma)</div><div id="yui_3_16_0_ym19_1_1464811707895_6572"><br id="yui_3_16_0_ym19_1_1464811707895_6573"></div><div id="yui_3_16_0_ym19_1_1464811707895_6574">gamma/CMakeLists.txt </div><div id="yui_3_16_0_ym19_1_1464811707895_6575"><br id="yui_3_16_0_ym19_1_1464811707895_6576"></div><div id="yui_3_16_0_ym19_1_1464811707895_6577">    $ cat gamma/CMakeLists.txt </div><div id="yui_3_16_0_ym19_1_1464811707895_6578">    add_library(gamma SHARED gamma.cc)</div><div id="yui_3_16_0_ym19_1_1464811707895_6579"><br id="yui_3_16_0_ym19_1_1464811707895_6580"></div><div id="yui_3_16_0_ym19_1_1464811707895_6581"><br id="yui_3_16_0_ym19_1_1464811707895_6582"></div><div id="yui_3_16_0_ym19_1_1464811707895_6583">I invoke cmake (through strace) as follows:</div><div id="yui_3_16_0_ym19_1_1464811707895_6584"><br id="yui_3_16_0_ym19_1_1464811707895_6585"></div><div id="yui_3_16_0_ym19_1_1464811707895_6586">    $ cd build/</div><div id="yui_3_16_0_ym19_1_1464811707895_6587">    $ strace -f -o /tmp/s.out  cmake  ..                                                                                                                                                                                                          </div><div id="yui_3_16_0_ym19_1_1464811707895_6588">    -- The C compiler identification is GNU 4.8.4</div><div id="yui_3_16_0_ym19_1_1464811707895_6589">    -- The CXX compiler identification is GNU 4.8.4</div><div id="yui_3_16_0_ym19_1_1464811707895_6590">    -- Check for working C compiler: /usr/bin/cc</div><div id="yui_3_16_0_ym19_1_1464811707895_6591">    -- Check for working C compiler: /usr/bin/cc -- works</div><div id="yui_3_16_0_ym19_1_1464811707895_6592">    -- Detecting C compiler ABI info</div><div id="yui_3_16_0_ym19_1_1464811707895_6593">    -- Detecting C compiler ABI info - done</div><div id="yui_3_16_0_ym19_1_1464811707895_6594">    -- Check for working CXX compiler: /usr/bin/c++</div><div id="yui_3_16_0_ym19_1_1464811707895_6595">    -- Check for working CXX compiler: /usr/bin/c++ -- works</div><div id="yui_3_16_0_ym19_1_1464811707895_6596">    -- Detecting CXX compiler ABI info</div><div id="yui_3_16_0_ym19_1_1464811707895_6597">    -- Detecting CXX compiler ABI info - done</div><div id="yui_3_16_0_ym19_1_1464811707895_6598">    -- Configuring done</div><div id="yui_3_16_0_ym19_1_1464811707895_6599">    -- Generating done</div><div id="yui_3_16_0_ym19_1_1464811707895_6600">    -- Build files have been written to: /home/mark/Downloads/cmake/build</div><div id="yui_3_16_0_ym19_1_1464811707895_6601"><br id="yui_3_16_0_ym19_1_1464811707895_6602"></div><div id="yui_3_16_0_ym19_1_1464811707895_6603"><br id="yui_3_16_0_ym19_1_1464811707895_6604"></div><div id="yui_3_16_0_ym19_1_1464811707895_6605">When I inspect the strace output, I see it trying to access libalpha in invalid locations (such as under the beta/ and gamma/ sub directories):</div><div id="yui_3_16_0_ym19_1_1464811707895_6606"><br id="yui_3_16_0_ym19_1_1464811707895_6607"></div><div id="yui_3_16_0_ym19_1_1464811707895_6608">    31430 access("/home/mark/Downloads/cmake/build/beta/libalpha.so", R_OK) = -1 ENOENT (No such file or directory)</div><div id="yui_3_16_0_ym19_1_1464811707895_6609">    31430 access("/home/mark/Downloads/cmake/build/gamma/libalpha.so", R_OK) = -1 ENOENT (No such file or directory)</div><div id="yui_3_16_0_ym19_1_1464811707895_6610"><br id="yui_3_16_0_ym19_1_1464811707895_6611"></div><div id="yui_3_16_0_ym19_1_1464811707895_6612">Similarly, it is trying to access libbeta and libgamma in invalid locations:</div><div id="yui_3_16_0_ym19_1_1464811707895_6613"><br id="yui_3_16_0_ym19_1_1464811707895_6614"></div><div id="yui_3_16_0_ym19_1_1464811707895_6615">    31430 access("/home/mark/Downloads/cmake/build/alpha/libbeta.so", R_OK) = -1 ENOENT (No such file or directory)</div><div id="yui_3_16_0_ym19_1_1464811707895_6616">    31430 access("/home/mark/Downloads/cmake/build/gamma/libbeta.so", R_OK) = -1 ENOENT (No such file or directory)</div><div id="yui_3_16_0_ym19_1_1464811707895_6617"><br></div><div id="yui_3_16_0_ym19_1_1464811707895_6621">    31430 access("/home/mark/Downloads/cmake/build/alpha/libgamma.so", R_OK) = -1 ENOENT (No such file or directory)</div><div id="yui_3_16_0_ym19_1_1464811707895_6622">    31430 access("/home/mark/Downloads/cmake/build/beta/libgamma.so", R_OK) = -1 ENOENT (No such file or directory)</div><div id="yui_3_16_0_ym19_1_1464811707895_6623"><br id="yui_3_16_0_ym19_1_1464811707895_6624"></div><div id="yui_3_16_0_ym19_1_1464811707895_6625">For a large project with many shared libraries and many dependencies, these invalid lookups add up and seem to be causing big delays at the makefile generation step. Any idea on why this is happening and how I could prevent cmake from searching in these invalid paths ? </div><div id="yui_3_16_0_ym19_1_1464811707895_6625"><br></div><div id="yui_3_16_0_ym19_1_1464811707895_6625">thanks</div><div id="yui_3_16_0_ym19_1_1464811707895_6625">mark</div><div dir="ltr" id="yui_3_16_0_ym19_1_1464811707895_6626"><br id="yui_3_16_0_ym19_1_1464811707895_6627"></div></div></body></html>