Hi all~
I have been experimenting in my project with using ExternalProject_Add. My
goal is to make our build process more automated, with less headache to get up
and started developing on a fresh system. I decided that boost would be a
great dependency to automate, which I successfully completed and is a HUGE
help. I would like also like to ask the community to code review what I did,
and possibly offer feedback. I also have my own comments with the experience.
My code for review (this was developed only for windows, for now):
include( ExternalProject )
set( Boost_Version 1.49.0 )
string( REPLACE "." "_" Boost_Version_Underscore ${Boost_Version} )
message( STATUS "Boost_Version: " ${Boost_Version} )
# Below is a CMake command to download, build and install Boost on the user's
computer
ExternalProject_Add(
Boost
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/external/boost
URL
http://downloads.sourceforge.net/project/boost/boost/${Boost_Version}/boost_${Boost_Version_Underscore}.zip
URL_MD5 854dcbbff31b896c85c38247060b7713
UPDATE_COMMAND "bootstrap.bat"
CONFIGURE_COMMAND ""
BUILD_COMMAND bjam --with-program_options address-model=64
toolset=msvc-11.0 link=static stage
BUILD_IN_SOURCE 1
INSTALL_COMMAND ""
)
set_property( TARGET Boost PROPERTY FOLDER "Externals")
ExternalProject_Get_Property( Boost source_dir )
ExternalProject_Get_Property( Boost binary_dir )
set( Boost_INCLUDE_DIRS ${source_dir} )
set( Boost_LIBRARIES
debug;${binary_dir}/stage/lib/libboost_program_options-vc110-mt-gd-1_49.lib;optimized;${binary_dir}/stage/lib/libboost_program_options-vc110-mt-1_49.lib
)
A few of my comments while developing this. Boost's native build system is
called Jam. However, there are efforts to port Boost to cmake, available
either on github or gitorious. I would rather stick with one build system and
use cmake, but I could not use either of these repositories with
ExternalProject_Add.
1. Github appears to only use the https protocol, and the cmake file(
download ... ) command does not appear to handle this protocol. So, I think
GitHub is verboten for any ExternalProject_Add. Am I right, or am I missing
something? Any plans to add https support?
2. ExternalProject_Add checks the file extension of the URL download, to
'verify' the download is a supported package. I would actually like to request
that it not verify the file extension. A lot of these public code repositories
offer tarball and zipball downloads, but the links they provide are forwarding
scripts (and they don't offer you direct links), and oftentimes the URL to use
has no extension. I had this problem with both github and gitorious. I think
it has to be left to the user to verify that the link they use if valid.
3. The official subversion repository of boost offers .7z packages to
download. These packages are about half the size of .zips. Will cmake add
decompression support for 7z archives in the near future?
4. ExternalProject_Add will download, configure and build projects at
'build' time. From the documentation, this sounded like a design decision.
However, this means that you can't use the already robust and mature
findboost() module to configure the Boost project. Would it be possible to add
support to ExternalProject_Add to work at 'configure' time? Maybe a flag to
choose when to pay the build cost? This would help me abstract the differences
between linux and windows, for instance. I understand that some people care
that 'configure' is fast, but I would prefer not to rewrite the logic already
in the findboost packge. Also, if ExternalProject_Add worked at 'configure'
time, then I would think that it would be possible for the findboost package
maintainer to incorporate ExternalProject_Add into the find module itself.
Then, users could pass a possible flag into findBoost that says, 'if you don't
find boost locally on the system, just download the lastest version of boost
for me and proceed with configuring.'
Thanks in advance for comments,
Kent
--
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake