[CMake] RPATH for pkg-config
Hello, How to ask cmake to add a library path (coming from pc file) to rpath ? I checked this https://cmake.org/Wiki/CMake_RPATH_handling, but still not working. Can somebody help ? >> more main.cpp #include int main(int argc, char ** argv) { PetscInitialize(&argc, &argv, NULL, ""); PetscFinalize(); return 0; } >> more CMakeLists.txt cmake_minimum_required(VERSION 3.7) enable_language(CXX) find_package(MPI REQUIRED) find_package(PkgConfig REQUIRED) # Get pkg_check_modules. pkg_check_modules(PETSc REQUIRED PETSc) project(main) add_executable(main main.cpp) target_include_directories(main PUBLIC ${MPI_CXX_INCLUDE_PATH}) target_link_libraries(main PUBLIC ${MPI_CXX_LIBRARIES}) target_include_directories(main PUBLIC ${PETSc_INCLUDE_DIRS}) foreach(lib ${PETSc_LDFLAGS}) target_link_libraries(main PUBLIC ${lib}) endforeach(lib) foreach(dir ${PETSc_LIBRARY_DIRS}) link_directories(main PUBLIC ${dir}) # Not sure: is this needed ? endforeach(dir) # use, i.e. don't skip the full RPATH for the build tree SET(CMAKE_SKIP_BUILD_RPATH FALSE) # when building, don't use the install RPATH already # (but later on when installing) SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") # add the automatically determined parts of the RPATH # which point to directories outside the build tree to the install RPATH SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # the RPATH to be used when installing, but only if it's not a system directory LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) IF("${isSystemDir}" STREQUAL "-1") SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") ENDIF("${isSystemDir}" STREQUAL "-1") include(CTest) enable_testing() add_test(NAME main COMMAND "mpirun -n 2 ./main" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") Now, >> export PKG_CONFIG_PATH="/path/to/petsc/local/lib/pkgconfig" >> cmake ..; make => OK But >> ldd main linux-vdso.so.1 (0x7ffcf23ca000) libmpi_cxx.so.20 => /usr/lib/x86_64-linux-gnu/libmpi_cxx.so.20 (0x7f68593ea000) libmpi.so.20 => /usr/lib/x86_64-linux-gnu/libmpi.so.20 (0x7f68590f4000) libpetsc.so.3.8 => not found and so, make test fails ?!... -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake
Re: [CMake] RPATH for pkg-config
On 2018 M01 3, Wed 10:08:09 CET Franck Houssen wrote: > Hello, > > How to ask cmake to add a library path (coming from pc file) to rpath ? > > I checked this https://cmake.org/Wiki/CMake_RPATH_handling, but still not > working. Can somebody help ? > >> more main.cpp > > #include > > int main(int argc, char ** argv) { > PetscInitialize(&argc, &argv, NULL, ""); > PetscFinalize(); > return 0; > } > > >> more CMakeLists.txt > > cmake_minimum_required(VERSION 3.7) > enable_language(CXX) > > find_package(MPI REQUIRED) > find_package(PkgConfig REQUIRED) # Get pkg_check_modules. > pkg_check_modules(PETSc REQUIRED PETSc) > > project(main) > add_executable(main main.cpp) > > target_include_directories(main PUBLIC ${MPI_CXX_INCLUDE_PATH}) > target_link_libraries(main PUBLIC ${MPI_CXX_LIBRARIES}) > > target_include_directories(main PUBLIC ${PETSc_INCLUDE_DIRS}) > foreach(lib ${PETSc_LDFLAGS}) > target_link_libraries(main PUBLIC ${lib}) > endforeach(lib) How does each ${lib} look like ? Is it "-lpetsc" or does it have the full path to the libraries ? You should use the full path to the libraries, otherwise cmake doesn't know where they are and the RPATH computation will not work. > > foreach(dir ${PETSc_LIBRARY_DIRS}) > link_directories(main PUBLIC ${dir}) # Not sure: is this needed ? > endforeach(dir) no, link_directories() in general should not be used. > # use, i.e. don't skip the full RPATH for the build tree > SET(CMAKE_SKIP_BUILD_RPATH FALSE) > # when building, don't use the install RPATH already > # (but later on when installing) > SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) > SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") If the automatic computation fails, you could add the petsc lib dir here as INSTALL_RPATH Alex -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake
Re: [CMake] RPATH for pkg-config
What about using a FindPETSC-Module? Some hints are *http://jacobmerson.com/2016/01/17/cmake-petsc2.html *http://www.mcs.anl.gov/petsc/documentation/faq.html#cmake Regards, Andreas Am 03.01.2018 um 21:35 schrieb Alexander Neundorf: On 2018 M01 3, Wed 10:08:09 CET Franck Houssen wrote: Hello, How to ask cmake to add a library path (coming from pc file) to rpath ? I checked this https://cmake.org/Wiki/CMake_RPATH_handling, but still not working. Can somebody help ? more main.cpp #include int main(int argc, char ** argv) { PetscInitialize(&argc, &argv, NULL, ""); PetscFinalize(); return 0; } more CMakeLists.txt cmake_minimum_required(VERSION 3.7) enable_language(CXX) find_package(MPI REQUIRED) find_package(PkgConfig REQUIRED) # Get pkg_check_modules. pkg_check_modules(PETSc REQUIRED PETSc) project(main) add_executable(main main.cpp) target_include_directories(main PUBLIC ${MPI_CXX_INCLUDE_PATH}) target_link_libraries(main PUBLIC ${MPI_CXX_LIBRARIES}) target_include_directories(main PUBLIC ${PETSc_INCLUDE_DIRS}) foreach(lib ${PETSc_LDFLAGS}) target_link_libraries(main PUBLIC ${lib}) endforeach(lib) How does each ${lib} look like ? Is it "-lpetsc" or does it have the full path to the libraries ? You should use the full path to the libraries, otherwise cmake doesn't know where they are and the RPATH computation will not work. foreach(dir ${PETSc_LIBRARY_DIRS}) link_directories(main PUBLIC ${dir}) # Not sure: is this needed ? endforeach(dir) no, link_directories() in general should not be used. # use, i.e. don't skip the full RPATH for the build tree SET(CMAKE_SKIP_BUILD_RPATH FALSE) # when building, don't use the install RPATH already # (but later on when installing) SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") If the automatic computation fails, you could add the petsc lib dir here as INSTALL_RPATH Alex -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake
Re: [CMake] RPATH for pkg-config
- Mail original - > De: "Alexander Neundorf" > À: cmake@cmake.org > Envoyé: Mercredi 3 Janvier 2018 21:35:02 > Objet: Re: [CMake] RPATH for pkg-config > > On 2018 M01 3, Wed 10:08:09 CET Franck Houssen wrote: > > Hello, > > > > How to ask cmake to add a library path (coming from pc file) to rpath ? > > > > I checked this https://cmake.org/Wiki/CMake_RPATH_handling, but still not > > working. Can somebody help ? > > >> more main.cpp > > > > #include > > > > int main(int argc, char ** argv) { > > PetscInitialize(&argc, &argv, NULL, ""); > > PetscFinalize(); > > return 0; > > } > > > > >> more CMakeLists.txt > > > > cmake_minimum_required(VERSION 3.7) > > enable_language(CXX) > > > > find_package(MPI REQUIRED) > > find_package(PkgConfig REQUIRED) # Get pkg_check_modules. > > pkg_check_modules(PETSc REQUIRED PETSc) > > > > project(main) > > add_executable(main main.cpp) > > > > target_include_directories(main PUBLIC ${MPI_CXX_INCLUDE_PATH}) > > target_link_libraries(main PUBLIC ${MPI_CXX_LIBRARIES}) > > > > target_include_directories(main PUBLIC ${PETSc_INCLUDE_DIRS}) > > foreach(lib ${PETSc_LDFLAGS}) > > target_link_libraries(main PUBLIC ${lib}) > > endforeach(lib) > > How does each ${lib} look like ? > Is it "-lpetsc" or does it have the full path to the libraries ? I added 2 message: one for target_link_libraries, one for link_directories. >> more CMakeLists.txt ... target_include_directories(main PUBLIC ${PETSc_INCLUDE_DIRS}) foreach(lib ${PETSc_LDFLAGS}) target_link_libraries(main PUBLIC ${lib}) message("target_link_libraries - lib is ${lib}") endforeach(lib) foreach(dir ${PETSc_LIBRARY_DIRS}) link_directories(main PUBLIC ${dir}) # Not sure: is this needed ? message("link_directories - dir is ${dir}") endforeach(dir) This gives: >> cmake ..; make ... target_link_libraries - lib is -L/path/to/petsc/local/lib target_link_libraries - lib is -lpetsc link_directories - dir is /path/to/petsc/local/lib > You should use the full path to the libraries, otherwise cmake doesn't know > where they are and the RPATH computation will not work. I expected the same behavior you describe ! That why I added the link_directories (with the associated comment) BEFORE setting CMAKE_SKIP_BUILD_RPATH and others. > > > > foreach(dir ${PETSc_LIBRARY_DIRS}) > > link_directories(main PUBLIC ${dir}) # Not sure: is this needed ? > > endforeach(dir) > > no, link_directories() in general should not be used. > > > # use, i.e. don't skip the full RPATH for the build tree > > SET(CMAKE_SKIP_BUILD_RPATH FALSE) > > # when building, don't use the install RPATH already > > # (but later on when installing) > > SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) > > SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") > > If the automatic computation fails, you could add the petsc lib dir here as > INSTALL_RPATH > Do you mean that ? >> more CMakeLists.txt ... foreach(dir ${PETSc_LIBRARY_DIRS}) link_directories(main PUBLIC ${dir}) message("link_directories - dir is ${dir}") set(CMAKE_INSTALL_RPATH "${dir}:${CMAKE_INSTALL_RPATH}") endforeach(dir) I've just tried but still not working: >> cmake ..; make ... target_link_libraries - lib is -L/home/fghoussen/Documents/INRIA/petsc/local/lib target_link_libraries - lib is -lpetsc link_directories - dir is /home/fghoussen/Documents/INRIA/petsc/local/lib ... [100%] Built target main >> ldd main linux-vdso.so.1 (0x7ffebab8a000) libmpi_cxx.so.20 => /usr/lib/x86_64-linux-gnu/libmpi_cxx.so.20 (0x7f36172e3000) libmpi.so.20 => /usr/lib/x86_64-linux-gnu/libmpi.so.20 (0x7f3616fed000) libpetsc.so.3.8 => not found > Alex > > -- > > Powered by www.kitware.com > > Please keep messages on-topic and check the CMake FAQ at: > http://www.cmake.org/Wiki/CMake_FAQ > > Kitware offers various services to support the CMake community. For more > information on each offering, please visit: > > CMake Support: http://cmake.org/cmake/help/support.html > CMake Consulting: http://cmake.org/cmake/help/consulting.html > CMake Training Courses: http://cmake.org/cmake/help/training.html > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Follow this link to subscribe/unsubscribe: > https://cmake.org/mailman/listinfo/cmake > -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake
Re: [CMake] RPATH for pkg-config
My understanding is that you need a local copy of FindPETSc.cmake: if this changes, you don't know it. That's why I tried to go with the pc file. - Mail original - > De: "Andreas Naumann" > À: cmake@cmake.org > Envoyé: Mercredi 3 Janvier 2018 21:41:51 > Objet: Re: [CMake] RPATH for pkg-config > > What about using a FindPETSC-Module? Some hints are > *http://jacobmerson.com/2016/01/17/cmake-petsc2.html > *http://www.mcs.anl.gov/petsc/documentation/faq.html#cmake > > Regards, > Andreas > > Am 03.01.2018 um 21:35 schrieb Alexander Neundorf: > > On 2018 M01 3, Wed 10:08:09 CET Franck Houssen wrote: > >> Hello, > >> > >> How to ask cmake to add a library path (coming from pc file) to rpath ? > >> > >> I checked this https://cmake.org/Wiki/CMake_RPATH_handling, but still not > >> working. Can somebody help ? > >>>> more main.cpp > >> #include > >> > >> int main(int argc, char ** argv) { > >> PetscInitialize(&argc, &argv, NULL, ""); > >> PetscFinalize(); > >> return 0; > >> } > >> > >>>> more CMakeLists.txt > >> cmake_minimum_required(VERSION 3.7) > >> enable_language(CXX) > >> > >> find_package(MPI REQUIRED) > >> find_package(PkgConfig REQUIRED) # Get pkg_check_modules. > >> pkg_check_modules(PETSc REQUIRED PETSc) > >> > >> project(main) > >> add_executable(main main.cpp) > >> > >> target_include_directories(main PUBLIC ${MPI_CXX_INCLUDE_PATH}) > >> target_link_libraries(main PUBLIC ${MPI_CXX_LIBRARIES}) > >> > >> target_include_directories(main PUBLIC ${PETSc_INCLUDE_DIRS}) > >> foreach(lib ${PETSc_LDFLAGS}) > >> target_link_libraries(main PUBLIC ${lib}) > >> endforeach(lib) > > How does each ${lib} look like ? > > Is it "-lpetsc" or does it have the full path to the libraries ? > > You should use the full path to the libraries, otherwise cmake doesn't know > > where they are and the RPATH computation will not work. > > > >> foreach(dir ${PETSc_LIBRARY_DIRS}) > >> link_directories(main PUBLIC ${dir}) # Not sure: is this needed ? > >> endforeach(dir) > > no, link_directories() in general should not be used. > > > >> # use, i.e. don't skip the full RPATH for the build tree > >> SET(CMAKE_SKIP_BUILD_RPATH FALSE) > >> # when building, don't use the install RPATH already > >> # (but later on when installing) > >> SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) > >> SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") > > If the automatic computation fails, you could add the petsc lib dir here as > > INSTALL_RPATH > > > > Alex > > > > -- > > Powered by www.kitware.com > > Please keep messages on-topic and check the CMake FAQ at: > http://www.cmake.org/Wiki/CMake_FAQ > > Kitware offers various services to support the CMake community. For more > information on each offering, please visit: > > CMake Support: http://cmake.org/cmake/help/support.html > CMake Consulting: http://cmake.org/cmake/help/consulting.html > CMake Training Courses: http://cmake.org/cmake/help/training.html > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Follow this link to subscribe/unsubscribe: > https://cmake.org/mailman/listinfo/cmake > -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake
Re: [CMake] RPATH for pkg-config
The cmake rpath settings handle build/install directories more or less automatically, but you need to add a completely different path. Try adding the additional path (pretty much every -L you added) to CMAKE_INSTALL_RPATH, and set CMAKE_BUILD_WITH_INSTALL_RPATH=TRUE. Then run cmake with the ‘-v’ option and look at the link command to verify rpath was passed correctly. You can also examine it in a library or executable with ‘objdump-x’. You may want to customize this for your project, but this should get you started. hth... don On Thu, Jan 4, 2018 at 1:25 AM Franck Houssen wrote: > My understanding is that you need a local copy of FindPETSc.cmake: if this > changes, you don't know it. > That's why I tried to go with the pc file. > > - Mail original - > > De: "Andreas Naumann" > > À: cmake@cmake.org > > Envoyé: Mercredi 3 Janvier 2018 21:41:51 > > Objet: Re: [CMake] RPATH for pkg-config > > > > What about using a FindPETSC-Module? Some hints are > > *http://jacobmerson.com/2016/01/17/cmake-petsc2.html > > *http://www.mcs.anl.gov/petsc/documentation/faq.html#cmake > > > > Regards, > > Andreas > > > > Am 03.01.2018 um 21:35 schrieb Alexander Neundorf: > > > On 2018 M01 3, Wed 10:08:09 CET Franck Houssen wrote: > > >> Hello, > > >> > > >> How to ask cmake to add a library path (coming from pc file) to rpath > ? > > >> > > >> I checked this https://cmake.org/Wiki/CMake_RPATH_handling, but > still not > > >> working. Can somebody help ? > > >>>> more main.cpp > > >> #include > > >> > > >> int main(int argc, char ** argv) { > > >> PetscInitialize(&argc, &argv, NULL, ""); > > >> PetscFinalize(); > > >> return 0; > > >> } > > >> > > >>>> more CMakeLists.txt > > >> cmake_minimum_required(VERSION 3.7) > > >> enable_language(CXX) > > >> > > >> find_package(MPI REQUIRED) > > >> find_package(PkgConfig REQUIRED) # Get pkg_check_modules. > > >> pkg_check_modules(PETSc REQUIRED PETSc) > > >> > > >> project(main) > > >> add_executable(main main.cpp) > > >> > > >> target_include_directories(main PUBLIC ${MPI_CXX_INCLUDE_PATH}) > > >> target_link_libraries(main PUBLIC ${MPI_CXX_LIBRARIES}) > > >> > > >> target_include_directories(main PUBLIC ${PETSc_INCLUDE_DIRS}) > > >> foreach(lib ${PETSc_LDFLAGS}) > > >> target_link_libraries(main PUBLIC ${lib}) > > >> endforeach(lib) > > > How does each ${lib} look like ? > > > Is it "-lpetsc" or does it have the full path to the libraries ? > > > You should use the full path to the libraries, otherwise cmake doesn't > know > > > where they are and the RPATH computation will not work. > > > > > >> foreach(dir ${PETSc_LIBRARY_DIRS}) > > >> link_directories(main PUBLIC ${dir}) # Not sure: is this needed ? > > >> endforeach(dir) > > > no, link_directories() in general should not be used. > > > > > >> # use, i.e. don't skip the full RPATH for the build tree > > >> SET(CMAKE_SKIP_BUILD_RPATH FALSE) > > >> # when building, don't use the install RPATH already > > >> # (but later on when installing) > > >> SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) > > >> SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") > > > If the automatic computation fails, you could add the petsc lib dir > here as > > > INSTALL_RPATH > > > > > > Alex > > > > > > > -- > > > > Powered by www.kitware.com > > > > Please keep messages on-topic and check the CMake FAQ at: > > http://www.cmake.org/Wiki/CMake_FAQ > > > > Kitware offers various services to support the CMake community. For more > > information on each offering, please visit: > > > > CMake Support: http://cmake.org/cmake/help/support.html > > CMake Consulting: http://cmake.org/cmake/help/consulting.html > > CMake Training Courses: http://cmake.org/cmake/help/training.html > > > > Visit other Kitware open-source projects at > > http://www.kitware.com/opensource/opensource.html > > > > Follow this link to subscribe/unsubscribe: > > https://cmake.org/mailman/listinfo/cmake > > > -- > > Powered by www.kitware.com > > Please keep messages on-topic and check the CMake FAQ at: > http://www.cmake.org/Wiki/
Re: [CMake] RPATH for pkg-config
- Mail original - > De: "Don Hinton" > À: "Franck Houssen" > Cc: "Andreas Naumann" , cmake@cmake.org > Envoyé: Jeudi 4 Janvier 2018 10:43:28 > Objet: Re: [CMake] RPATH for pkg-config > The cmake rpath settings handle build/install directories more or less > automatically, but you need to add a completely different path. Yes. That's the problem: I need to add a completely different path. > Try adding the additional path (pretty much every -L you added) to > CMAKE_INSTALL_RPATH, and set CMAKE_BUILD_WITH_INSTALL_RPATH=TRUE. See does not work >> more ../CMakeLists.txt ... foreach(dir ${PETSc_LIBRARY_DIRS}) link_directories(main PUBLIC ${dir}) message("link_directories - dir is ${dir}") set(CMAKE_INSTALL_RPATH "${dir}:${CMAKE_INSTALL_RPATH}") endforeach(dir) ... SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) ... >> cmake ..; make VERBOSE=1 ... target_link_libraries - lib is -L/home/fghoussen/Documents/INRIA/petsc/local/lib target_link_libraries - lib is -lpetsc link_directories - dir is /home/fghoussen/Documents/INRIA/petsc/local/lib ... [ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o /usr/bin/c++ -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi/opal/mca/event/libevent2022/libevent -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi/opal/mca/event/libevent2022/libevent/include -I/usr/lib/x86_64-linux-gnu/openmpi/include -I/home/fghoussen/Documents/INRIA/petsc/local/include -o CMakeFiles/main.dir/main.cpp.o -c /home/fghoussen/Downloads/cmake/rpath-pkgconfig/main.cpp [100%] Linking CXX executable main /usr/bin/cmake -E cmake_link_script CMakeFiles/main.dir/link.txt --verbose=1 /usr/bin/c++ CMakeFiles/main.dir/main.cpp.o -o main -Wl,-rpath,/usr/lib/x86_64-linux-gnu/openmpi/lib /usr/lib/x86_64-linux-gnu/openmpi/lib/libmpi_cxx.so /usr/lib/x86_64-linux-gnu/openmpi/lib/libmpi.so -L/home/fghoussen/Documents/INRIA/petsc/local/lib -lpetsc make[2]: Leaving directory '/home/fghoussen/Downloads/cmake/rpath-pkgconfig/BUILD' [100%] Built target main make[1]: Leaving directory '/home/fghoussen/Downloads/cmake/rpath-pkgconfig/BUILD' /usr/bin/cmake -E cmake_progress_start /home/fghoussen/Downloads/cmake/rpath-pkgconfig/BUILD/CMakeFiles 0 >> ldd main linux-vdso.so.1 (0x7ffcd876b000) libmpi_cxx.so.20 => /usr/lib/x86_64-linux-gnu/libmpi_cxx.so.20 (0x7f9eaba1f000) libmpi.so.20 => /usr/lib/x86_64-linux-gnu/libmpi.so.20 (0x7f9eab729000) libpetsc.so.3.8 => not found > Then run cmake with the ‘-v’ option and look at the link command to verify > rpath was passed correctly. > You can also examine it in a library or executable with ‘objdump-x’. > You may want to customize this for your project, but this should get you > started. > hth... > don > On Thu, Jan 4, 2018 at 1:25 AM Franck Houssen < franck.hous...@inria.fr > > wrote: > > My understanding is that you need a local copy of FindPETSc.cmake: if this > > changes, you don't know it. > > > That's why I tried to go with the pc file. > > > ----- Mail original - > > > > De: "Andreas Naumann" < andreas-naum...@gmx.net > > > > > À: cmake@cmake.org > > > > Envoyé: Mercredi 3 Janvier 2018 21:41:51 > > > > Objet: Re: [CMake] RPATH for pkg-config > > > > > > > > What about using a FindPETSC-Module? Some hints are > > > > * http://jacobmerson.com/2016/01/17/cmake-petsc2.html > > > > * http://www.mcs.anl.gov/petsc/documentation/faq.html#cmake > > > > > > > > Regards, > > > > Andreas > > > > > > > > Am 03.01.2018 um 21:35 schrieb Alexander Neundorf: > > > > > On 2018 M01 3, Wed 10:08:09 CET Franck Houssen wrote: > > > > >> Hello, > > > > >> > > > > >> How to ask cmake to add a library path (coming from pc file) to rpath > > > >> ? > > > > >> > > > > >> I checked this https://cmake.org/Wiki/CMake_RPATH_handling , but still > > > >> not > > > > >> working. Can somebody help ? > > > > >>>> more main.cpp > > > > >> #include > > > > >> > > > > >> int main(int argc, char ** argv) { > > > > >> PetscInitialize(&argc, &argv, NULL, ""); > > > > >> PetscFinalize(); > > > > >> return 0; > > > > >> } > > > > >> > > > > >>>> more CMakeLists.txt > > > > >> cmake_minimum_required(VERSION 3.7)
Re: [CMake] RPATH for pkg-config
On Thu, Jan 4, 2018 at 3:57 AM Franck Houssen wrote: > -- > > *De: *"Don Hinton" > *À: *"Franck Houssen" > *Cc: *"Andreas Naumann" , cmake@cmake.org > *Envoyé: *Jeudi 4 Janvier 2018 10:43:28 > > > *Objet: *Re: [CMake] RPATH for pkg-config > > The cmake rpath settings handle build/install directories more or less > automatically, but you need to add a completely different path. > > > Yes. That's the problem: I need to add a completely different path. > > > Try adding the additional path (pretty much every -L you added) to > CMAKE_INSTALL_RPATH, and set CMAKE_BUILD_WITH_INSTALL_RPATH=TRUE. > > > See does not work > > >> more ../CMakeLists.txt > ... > > foreach(dir ${PETSc_LIBRARY_DIRS}) > link_directories(main PUBLIC ${dir}) > message("link_directories - dir is ${dir}") > set(CMAKE_INSTALL_RPATH "${dir}:${CMAKE_INSTALL_RPATH}") > endforeach(dir) > s/:/;/ You need to use a semicolon instead is a colon as a cmake list separator. > ... > SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) > ... > > >> cmake ..; make VERBOSE=1 > ... > target_link_libraries - lib is > -L/home/fghoussen/Documents/INRIA/petsc/local/lib > target_link_libraries - lib is -lpetsc > link_directories - dir is /home/fghoussen/Documents/INRIA/petsc/local/lib > ... > [ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o > /usr/bin/c++ -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi > -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi/opal/mca/event/libevent2022/libevent > -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi/opal/mca/event/libevent2022/libevent/include > -I/usr/lib/x86_64-linux-gnu/openmpi/include > -I/home/fghoussen/Documents/INRIA/petsc/local/include -o > CMakeFiles/main.dir/main.cpp.o -c > /home/fghoussen/Downloads/cmake/rpath-pkgconfig/main.cpp > [100%] Linking CXX executable main > /usr/bin/cmake -E cmake_link_script CMakeFiles/main.dir/link.txt > --verbose=1 > /usr/bin/c++ CMakeFiles/main.dir/main.cpp.o -o main > -Wl,-rpath,/usr/lib/x86_64-linux-gnu/openmpi/lib > /usr/lib/x86_64-linux-gnu/openmpi/lib/libmpi_cxx.so > /usr/lib/x86_64-linux-gnu/openmpi/lib/libmpi.so > -L/home/fghoussen/Documents/INRIA/petsc/local/lib -lpetsc > make[2]: Leaving directory > '/home/fghoussen/Downloads/cmake/rpath-pkgconfig/BUILD' > [100%] Built target main > make[1]: Leaving directory > '/home/fghoussen/Downloads/cmake/rpath-pkgconfig/BUILD' > /usr/bin/cmake -E cmake_progress_start > /home/fghoussen/Downloads/cmake/rpath-pkgconfig/BUILD/CMakeFiles 0 > > >> ldd main > linux-vdso.so.1 (0x7ffcd876b000) > libmpi_cxx.so.20 => /usr/lib/x86_64-linux-gnu/libmpi_cxx.so.20 > (0x7f9eaba1f000) > libmpi.so.20 => /usr/lib/x86_64-linux-gnu/libmpi.so.20 > (0x7f9eab729000) > libpetsc.so.3.8 => not found > > > Then run cmake with the ‘-v’ option and look at the link command to verify > rpath was passed correctly. > > You can also examine it in a library or executable with ‘objdump-x’. > > You may want to customize this for your project, but this should get you > started. > > hth... > don > > On Thu, Jan 4, 2018 at 1:25 AM Franck Houssen > wrote: > >> My understanding is that you need a local copy of FindPETSc.cmake: if >> this changes, you don't know it. >> That's why I tried to go with the pc file. >> >> - Mail original - >> > De: "Andreas Naumann" >> > À: cmake@cmake.org >> > Envoyé: Mercredi 3 Janvier 2018 21:41:51 >> > Objet: Re: [CMake] RPATH for pkg-config >> > >> > What about using a FindPETSC-Module? Some hints are >> > *http://jacobmerson.com/2016/01/17/cmake-petsc2.html >> > *http://www.mcs.anl.gov/petsc/documentation/faq.html#cmake >> > >> > Regards, >> > Andreas >> > >> > Am 03.01.2018 um 21:35 schrieb Alexander Neundorf: >> > > On 2018 M01 3, Wed 10:08:09 CET Franck Houssen wrote: >> > >> Hello, >> > >> >> > >> How to ask cmake to add a library path (coming from pc file) to >> rpath ? >> > >> >> > >> I checked this https://cmake.org/Wiki/CMake_RPATH_handling, but >> still not >> > >> working. Can somebody help ? >> > >>>> more main.cpp >> > >> #include >> > >> >> > >> int main(int argc, char ** argv) { >> > >> PetscInitialize(&argc, &argv, NULL, ""); >> > >> PetscFinalize(); >> > >>
Re: [CMake] RPATH for pkg-config
nope !... :D - Mail original - > De: "Don Hinton" > À: "Franck Houssen" > Cc: "Andreas Naumann" , cmake@cmake.org > Envoyé: Jeudi 4 Janvier 2018 16:52:53 > Objet: Re: [CMake] RPATH for pkg-config > On Thu, Jan 4, 2018 at 3:57 AM Franck Houssen < franck.hous...@inria.fr > > wrote: > > > De: "Don Hinton" < hinto...@gmail.com > > > > > > > À: "Franck Houssen" < franck.hous...@inria.fr > > > > > > > Cc: "Andreas Naumann" < andreas-naum...@gmx.net >, cmake@cmake.org > > > > > > Envoyé: Jeudi 4 Janvier 2018 10:43:28 > > > > > > Objet: Re: [CMake] RPATH for pkg-config > > > > > > The cmake rpath settings handle build/install directories more or less > > > automatically, but you need to add a completely different path. > > > > > Yes. That's the problem: I need to add a completely different path. > > > > Try adding the additional path (pretty much every -L you added) to > > > CMAKE_INSTALL_RPATH, and set CMAKE_BUILD_WITH_INSTALL_RPATH=TRUE. > > > > > See does not work > > > >> more ../CMakeLists.txt > > > ... > > > foreach(dir ${PETSc_LIBRARY_DIRS}) > > > link_directories(main PUBLIC ${dir}) > > > message("link_directories - dir is ${dir}") > > > set(CMAKE_INSTALL_RPATH "${dir}:${CMAKE_INSTALL_RPATH}") > > > endforeach(dir) > > s/:/;/ > You need to use a semicolon instead is a colon as a cmake list separator. I wish it could have worked. Don't understand. I added a message >> cmake ..; make VERBOSE=1 ... target_link_libraries - lib is -L/home/fghoussen/Documents/INRIA/petsc/local/lib target_link_libraries - lib is -lpetsc link_directories - dir is /home/fghoussen/Documents/INRIA/petsc/local/lib CMAKE_INSTALL_RPATH: /home/fghoussen/Documents/INRIA/petsc/local/lib;/usr/local/lib;/usr/local/lib; ... >> ldd main linux-vdso.so.1 (0x7ffdec8e8000) libmpi_cxx.so.20 => /usr/lib/x86_64-linux-gnu/libmpi_cxx.so.20 (0x7f429a28a000) libmpi.so.20 => /usr/lib/x86_64-linux-gnu/libmpi.so.20 (0x7f4299f94000) libpetsc.so.3.8 => not found > > ... > > > SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) > > > ... > > > >> cmake ..; make VERBOSE=1 > > > ... > > > target_link_libraries - lib is > > -L/home/fghoussen/Documents/INRIA/petsc/local/lib > > > target_link_libraries - lib is -lpetsc > > > link_directories - dir is /home/fghoussen/Documents/INRIA/petsc/local/lib > > > ... > > > [ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o > > > /usr/bin/c++ -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi > > -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi/opal/mca/event/libevent2022/libevent > > -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi/opal/mca/event/libevent2022/libevent/include > > -I/usr/lib/x86_64-linux-gnu/openmpi/include > > -I/home/fghoussen/Documents/INRIA/petsc/local/include -o > > CMakeFiles/main.dir/main.cpp.o -c > > /home/fghoussen/Downloads/cmake/rpath-pkgconfig/main.cpp > > > [100%] Linking CXX executable main > > > /usr/bin/cmake -E cmake_link_script CMakeFiles/main.dir/link.txt > > --verbose=1 > > > /usr/bin/c++ CMakeFiles/main.dir/main.cpp.o -o main > > -Wl,-rpath,/usr/lib/x86_64-linux-gnu/openmpi/lib > > /usr/lib/x86_64-linux-gnu/openmpi/lib/libmpi_cxx.so > > /usr/lib/x86_64-linux-gnu/openmpi/lib/libmpi.so > > -L/home/fghoussen/Documents/INRIA/petsc/local/lib -lpetsc > > > make[2]: Leaving directory > > '/home/fghoussen/Downloads/cmake/rpath-pkgconfig/BUILD' > > > [100%] Built target main > > > make[1]: Leaving directory > > '/home/fghoussen/Downloads/cmake/rpath-pkgconfig/BUILD' > > > /usr/bin/cmake -E cmake_progress_start > > /home/fghoussen/Downloads/cmake/rpath-pkgconfig/BUILD/CMakeFiles 0 > > > >> ldd main > > > linux-vdso.so.1 (0x7ffcd876b000) > > > libmpi_cxx.so.20 => /usr/lib/x86_64-linux-gnu/libmpi_cxx.so.20 > > (0x7f9eaba1f000) > > > libmpi.so.20 => /usr/lib/x86_64-linux-gnu/libmpi.so.20 (0x7f9eab729000) > > > libpetsc.so.3.8 => not found > > > > Then run cmake with the ‘-v’ option and look at the link command to > > > verify > > > rpath was passed correctly. > > > > > > You can also examine it in a library or executable with ‘objdump-x’. > > > > > > You may want to customize this fo
Re: [CMake] RPATH for pkg-config
Are you still doing this at the end? You are overwriting here, not adding. IF("${isSystemDir}" STREQUAL "-1") SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") ENDIF("${isSystemDir}" STREQUAL "-1") Also, do not use ':', use ';' instead as a separator. Or use 'list(APPEND ...), to add to a list. On Thu, Jan 4, 2018 at 8:34 AM, Franck Houssen wrote: > nope !... :D > > -- > > *De: *"Don Hinton" > *À: *"Franck Houssen" > *Cc: *"Andreas Naumann" , cmake@cmake.org > *Envoyé: *Jeudi 4 Janvier 2018 16:52:53 > *Objet: *Re: [CMake] RPATH for pkg-config > > > On Thu, Jan 4, 2018 at 3:57 AM Franck Houssen > wrote: > >> -- >> >> *De: *"Don Hinton" >> *À: *"Franck Houssen" >> *Cc: *"Andreas Naumann" , cmake@cmake.org >> *Envoyé: *Jeudi 4 Janvier 2018 10:43:28 >> >> >> *Objet: *Re: [CMake] RPATH for pkg-config >> >> The cmake rpath settings handle build/install directories more or less >> automatically, but you need to add a completely different path. >> >> >> Yes. That's the problem: I need to add a completely different path. >> >> >> Try adding the additional path (pretty much every -L you added) to >> CMAKE_INSTALL_RPATH, and set CMAKE_BUILD_WITH_INSTALL_RPATH=TRUE. >> >> >> See does not work >> >> >> more ../CMakeLists.txt >> ... >> >> foreach(dir ${PETSc_LIBRARY_DIRS}) >> link_directories(main PUBLIC ${dir}) >> message("link_directories - dir is ${dir}") >> set(CMAKE_INSTALL_RPATH "${dir}:${CMAKE_INSTALL_RPATH}") >> endforeach(dir) >> > > s/:/;/ > > >> You need to use a semicolon instead is a colon as a cmake list separator. > > > > I wish it could have worked. Don't understand. > > I added a message > > >> cmake ..; make VERBOSE=1 > ... > target_link_libraries - lib is -L/home/fghoussen/Documents/ > INRIA/petsc/local/lib > target_link_libraries - lib is -lpetsc > link_directories - dir is /home/fghoussen/Documents/INRIA/petsc/local/lib > CMAKE_INSTALL_RPATH: /home/fghoussen/Documents/INRIA/petsc/local/lib;/usr/ > local/lib;/usr/local/lib; > ... > >> ldd main > linux-vdso.so.1 (0x7ffdec8e8000) > libmpi_cxx.so.20 => /usr/lib/x86_64-linux-gnu/libmpi_cxx.so.20 > (0x7f429a28a000) > libmpi.so.20 => /usr/lib/x86_64-linux-gnu/libmpi.so.20 > (0x7f4299f94000) > libpetsc.so.3.8 => not found > > > >> ... >> SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) >> ... >> >> >> cmake ..; make VERBOSE=1 >> ... >> target_link_libraries - lib is -L/home/fghoussen/Documents/ >> INRIA/petsc/local/lib >> target_link_libraries - lib is -lpetsc >> link_directories - dir is /home/fghoussen/Documents/INRIA/petsc/local/lib >> ... >> [ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o >> /usr/bin/c++ -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi >> -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi/opal/ >> mca/event/libevent2022/libevent -I/usr/lib/x86_64-linux-gnu/ >> openmpi/include/openmpi/opal/mca/event/libevent2022/libevent/include >> -I/usr/lib/x86_64-linux-gnu/openmpi/include >> -I/home/fghoussen/Documents/INRIA/petsc/local/include >> -o CMakeFiles/main.dir/main.cpp.o -c /home/fghoussen/Downloads/ >> cmake/rpath-pkgconfig/main.cpp >> [100%] Linking CXX executable main >> /usr/bin/cmake -E cmake_link_script CMakeFiles/main.dir/link.txt >> --verbose=1 >> /usr/bin/c++ CMakeFiles/main.dir/main.cpp.o -o main >> -Wl,-rpath,/usr/lib/x86_64-linux-gnu/openmpi/lib >> /usr/lib/x86_64-linux-gnu/openmpi/lib/libmpi_cxx.so >> /usr/lib/x86_64-linux-gnu/openmpi/lib/libmpi.so >> -L/home/fghoussen/Documents/INRIA/petsc/local/lib -lpetsc >> make[2]: Leaving directory '/home/fghoussen/Downloads/ >> cmake/rpath-pkgconfig/BUILD' >> [100%] Built target main >> make[1]: Leaving directory '/home/fghoussen/Downloads/ >> cmake/rpath-pkgconfig/BUILD' >> /usr/bin/cmake -E cmake_progress_start /home/fghoussen/Downloads/ >> cmake/rpath-pkgconfig/BUILD/CMakeFiles 0 >> >> >> ldd main >> linux-vdso.so.1 (0x7ffcd876b000) >> libmpi_cxx.so.20 => /usr/lib/x86_64-linux-gnu/libmpi_cxx.so.20 >> (0x7f9eaba1f000) >> libmpi.so.20 => /usr/lib/x86_64-linux-gnu/libmpi.so.20 >> (0x7f9eab729000) >> libpetsc.so.3.8 => not found
Re: [CMake] RPATH for pkg-config
not working with the last cmakelist I have which is: >> more ../CMakeLists.txt cmake_minimum_required(VERSION 3.7) enable_language(CXX) find_package(MPI REQUIRED) find_package(PkgConfig REQUIRED) # Get pkg_check_modules. pkg_check_modules(PETSc REQUIRED PETSc) project(main) add_executable(main main.cpp) target_include_directories(main PUBLIC ${MPI_CXX_INCLUDE_PATH}) target_link_libraries(main PUBLIC ${MPI_CXX_LIBRARIES}) target_include_directories(main PUBLIC ${PETSc_INCLUDE_DIRS}) foreach(lib ${PETSc_LDFLAGS}) target_link_libraries(main PUBLIC ${lib}) message("target_link_libraries - lib is ${lib}") endforeach(lib) # use, i.e. don't skip the full RPATH for the build tree SET(CMAKE_SKIP_BUILD_RPATH FALSE) # when building, don't use the install RPATH already # (but later on when installing) SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;${CMAKE_INSTALL_RPATH}") # add the automatically determined parts of the RPATH # which point to directories outside the build tree to the install RPATH SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # the RPATH to be used when installing, but only if it's not a system directory LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) IF("${isSystemDir}" STREQUAL "-1") SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;${CMAKE_INSTALL_RPATH}") ENDIF("${isSystemDir}" STREQUAL "-1") foreach(dir ${PETSc_LIBRARY_DIRS}) link_directories(main PUBLIC ${dir}) message("link_directories - dir is ${dir}") set(CMAKE_INSTALL_RPATH "${dir};${CMAKE_INSTALL_RPATH}") endforeach(dir) message("CMAKE_INSTALL_RPATH: ${CMAKE_INSTALL_RPATH}") include(CTest) enable_testing() add_test(NAME main COMMAND "mpirun -n 2 ./main" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") - Mail original - > De: "Don Hinton" > À: "Franck Houssen" > Cc: "Andreas Naumann" , "CMake Mail List" > > Envoyé: Jeudi 4 Janvier 2018 17:47:19 > Objet: Re: [CMake] RPATH for pkg-config > Are you still doing this at the end? You are overwriting here, not adding. > IF("${isSystemDir}" STREQUAL "-1") > SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") > ENDIF("${isSystemDir}" STREQUAL "-1") > Also, do not use ':', use ';' instead as a separator. Or use 'list(APPEND > ...), to add to a list. > On Thu, Jan 4, 2018 at 8:34 AM, Franck Houssen < franck.hous...@inria.fr > > wrote: > > nope !... :D > > > > De: "Don Hinton" < hinto...@gmail.com > > > > > > > À: "Franck Houssen" < franck.hous...@inria.fr > > > > > > > Cc: "Andreas Naumann" < andreas-naum...@gmx.net >, cmake@cmake.org > > > > > > Envoyé: Jeudi 4 Janvier 2018 16:52:53 > > > > > > Objet: Re: [CMake] RPATH for pkg-config > > > > > > On Thu, Jan 4, 2018 at 3:57 AM Franck Houssen < franck.hous...@inria.fr > > > > wrote: > > > > > > > > De: "Don Hinton" < hinto...@gmail.com > > > > > > > > > > > > > > > > À: "Franck Houssen" < franck.hous...@inria.fr > > > > > > > > > > > > > > > > Cc: "Andreas Naumann" < andreas-naum...@gmx.net >, cmake@cmake.org > > > > > > > > > > > > > > > Envoyé: Jeudi 4 Janvier 2018 10:43:28 > > > > > > > > > > > > > > > Objet: Re: [CMake] RPATH for pkg-config > > > > > > > > > > > > > > > The cmake rpath settings handle build/install directories more or > > > > > less > > > > > automatically, but you need to add a completely different path. > > > > > > > > > > > > > > Yes. That's the problem: I need to add a completely different path. > > > > > > > > > > > Try adding the additional path (pretty much every -L you added) to > > > > > CMAKE_INSTALL_RPATH, and set CMAKE_BUILD_WITH_INSTALL_RPATH=TRUE. > > > > > > > > > > > > > > See does not work > > > > > > > > > > >> more ../CMakeLists.txt > > > > > > > > > > ... > > > > > > > > > > foreach(dir ${PETSc_LIBRARY_DIRS}) > > > > > > > > > > lin
Re: [CMake] RPATH for pkg-config
This is mostly an ordering problem -- you need to setup everything before calling add_executable. Also, I was wrong about using ';' in RPATH variables. They should use ':' as in your original since they are used verbatim. Here's an example that works: $ cat ../CMakeLists.txt cmake_minimum_required(VERSION 3.7) project(main) enable_language(CXX) find_package(MPI REQUIRED) find_package(PkgConfig REQUIRED) pkg_check_modules(PETSc REQUIRED PETSc) # RPATH variables must be set, and link_directories called. before calling add_executable. SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_RPATH}:$ORIGIN/../lib:${PETSc_LIBRARY_DIRS}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--enable-new-dtags") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--enable-new-dtags") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--enable-new-dtags") link_directories(${PETSc_LIBRARY_DIRS}) add_executable(main main.cpp) target_include_directories(main PUBLIC ${MPI_CXX_INCLUDE_PATH} ${PETSc_INCLUDE_DIRS}) target_link_libraries(main PUBLIC ${MPI_CXX_LIBRARIES} ${PETSc_LIBRARIES}) install(TARGETS main RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) $ make VERBOSE=1 /usr/local/bin/cmake -H/home/dhinton/test -B/home/dhinton/test/build --check-build-system CMakeFiles/Makefile.cmake 0 /usr/local/bin/cmake -E cmake_progress_start /home/dhinton/test/build/CMakeFiles /home/dhinton/test/build/CMakeFiles/progress.marks make -f CMakeFiles/Makefile2 all make[1]: Entering directory '/home/dhinton/test/build' make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/depend make[2]: Entering directory '/home/dhinton/test/build' cd /home/dhinton/test/build && /usr/local/bin/cmake -E cmake_depends "Unix Makefiles" /home/dhinton/test /home/dhinton/test /home/dhinton/test/build /home/dhinton/test/build /home/dhinton/test/build/CMakeFiles/main.dir/DependInfo.cmake --color= make[2]: Leaving directory '/home/dhinton/test/build' make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/build make[2]: Entering directory '/home/dhinton/test/build' make[2]: Nothing to be done for 'CMakeFiles/main.dir/build'. make[2]: Leaving directory '/home/dhinton/test/build' [100%] Built target main make[1]: Leaving directory '/home/dhinton/test/build' /usr/local/bin/cmake -E cmake_progress_start /home/dhinton/test/build/CMakeFiles 0 $ objdump -x main | grep PATH RUNPATH :$ORIGIN/../lib:/home/dhinton/usr/lib $ make install [100%] Built target main Install the project... -- Install configuration: "" -- Installing: /home/dhinton/petsc-test/bin/main $ objdump -x ~/petsc-test/bin/main | grep PATH RUNPATH :$ORIGIN/../lib:/home/dhinton/usr/lib hth... don On Thu, Jan 4, 2018 at 9:13 AM, Franck Houssen wrote: > not working with the last cmakelist I have which is: > > >> more ../CMakeLists.txt > cmake_minimum_required(VERSION 3.7) > enable_language(CXX) > > find_package(MPI REQUIRED) > find_package(PkgConfig REQUIRED) # Get pkg_check_modules. > pkg_check_modules(PETSc REQUIRED PETSc) > > project(main) > add_executable(main main.cpp) > > target_include_directories(main PUBLIC ${MPI_CXX_INCLUDE_PATH}) > target_link_libraries(main PUBLIC ${MPI_CXX_LIBRARIES}) > > target_include_directories(main PUBLIC ${PETSc_INCLUDE_DIRS}) > foreach(lib ${PETSc_LDFLAGS}) > target_link_libraries(main PUBLIC ${lib}) > message("target_link_libraries - lib is ${lib}") > endforeach(lib) > > # use, i.e. don't skip the full RPATH for the build tree > SET(CMAKE_SKIP_BUILD_RPATH FALSE) > # when building, don't use the install RPATH already > # (but later on when installing) > SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) > SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;$ > {CMAKE_INSTALL_RPATH}") > # add the automatically determined parts of the RPATH > # which point to directories outside the build tree to the install RPATH > SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) > # the RPATH to be used when installing, but only if it's not a system > directory > LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES > "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) > IF("${isSystemDir}" STREQUAL "-1") >SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;$ > {CMAKE_INSTALL_RPATH}") > ENDIF("${isSystemDir}" STREQUAL "-1") > foreach(dir ${PETSc_LIBRARY_DIRS}) > link_directories(main PUBLIC ${dir}) > message("link_directories - dir is ${dir}") > set(CMAKE_INSTALL_RPATH "${dir};${CMAKE_INSTALL_RPATH}") > endforeach(dir) > message("CMAKE_INSTALL_RPATH: ${CMAKE_INS
Re: [CMake] RPATH for pkg-config
CTORIES >> "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) >> IF("${isSystemDir}" STREQUAL "-1") >>SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;$ >> {CMAKE_INSTALL_RPATH}") >> ENDIF("${isSystemDir}" STREQUAL "-1") >> foreach(dir ${PETSc_LIBRARY_DIRS}) >> link_directories(main PUBLIC ${dir}) >> message("link_directories - dir is ${dir}") >> set(CMAKE_INSTALL_RPATH "${dir};${CMAKE_INSTALL_RPATH}") >> endforeach(dir) >> message("CMAKE_INSTALL_RPATH: ${CMAKE_INSTALL_RPATH}") >> >> include(CTest) >> enable_testing() >> add_test(NAME main COMMAND "mpirun -n 2 ./main" WORKING_DIRECTORY >> "${CMAKE_CURRENT_BINARY_DIR}") >> >> -- >> >> *De: *"Don Hinton" >> *À: *"Franck Houssen" >> *Cc: *"Andreas Naumann" , "CMake Mail List" < >> cmake@cmake.org> >> *Envoyé: *Jeudi 4 Janvier 2018 17:47:19 >> >> *Objet: *Re: [CMake] RPATH for pkg-config >> >> Are you still doing this at the end? You are overwriting here, not >> adding. >> >> IF("${isSystemDir}" STREQUAL "-1") >>SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") >> ENDIF("${isSystemDir}" STREQUAL "-1") >> >> Also, do not use ':', use ';' instead as a separator. Or use >> 'list(APPEND ...), to add to a list. >> >> On Thu, Jan 4, 2018 at 8:34 AM, Franck Houssen >> wrote: >> >>> nope !... :D >>> >>> -- >>> >>> *De: *"Don Hinton" >>> *À: *"Franck Houssen" >>> *Cc: *"Andreas Naumann" , cmake@cmake.org >>> *Envoyé: *Jeudi 4 Janvier 2018 16:52:53 >>> *Objet: *Re: [CMake] RPATH for pkg-config >>> >>> >>> On Thu, Jan 4, 2018 at 3:57 AM Franck Houssen >>> wrote: >>> >>>> -- >>>> >>>> *De: *"Don Hinton" >>>> *À: *"Franck Houssen" >>>> *Cc: *"Andreas Naumann" , cmake@cmake.org >>>> *Envoyé: *Jeudi 4 Janvier 2018 10:43:28 >>>> >>>> >>>> *Objet: *Re: [CMake] RPATH for pkg-config >>>> >>>> The cmake rpath settings handle build/install directories more or less >>>> automatically, but you need to add a completely different path. >>>> >>>> >>>> Yes. That's the problem: I need to add a completely different path. >>>> >>>> >>>> Try adding the additional path (pretty much every -L you added) to >>>> CMAKE_INSTALL_RPATH, and set CMAKE_BUILD_WITH_INSTALL_RPATH=TRUE. >>>> >>>> >>>> See does not work >>>> >>>> >> more ../CMakeLists.txt >>>> ... >>>> >>>> foreach(dir ${PETSc_LIBRARY_DIRS}) >>>> link_directories(main PUBLIC ${dir}) >>>> message("link_directories - dir is ${dir}") >>>> set(CMAKE_INSTALL_RPATH "${dir}:${CMAKE_INSTALL_RPATH}") >>>> endforeach(dir) >>>> >>> >>> s/:/;/ >>> >>> >>>> You need to use a semicolon instead is a colon as a cmake list >>> separator. >>> >>> >>> >>> I wish it could have worked. Don't understand. >>> >>> I added a message >>> >>> >> cmake ..; make VERBOSE=1 >>> ... >>> target_link_libraries - lib is -L/home/fghoussen/Documents/IN >>> RIA/petsc/local/lib >>> target_link_libraries - lib is -lpetsc >>> link_directories - dir is /home/fghoussen/Documents/INRI >>> A/petsc/local/lib >>> CMAKE_INSTALL_RPATH: /home/fghoussen/Documents/INRI >>> A/petsc/local/lib;/usr/local/lib;/usr/local/lib; >>> ... >>> >> ldd main >>> linux-vdso.so.1 (0x7ffdec8e8000) >>> libmpi_cxx.so.20 => /usr/lib/x86_64-linux-gnu/libmpi_cxx.so.20 >>> (0x7f429a28a000) >>> libmpi.so.20 => /usr/lib/x86_64-linux-gnu/libmpi.so.20 >>> (0x7f4299f94000) >>> libpetsc.so.3.8 => not found >>> >>> >>> >>>> ... >>>> SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) >>>> ... >>>> >>>> >> cmake ..; make VERBOSE=1 >>>> ..
Re: [CMake] RPATH for pkg-config
On 2018 M01 4, Thu 10:06:26 CET Franck Houssen wrote: ... > ... > target_include_directories(main PUBLIC ${PETSc_INCLUDE_DIRS}) > foreach(lib ${PETSc_LDFLAGS}) > target_link_libraries(main PUBLIC ${lib}) > message("target_link_libraries - lib is ${lib}") > endforeach(lib) > > foreach(dir ${PETSc_LIBRARY_DIRS}) > link_directories(main PUBLIC ${dir}) # Not sure: is this needed ? > message("link_directories - dir is ${dir}") > endforeach(dir) > > This gives: > >> cmake ..; make > > ... > target_link_libraries - lib is -L/path/to/petsc/local/lib > target_link_libraries - lib is -lpetsc > link_directories - dir is /path/to/petsc/local/lib yes, so cmake doesn't know that it will link to /path/to/petsc/local/lib/ libpetsc.so . I usually recommend to use the results from pkgconfig as input to find_library() etc. calls, ie. put the directory reported by pkgconfig in the HINTS section of find_library(). This should then return the full path to the library, which you can then use in target_link_libraries(), and cmake will take care of the rpath. ... > >> ldd main > > linux-vdso.so.1 (0x7ffebab8a000) > libmpi_cxx.so.20 => /usr/lib/x86_64-linux-gnu/libmpi_cxx.so.20 > (0x7f36172e3000) libmpi.so.20 => /usr/lib/x86_64-linux-gnu/libmpi.so.20 > (0x7f3616fed000) libpetsc.so.3.8 => not found you can also use readelf or objdump to see the RPATH entry in the ELF file directly. Alex -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake
Re: [CMake] RPATH for pkg-config
Working !... At last ! Thanks :D I suspected an ordering problem: I already tried to change the position of "setting CMAKE_INSTALL_RPATH" before / after "calling target_link_libraries"... But didn't try to do this BEFORE add_executable ! Would be nice to add this in the doc https://cmake.org/Wiki/CMake_RPATH_handling : can somebody do that or should I post that to the dev-mail list ?!... Anyway, thanks guys Franck - Mail original - > De: "Don Hinton" > À: "Franck Houssen" > Cc: "Andreas Naumann" , "CMake Mail List" > > Envoyé: Jeudi 4 Janvier 2018 21:49:05 > Objet: Re: [CMake] RPATH for pkg-config > This is mostly an ordering problem -- you need to setup everything before > calling add_executable. Also, I was wrong about using ';' in RPATH > variables. They should use ':' as in your original since they are used > verbatim. > Here's an example that works: > $ cat ../CMakeLists.txt > cmake_minimum_required(VERSION 3.7) > project(main) > enable_language(CXX) > find_package(MPI REQUIRED) > find_package(PkgConfig REQUIRED) > pkg_check_modules(PETSc REQUIRED PETSc) > # RPATH variables must be set, and link_directories called. before calling > add_executable. > SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) > SET(CMAKE_INSTALL_RPATH > "${CMAKE_INSTALL_RPATH}:$ORIGIN/../lib:${PETSc_LIBRARY_DIRS}") > set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} > -Wl,--enable-new-dtags") > set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} > -Wl,--enable-new-dtags") > set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} > -Wl,--enable-new-dtags") > link_directories(${PETSc_LIBRARY_DIRS}) > add_executable(main main.cpp) > target_include_directories(main PUBLIC ${MPI_CXX_INCLUDE_PATH} > ${PETSc_INCLUDE_DIRS}) > target_link_libraries(main PUBLIC ${MPI_CXX_LIBRARIES} ${PETSc_LIBRARIES}) > install(TARGETS main RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) > $ make VERBOSE=1 > /usr/local/bin/cmake -H/home/dhinton/test -B/home/dhinton/test/build > --check-build-system CMakeFiles/Makefile.cmake 0 > /usr/local/bin/cmake -E cmake_progress_start > /home/dhinton/test/build/CMakeFiles > /home/dhinton/test/build/CMakeFiles/progress.marks > make -f CMakeFiles/Makefile2 all > make[1]: Entering directory '/home/dhinton/test/build' > make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/depend > make[2]: Entering directory '/home/dhinton/test/build' > cd /home/dhinton/test/build && /usr/local/bin/cmake -E cmake_depends "Unix > Makefiles" /home/dhinton/test /home/dhinton/test /home/dhinton/test/build > /home/dhinton/test/build > /home/dhinton/test/build/CMakeFiles/main.dir/DependInfo.cmake --color= > make[2]: Leaving directory '/home/dhinton/test/build' > make -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/build > make[2]: Entering directory '/home/dhinton/test/build' > make[2]: Nothing to be done for 'CMakeFiles/main.dir/build'. > make[2]: Leaving directory '/home/dhinton/test/build' > [100%] Built target main > make[1]: Leaving directory '/home/dhinton/test/build' > /usr/local/bin/cmake -E cmake_progress_start > /home/dhinton/test/build/CMakeFiles 0 > $ objdump -x main | grep PATH > RUNPATH :$ORIGIN/../lib:/home/dhinton/usr/lib > $ make install > [100%] Built target main > Install the project... > -- Install configuration: "" > -- Installing: /home/dhinton/petsc-test/bin/main > $ objdump -x ~/petsc-test/bin/main | grep PATH > RUNPATH :$ORIGIN/../lib:/home/dhinton/usr/lib > hth... > don > On Thu, Jan 4, 2018 at 9:13 AM, Franck Houssen < franck.hous...@inria.fr > > wrote: > > not working with the last cmakelist I have which is: > > > >> more ../CMakeLists.txt > > > cmake_minimum_required(VERSION 3.7) > > > enable_language(CXX) > > > find_package(MPI REQUIRED) > > > find_package(PkgConfig REQUIRED) # Get pkg_check_modules. > > > pkg_check_modules(PETSc REQUIRED PETSc) > > > project(main) > > > add_executable(main main.cpp) > > > target_include_directories(main PUBLIC ${MPI_CXX_INCLUDE_PATH}) > > > target_link_libraries(main PUBLIC ${MPI_CXX_LIBRARIES}) > > > target_include_directories(main PUBLIC ${PETSc_INCLUDE_DIRS}) > > > foreach(lib ${PETSc_LDFLAGS}) > > > target_link_libraries(main PUBLIC ${lib}) > > > message("target_link_libraries - lib is ${lib}") > > > endforeach(lib) > > > # use, i.e. don't skip the full RPATH for the build tree
Re: [CMake] RPATH for pkg-config
- Mail original - > De: "Alexander Neundorf" > À: "Franck Houssen" > Cc: cmake@cmake.org > Envoyé: Jeudi 4 Janvier 2018 22:04:02 > Objet: Re: [CMake] RPATH for pkg-config > > On 2018 M01 4, Thu 10:06:26 CET Franck Houssen wrote: > ... > > ... > > target_include_directories(main PUBLIC ${PETSc_INCLUDE_DIRS}) > > foreach(lib ${PETSc_LDFLAGS}) > > target_link_libraries(main PUBLIC ${lib}) > > message("target_link_libraries - lib is ${lib}") > > endforeach(lib) > > > > foreach(dir ${PETSc_LIBRARY_DIRS}) > > link_directories(main PUBLIC ${dir}) # Not sure: is this needed ? > > message("link_directories - dir is ${dir}") > > endforeach(dir) > > > > This gives: > > >> cmake ..; make > > > > ... > > target_link_libraries - lib is -L/path/to/petsc/local/lib > > target_link_libraries - lib is -lpetsc > > link_directories - dir is /path/to/petsc/local/lib > > yes, so cmake doesn't know that it will link to /path/to/petsc/local/lib/ > libpetsc.so . > I usually recommend to use the results from pkgconfig as input to > find_library() > etc. calls, ie. put the directory reported by pkgconfig in the HINTS section > of > find_library(). This should then return the full path to the library, which > you > can then use in target_link_libraries(), and cmake will take care of the > rpath. Nice recommendation. I wouldn't have thought to do that. I'll give it a try. > > you can also use readelf or objdump to see the RPATH entry in the ELF file > directly. > > Alex > > -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake