[CMake] Build only what you need in third party libs
Brian Davis
bitminer at gmail.com
Tue Dec 22 00:06:16 EST 2009
I am continuing my attempt (latest in the saga) to use cmake to build 3rd
third party libraries and integrate my code and hopefully build only what I
need.
The two libraries I am building currently are dcmtk (DICOM library) and
boost.
I am trying to use cmake to create a project which includes dcmtk and boost
(and other 3rdParty libs) and projects I am creating
I have a CMakeLists.txt file which has the following line removed
#add_subdirectory( ${THIRD_PARTY_SRC_DIR}/boost-cmake-1_41_0 ./boost )
When I use this I see in my CMakeCache.txt (and ultimaetly MSVS project
files) the following (using grep):
build/dvip4-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS:STRING=/machine:x64
build/dvip4-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING=/debug
/INCREMENTAL:YES
build/dvip4-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING=/INCREMENTAL:NO
build/dvip4-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING=/INCREMENTAL:NO
build/dvip4-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING=/debug
/INCREMENTAL:YES
build/dvip4-Win64/CMakeCache.txt://ADVANCED property for variable:
CMAKE_MODULE_LINKER_FLAGS
build/dvip4-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1
build/dvip4-Win64/CMakeCache.txt://ADVANCED property for variable:
CMAKE_MODULE_LINKER_FLAGS_DEBUG
build/dvip4-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
build/dvip4-Win64/CMakeCache.txt://ADVANCED property for variable:
CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL
build/dvip4-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
build/dvip4-Win64/CMakeCache.txt://ADVANCED property for variable:
CMAKE_MODULE_LINKER_FLAGS_RELEASE
build/dvip4-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
build/dvip4-Win64/CMakeCache.txt://ADVANCED property for variable:
CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO
build/dvip4-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
When I add the line
add_subdirectory( ${THIRD_PARTY_SRC_DIR}/boost-cmake-1_41_0 ./boost )
I get the following (using grep):
build/test-Win64/CMakeCache.txt://ADVANCED property for variable:
CMAKE_MODULE_LINKER_FLAGS
build/test-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1
build/test-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS:INTERNAL=/machine:x64
build/test-Win64/CMakeCache.txt://ADVANCED property for variable:
CMAKE_MODULE_LINKER_FLAGS_DEBUG
build/test-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
build/test-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_DEBUG:INTERNAL=
build/test-Win64/CMakeCache.txt://ADVANCED property for variable:
CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL
build/test-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
build/test-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:INTERNAL=
build/test-Win64/CMakeCache.txt://ADVANCED property for variable:
CMAKE_MODULE_LINKER_FLAGS_RELEASE
build/test-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
build/test-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_RELEASE:INTERNAL=
build/test-Win64/CMakeCache.txt://ADVANCED property for variable:
CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO
build/test-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
build/test-Win64/CMakeCache.txt:CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:INTERNAL=
Notice the change from CMAKE_MODULE_LINKER_FLAGS:STRING to
CMAKE_MODULE_LINKER_FLAGS:INTERNAL. When this happens it appears as though
any calls I have in my CMakeLists.txt file containing:
SET( CMAKE_EXE_LINKER_FLAGS /machine:x64 CACHE STRING "" FORCE )
SET( CMAKE_MODULE_LINKER_FLAGS /machine:x64 CACHE STRING "" FORCE )
SET( CMAKE_SHARED_LINKER_FLAGS /machine:x64 CACHE STRING "" FORCE )
Have no effect.
Looking at boost for the CMAKE vars in question I get:
source/cpp/lib/3rdParty/Win32/boost-cmake-1_41_0/CMakeLists.txt:list(APPEND
CMAKE_MODULE_PATH ${Boost_SOURCE_DIR}/tools/build/CMake)
source/cpp/lib/3rdParty/Win32/boost-cmake-1_41_0/tools/build/CMake/BoostConfig.cmake:set(CMAKE_MODULE_LINKER_FLAGS_DEBUG
"" CACHE INTERNAL "Unused by Boost")
source/cpp/lib/3rdParty/Win32/boost-cmake-1_41_0/tools/build/CMake/BoostConfig.cmake:set(CMAKE_MODULE_LINKER_FLAGS_RELEASE
"" CACHE INTERNAL "Unused by Boost")
source/cpp/lib/3rdParty/Win32/boost-cmake-1_41_0/tools/build/CMake/BoostConfig.cmake:set(CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL
"" CACHE INTERNAL "Unused by Boost")
source/cpp/lib/3rdParty/Win32/boost-cmake-1_41_0/tools/build/CMake/BoostConfig.cmake:set(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO
"" CACHE INTERNAL "Unused by Boost")
source/cpp/lib/3rdParty/Win32/vtk-5.4.2/CMake/vtkDetermineCompilerFlags.cmake:SET(CMAKE_MODULE_LINKER_FLAGS
"${CMAKE_MODULE_LINKER_FLAGS} ${VTK_REQUIRED_MODULE_LINKER_FLAGS}")
Which shows CACHE INTERNAL.
Is boost forceably overriding these and keeping user from changing or is
there a way I can change these.
At this point I also have a very basic question in the use case of CMAKE:
Is the cmake user suppoed to point cmake-gui separately to each individual
project, dcmk, boost, vtk, itk, etc or can I do what I am attempting: Create
one CMakeLists.txt file which references multiple separate project files
from multiple 3rdParty vendors then point cmake to 1 CMakeLists.txt file
(mine) and have cmake build all my code and whatever third party libs my
apps depend on. Currently, if I understand what is happening and I am not
saying I do, it seems as though each 3rdParty vendor can override global
CMakeVariables and keep an upper level CMakeList.txt file from setting the
variables. This gets to my namespace/project resolution question/problem
with CMake. Was CMake designed for this use case? I have also been having
the problem of the chicken-and-the-egg with the use of
add_subdirectory( ${THIRD_PARTY_SRC_DIR}/boost-cmake-1_41_0 ./boost )
and
find( boost )
i.e. How can I find boost if I have not build it yet (fresh checkout)....
awesome.
my current CMakeLists.txt file contains:
SET( PLATFORM_DIR platform/3rdParty/Win32 )
SET( THIRD_PARTY_PACKAGE_DIR source/cpp/lib/3rdParty/Win32 )
SET( THIRD_PARTY_SRC_DIR lib/3rdParty/Win32/ )
SET( APP_SRC_DIR source/cpp/app )
#Unpack the source - this function I wrote myself to unpack 3rdParty source
zip files into the source tree.
unpack( ${PLATFORM_DIR}/boost/boost-cmake-1_41_0.zip
${THIRD_PARTY_PACKAGE_DIR} )
#~ unpack( ${PLATFORM_DIR}/ITK/InsightApplications-3.16.0.zip
${THIRD_PARTY_PACKAGE_DIR} )
#~ unpack( ${PLATFORM_DIR}/ITK/InsightToolkit-3.16.0.zip
${THIRD_PARTY_PACKAGE_DIR} )
unpack( ${PLATFORM_DIR}/VTK/vtk-5.4.2.zip
${THIRD_PARTY_PACKAGE_DIR}/vtk-5.4.2 )
add_subdirectory( ${THIRD_PARTY_SRC_DIR}/dcmtk-3.5.4 ./dcmtk-3.5.4 )
#~ add_subdirectory( ${THIRD_PARTY_SRC_DIR}/vtk-5.4.2 ./vtk-5.4.2 )
add_subdirectory( ${THIRD_PARTY_SRC_DIR}/boost-cmake-1_41_0 ./boost )
add_subdirectory( app/testing/dicomserver ./dicomserver )
SET( Boost_INCLUDE_DIR ${THIRD_PARTY_SRC_DIR}/boost-cmake-1_41_0 CACHE
STRING "" FORCE )
#add_subdirectory( ${THIRD_PARTY_SRC_DIR}/InsightToolkit-3.16.0
./InsightToolkit-3.16.0 )
#add_subdirectory( ${THIRD_PARTY_SRC_DIR}/InsightApplications-3.16.0
./InsightApplications-3.16.0 )
#~ find_package( cuda 2.3 )
#~ find_package( boost )
find_package( dcmtk )
There has been some conflicts adding in certain packages into this file
(boost and vtk) with dcmtk.
Am I in uncharted shark invested waters on a leaky inflatable raft covered
in cheese bait, with what I am attempting or has anyone tried what I am
trying to do. Is this normal or just some form of crazy?
Brian
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20091221/e2ac2f39/attachment.htm>
More information about the CMake
mailing list