Created
October 22, 2017 14:43
-
-
Save palmerc/70b82d1d915ddde0c66226f66ca06af3 to your computer and use it in GitHub Desktop.
Work on a complete iOS boost compile script that rolls up all the necessary architectures
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
include( ExternalProject ) | |
set( NCPU 8 ) | |
set( MIN_IOS_VERSION 8.0 ) | |
set( BOOST_VERSION 1.63.0 ) | |
set( BOOST_SHA_CHECKSUM 9f1dd4fa364a3e3156a77dc17aa562ef06404ff6 ) | |
set( BOOST_COMPILE_LIBRARIES filesystem system date_time ) | |
set( COMPILE_ARCHITECTURES armv6 armv7 armv7s arm64 ) | |
set( ENABLE_BITCODE true ) | |
string( REPLACE "." "_" BOOST_FILENAME "boost_${BOOST_VERSION}" ) | |
set( boost_URL "http://sourceforge.net/projects/boost/files/boost/${BOOST_VERSION}/${BOOST_FILENAME}.tar.bz2" ) | |
set( boost_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/third_party/boost ) | |
set( boost_INCLUDE_DIR ${boost_INSTALL}/include ) | |
set( boost_LIB_DIR ${boost_INSTALL}/lib ) | |
execute_process( COMMAND xcrun --sdk iphoneos --show-sdk-platform-path | |
COMMAND tr -d '\r\n' | |
OUTPUT_VARIABLE XCODE_ROOT ) | |
execute_process( COMMAND xcrun --sdk iphoneos --find clang++ | |
COMMAND tr -d '\r\n' | |
OUTPUT_VARIABLE CLANG_PATH ) | |
execute_process( COMMAND xcrun --sdk iphoneos --show-sdk-path | |
COMMAND tr -d '\r\n' | |
OUTPUT_VARIABLE XCODE_SYSROOT ) | |
execute_process( COMMAND xcodebuild -showsdks | |
COMMAND grep iphoneos | |
COMMAND egrep "[[:digit:]]+\.[[:digit:]]+" -o | |
COMMAND tail -1 | |
COMMAND tr -d '\r\n' | |
OUTPUT_VARIABLE IOS_SDK_VERSION ) | |
message( STATUS "IOS SDK Version ${IOS_SDK_VERSION}" ) | |
string( REPLACE ";" "," BOOST_WITH_LIBRARIES "${BOOST_COMPILE_LIBRARIES}" ) | |
message( STATUS "Compile Boost libraries ${BOOST_WITH_LIBRARIES}" ) | |
set( COMPILEFLAGS ) | |
foreach( COMPILE_ARCHITECTURE ${COMPILE_ARCHITECTURES} ) | |
set( COMPILEFLAG "<compileflags>\"-arch ${COMPILE_ARCHITECTURE}\"" ) | |
list( APPEND COMPILEFLAGS ${COMPILEFLAG} ) | |
endforeach( COMPILE_ARCHITECTURE ) | |
if( ENABLE_BITCODE ) | |
list( APPEND COMPILEFLAGS "<compileflags>-fembed-bitcode" ) | |
endif( ENABLE_BITCODE ) | |
string( REPLACE ";" "\n" COMPILEFLAGS_STRING "${COMPILEFLAGS}" ) | |
set( USER_CONFIG_JAM | |
"using darwin : ${IOS_SDK_VERSION}~iphone : | |
${CLANG_PATH} : | |
<striper> | |
<root>${XCODE_ROOT}/Developer | |
<compileflags>-mios-version-min=${MIN_IOS_VERSION} | |
<compileflags>-std=c++11 | |
<compileflags>-stdlib=libc++ | |
<compileflags>-fvisibility-inlines-hidden | |
<compileflags>--sysroot=${XCODE_SYSROOT} | |
${COMPILEFLAGS_STRING} | |
\; | |
" ) | |
file( WRITE ${CMAKE_BINARY_DIR}/user-config.jam ${USER_CONFIG_JAM} ) | |
ExternalProject_Add( external_boost | |
PREFIX boost | |
URL ${boost_URL} | |
URL_HASH SHA1=${BOOST_SHA_CHECKSUM} | |
BUILD_IN_SOURCE 1 | |
CONFIGURE_COMMAND ./bootstrap.sh | |
--with-libraries=${BOOST_WITH_LIBRARIES} | |
--prefix=<INSTALL_DIR> | |
COMMAND ${CMAKE_COMMAND} -E remove <SOURCE_DIR>/tools/build/src/user-config.jam | |
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/user-config.jam <SOURCE_DIR>/tools/build/src/user-config.jam | |
BUILD_COMMAND ./b2 | |
-d+2 | |
-j${NCPU} | |
--reconfigure | |
architecture=arm | |
address-model=32_64 | |
toolset=darwin | |
target-os=iphone | |
macosx-version=iphone-${IOS_SDK_VERSION} | |
define=_LITTLE_ENDIAN | |
link=static | |
variant=release | |
install | |
INSTALL_COMMAND "" | |
INSTALL_DIR ${boost_INSTALL} ) | |
set( BOOST_LIBRARY_SUFFIX .a ) | |
# Expected output filenames for the boost libraries | |
set( BOOST_RESULT_LIBRARIES ) | |
foreach( BOOST_COMPILE_LIBRARY ${BOOST_COMPILE_LIBRARIES} ) | |
set( LIBRARY_NAME libboost_${BOOST_COMPILE_LIBRARY}${BOOST_LIBRARY_SUFFIX} ) | |
list( APPEND BOOST_RESULT_LIBRARIES ${LIBRARY_NAME} ) | |
endforeach( BOOST_COMPILE_LIBRARY ) | |
add_dependencies( BOOST_COMPILE_LIBRARY external_boost ) | |
# Check each static library for the included architectures and toss anything that shouldn't be included | |
foreach( BOOST_RESULT_LIBRARY ${BOOST_RESULT_LIBRARIES} ) | |
execute_process( COMMAND lipo -info ${boost_LIB_DIR}/${BOOST_RESULT_LIBRARY} | |
COMMAND egrep "armv?[[:digit:]]+[[:lower:]]*" -o | |
OUTPUT_VARIABLE ARCHIVE_LIBRARY_ARCHITECTURES ) | |
string(REGEX REPLACE "[\r\n]+" ";" ARCHIVE_LIBRARY_ARCHITECTURES ${ARCHIVE_LIBRARY_ARCHITECTURES} ) | |
set( REMOVE_ARCHITECTURES ) | |
foreach( ARCHIVE_LIBRARY_ARCHITECTURE ${ARCHIVE_LIBRARY_ARCHITECTURES} ) | |
list( FIND COMPILE_ARCHITECTURES ${ARCHIVE_LIBRARY_ARCHITECTURE} CONTAINS_ARCHITECTURE ) | |
if( NOT CONTAINS_ARCHITECTURE ) | |
list( APPEND REMOVE_ARCHITECTURES ${ARCHIVE_LIBRARY_ARCHITECTURE} ) | |
endif( NOT CONTAINS_ARCHITECTURE ) | |
endforeach( ARCHIVE_LIBRARY_ARCHITECTURE ) | |
foreach( REMOVE_ARCHITECTURE ${REMOVE_ARCHITECTURES} ) | |
execute_process( COMMAND lipo -remove ${REMOVE_ARCHITECTURE} -output ${BOOST_RESULT_LIBRARY} ) | |
endforeach( REMOVE_ARCHITECTURE ) | |
endforeach( BOOST_RESULT_LIBRARY ) | |
message( STATUS "${LIBRARY_ARCHITECTURES}" ) | |
add_library( boost::date_time STATIC IMPORTED ) | |
set_property( TARGET boost::date_time PROPERTY IMPORTED_LOCATION ${boost_LIB_DIR}/libboost_date_time${BOOST_LIBRARY_SUFFIX} ) | |
set_property( TARGET boost::date_time PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${boost_INCLUDE_DIR} ) | |
add_dependencies( boost::date_time external_boost ) | |
add_library( boost::system STATIC IMPORTED ) | |
set_property( TARGET boost::system PROPERTY IMPORTED_LOCATION ${boost_LIB_DIR}/libboost_system${BOOST_LIBRARY_SUFFIX} ) | |
set_property( TARGET boost::system PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${boost_INCLUDE_DIR} ) | |
add_dependencies( boost::system external_boost ) | |
add_library( boost::filesystem STATIC IMPORTED ) | |
set_property( TARGET boost::filesystem PROPERTY IMPORTED_LOCATION ${boost_LIB_DIR}/libboost_filesystem${BOOST_LIBRARY_SUFFIX} ) | |
set_property( TARGET boost::filesystem PROPERTY INTERFACE_LINK_LIBRARIES boost::system ) | |
set_property( TARGET boost::filesystem PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${boost_INCLUDE_DIR} ) | |
add_dependencies( boost::filesystem external_boost ) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment