|
|
@@ -25,7 +25,11 @@
|
|
|
|
|
|
if (NOT CMAKE_PROJECT_NAME STREQUAL Urho3D)
|
|
|
# Set CMake minimum version and CMake policy required by Urho3D-CMake-common module
|
|
|
- cmake_minimum_required (VERSION 2.8.6)
|
|
|
+ if (APPLE)
|
|
|
+ cmake_minimum_required (VERSION 3.4.1)
|
|
|
+ else ()
|
|
|
+ cmake_minimum_required (VERSION 2.8.6)
|
|
|
+ endif ()
|
|
|
if (COMMAND cmake_policy)
|
|
|
cmake_policy (SET CMP0003 NEW)
|
|
|
if (CMAKE_VERSION VERSION_GREATER 2.8.12 OR CMAKE_VERSION VERSION_EQUAL 2.8.12)
|
|
|
@@ -48,8 +52,8 @@ if (NOT CMAKE_PROJECT_NAME STREQUAL Urho3D)
|
|
|
|
|
|
# Include Urho3D Cmake common module
|
|
|
include (Urho3D-CMake-common)
|
|
|
-elseif (CMAKE_CROSSCOMPILING)
|
|
|
- set (TOOL_PATH ${CMAKE_BINARY_DIR}/bin/tool/)
|
|
|
+elseif (NOT BAKED_CMAKE_SOURCE_DIR)
|
|
|
+ set (BAKED_CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR})
|
|
|
endif ()
|
|
|
|
|
|
# Makefile: Compiler options
|
|
|
@@ -197,7 +201,13 @@ if (NOT LUAJIT_CACHE STREQUAL "${URHO3D_64BIT}-${LUAJIT_DISABLE_FFI}-${LUAJIT_DI
|
|
|
if (XCODE)
|
|
|
if (ARCH) # The ARCH variable is defined only when we are building LuaJIT for non-native archs using external project
|
|
|
set (ARCH_FLAGS -arch ${ARCH})
|
|
|
- elseif (URHO3D_DEFAULT_64BIT AND NOT URHO3D_64BIT)
|
|
|
+ elseif (IOS)
|
|
|
+ if (URHO3D_64BIT)
|
|
|
+ set (ARCH_FLAGS -arch arm64)
|
|
|
+ else ()
|
|
|
+ set (ARCH_FLAGS -arch armv7)
|
|
|
+ endif ()
|
|
|
+ elseif (NOT URHO3D_64BIT)
|
|
|
set (ARCH_FLAGS -arch i386)
|
|
|
endif ()
|
|
|
endif ()
|
|
|
@@ -364,11 +374,17 @@ if (CMAKE_CROSSCOMPILING)
|
|
|
endforeach ()
|
|
|
# When cross-compiling, build the host tool as external project
|
|
|
include (ExternalProject)
|
|
|
+ if (IOS)
|
|
|
+ # For iOS target, ensure the host environment is cleared first; Also workaround a known CMake/Xcode generator bug which prevents it from installing binaries correctly
|
|
|
+ set (IOS_FIX CMAKE_COMMAND /usr/bin/env -i PATH=$ENV{PATH} ${CMAKE_COMMAND} BUILD_COMMAND bash -c "sed -i '' 's/EFFECTIVE_PLATFORM_NAME//g' CMakeScripts/install_postBuildPhase.make*")
|
|
|
+ endif ()
|
|
|
+ set (TOOL_PATH ${CMAKE_CURRENT_BINARY_DIR}/tool/)
|
|
|
ExternalProject_Add (buildvm
|
|
|
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/host
|
|
|
- CMAKE_ARGS -DURHO3D_64BIT=${URHO3D_64BIT} -DDEST_RUNTIME_DIR=${CMAKE_BINARY_DIR}/bin/tool -DBAKED_CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR} -DHOST_XCFLAGS=${HOST_XCFLAGS} -DTARGET_ARCH=${TARGET_ARCH} -DDASM_FLAGS=${DASM_FLAGS} -DDASM_ARCH=${DASM_ARCH})
|
|
|
+ CMAKE_ARGS -DURHO3D_64BIT=${URHO3D_64BIT} -DDEST_RUNTIME_DIR=${TOOL_PATH} -DBAKED_CMAKE_SOURCE_DIR=${BAKED_CMAKE_SOURCE_DIR} -DHOST_XCFLAGS=${HOST_XCFLAGS} -DTARGET_ARCH=${TARGET_ARCH} -DDASM_FLAGS=${DASM_FLAGS} -DDASM_ARCH=${DASM_ARCH} ${IOS_FIX})
|
|
|
else ()
|
|
|
# Otherwise, build it internally as per normal
|
|
|
+ set (PRIVATE PRIVATE)
|
|
|
add_subdirectory (src/host)
|
|
|
endif ()
|
|
|
|
|
|
@@ -444,31 +460,69 @@ set (SOURCE_FILES ${LJCORE_C} ${GEN_SRCS})
|
|
|
set (INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/generated)
|
|
|
|
|
|
# Setup target
|
|
|
-if (XCODE AND URHO3D_64BIT)
|
|
|
- set (EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL)
|
|
|
- list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH YES)
|
|
|
+if (XCODE)
|
|
|
+ if (ARCH)
|
|
|
+ list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_ARCHS ${ARCH})
|
|
|
+ elseif (URHO3D_64BIT OR IOS)
|
|
|
+ set (EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL)
|
|
|
+ list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH YES)
|
|
|
+ if (URHO3D_64BIT AND IOS)
|
|
|
+ list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_ARCHS arm64) # The ARCHS_STANDARD builds armv7 first, but we have setup LuaJIT target detection to detect arm64 as the default arch so we override Xcode to build arm64 first
|
|
|
+ endif ()
|
|
|
+ endif ()
|
|
|
endif ()
|
|
|
setup_library (${EXCLUDE_FROM_ALL})
|
|
|
-if (XCODE AND URHO3D_64BIT)
|
|
|
+if (XCODE AND NOT ARCH) # These variables are used to control the recursion as this script is recursive in nature on Xcode
|
|
|
# Add external and custom targets to build Mach-O universal binary LuaJIT sub-library
|
|
|
include (ExternalProject)
|
|
|
- foreach (LUAJIT_OPT LUAJIT_ENABLE_GC64 LUAJIT_DISABLE_FFI LUAJIT_ENABLE_LUA52COMPAT LUAJIT_DISABLE_JIT LUAJIT_NUMMODE LUAJIT_USE_SYSMALLOC LUAJIT_USE_VALGRIND LUAJIT_USE_GDBJIT LUA_USE_APICHECK LUA_USE_ASSERT LUAJIT_NO_STACK_PROTECTION)
|
|
|
+ foreach (LUAJIT_OPT LUAJIT_ENABLE_GC64 LUAJIT_DISABLE_FFI LUAJIT_ENABLE_LUA52COMPAT LUAJIT_DISABLE_JIT LUAJIT_NUMMODE LUAJIT_USE_SYSMALLOC LUAJIT_USE_VALGRIND LUAJIT_USE_GDBJIT LUA_USE_APICHECK LUA_USE_ASSERT LUAJIT_NO_STACK_PROTECTION IOS IPHONEOS_DEPLOYMENT_TARGET URHO3D_LUAJIT_AMALG BAKED_CMAKE_SOURCE_DIR)
|
|
|
if (DEFINED ${LUAJIT_OPT})
|
|
|
list (APPEND LUAJIT_PASSTHRU_OPTS -D${LUAJIT_OPT}=${${LUAJIT_OPT}})
|
|
|
endif ()
|
|
|
endforeach ()
|
|
|
+ # There is a CMake bug where a mere reference to a target using generator-expression would cause it to be added as dependency, we have to use another hack to workaround this bug
|
|
|
if (IOS)
|
|
|
- set (IOS_FIX CMAKE_COMMAND /usr/bin/env -i PATH=$ENV{PATH} ${CMAKE_COMMAND} BUILD_COMMAND bash -c "sed -i '' 's/EFFECTIVE_PLATFORM_NAME//g' CMakeScripts/install_postBuildPhase.make*")
|
|
|
+ set (IOS_FIX CMAKE_COMMAND /usr/bin/env -i PATH=$ENV{PATH} ${CMAKE_COMMAND})
|
|
|
+ ExternalProject_Add (${TARGET_NAME}_i386
|
|
|
+ SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
|
|
|
+ CMAKE_ARGS -DARCH=i386 -DINSTALL_ARCHIVE_DIR=${CMAKE_CURRENT_BINARY_DIR} -DURHO3D_64BIT=0 ${LUAJIT_PASSTHRU_OPTS} ${IOS_FIX} BUILD_COMMAND "" INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config $<CONFIG> -- -sdk iphonesimulator)
|
|
|
+ if (URHO3D_64BIT)
|
|
|
+ ExternalProject_Add (${TARGET_NAME}_x86_64
|
|
|
+ SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
|
|
|
+ CMAKE_ARGS -DARCH=x86_64 -DINSTALL_ARCHIVE_DIR=${CMAKE_CURRENT_BINARY_DIR} ${LUAJIT_PASSTHRU_OPTS} ${IOS_FIX} BUILD_COMMAND "" INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config $<CONFIG> -- -sdk iphonesimulator)
|
|
|
+ add_custom_target (${TARGET_NAME}_universal-iphonesimulator
|
|
|
+ COMMAND if lipo -info ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphonesimulator/lib${TARGET_NAME}.a 2>/dev/null |egrep -cq 'i386.*x86_64|x86_64.*i386'\; then echo Already a Mach-O universal binary library\; else for arch in _x86_64 _i386\; do xcodebuild -target ${TARGET_NAME}$$arch -configuration $(CONFIGURATION)\; done && lipo -create -output ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphonesimulator/lib${TARGET_NAME}.a{,.x86_64,.i386}\; fi
|
|
|
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
|
|
+ ExternalProject_Add (${TARGET_NAME}_armv7
|
|
|
+ SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
|
|
|
+ CMAKE_ARGS -DARCH=armv7 -DINSTALL_ARCHIVE_DIR=${CMAKE_CURRENT_BINARY_DIR} -DURHO3D_64BIT=0 ${LUAJIT_PASSTHRU_OPTS} ${IOS_FIX} BUILD_COMMAND "" INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config $<CONFIG>)
|
|
|
+ add_custom_target (${TARGET_NAME}_universal-iphoneos
|
|
|
+ COMMAND if lipo -info ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphoneos/lib${TARGET_NAME}.a 2>/dev/null |egrep -cq 'armv7.*arm64|arm64.*armv7'\; then echo Already a Mach-O universal binary library\; else for arch in \"\" _armv7\; do xcodebuild -target ${TARGET_NAME}$$arch -configuration $(CONFIGURATION)\; done && mv ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphoneos/lib${TARGET_NAME}.a{,.arm64} && lipo -create -output ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphoneos/lib${TARGET_NAME}.a{.new,.arm64,.armv7} && mv ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphoneos/lib${TARGET_NAME}.a{.new,}\; fi
|
|
|
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
|
|
+ else ()
|
|
|
+ add_custom_target (${TARGET_NAME}_universal-iphonesimulator
|
|
|
+ COMMAND xcodebuild -target ${TARGET_NAME}_i386 -configuration $(CONFIGURATION) && (mv ${CMAKE_BINARY_DIR}/Source/ThirdParty/${TARGET_NAME}/$<CONFIG>-iphonesimulator/lib${TARGET_NAME}.a{.i386,} 2>/dev/null || true)
|
|
|
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
|
|
+ add_custom_target (${TARGET_NAME}_universal-iphoneos
|
|
|
+ COMMAND xcodebuild -target ${TARGET_NAME} -configuration $(CONFIGURATION)
|
|
|
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
|
|
+ endif ()
|
|
|
+ add_custom_target (${TARGET_NAME}_universal ALL
|
|
|
+ DEPENDS ${TARGET_NAME}_universal-iphoneos ${TARGET_NAME}_universal-iphonesimulator
|
|
|
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
|
+ COMMENT "Creating Mach-O universal binary LuaJIT library")
|
|
|
+ elseif (URHO3D_64BIT)
|
|
|
+ ExternalProject_Add (${TARGET_NAME}_i386
|
|
|
+ SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
|
|
|
+ CMAKE_ARGS -DARCH=i386 -DINSTALL_ARCHIVE_DIR=${CMAKE_CURRENT_BINARY_DIR} -DURHO3D_64BIT=0 ${LUAJIT_PASSTHRU_OPTS})
|
|
|
+ add_custom_target (${TARGET_NAME}_universal ALL
|
|
|
+ COMMAND if lipo -info $<TARGET_FILE:${TARGET_NAME}> 2>/dev/null |egrep -cq 'i386.*x86_64|x86_64.*i386'\; then echo $<TARGET_FILE:${TARGET_NAME}> is already a Mach-O universal binary library\; else xcodebuild -target ${TARGET_NAME}_i386 -configuration $(CONFIGURATION) && lipo -create -output $<TARGET_FILE:${TARGET_NAME}>{.new,.i386,} && mv $<TARGET_FILE:${TARGET_NAME}>{.new,}\; fi
|
|
|
+ DEPENDS ${TARGET_NAME} # Although the bug mentioned above would have caused the referenced target to be added as dependency already, we still declare the dependency explicitly here as we really need it (just in case this bug is fixed later)
|
|
|
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
|
+ COMMENT "Creating Mach-O universal binary LuaJIT library")
|
|
|
endif ()
|
|
|
- ExternalProject_Add (${TARGET_NAME}_i386
|
|
|
- SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
|
|
|
- CMAKE_ARGS -DARCH=i386 -DINSTALL_ARCHIVE_DIR=${CMAKE_CURRENT_BINARY_DIR} -DURHO3D_64BIT=0 -DURHO3D_LUAJIT_AMALG=${URHO3D_LUAJIT_AMALG} -DBAKED_CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR} ${LUAJIT_PASSTHRU_OPTS} ${IOS_FIX})
|
|
|
- add_custom_target (${TARGET_NAME}_universal ALL
|
|
|
- COMMAND if lipo -info $<TARGET_FILE:${TARGET_NAME}> 2>/dev/null |grep -cq 'i386.*x86_64'\; then echo $<TARGET_FILE:${TARGET_NAME}> is already a Mach-O universal binary library\; else xcodebuild -target ${TARGET_NAME}_i386 -configuration $(CONFIGURATION) -arch i386 && lipo -create -output $<TARGET_FILE:${TARGET_NAME}>{.new,.i386,} && mv $<TARGET_FILE:${TARGET_NAME}>{.new,}\; fi
|
|
|
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
|
- COMMENT "Creating Mach-O universal binary LuaJIT library")
|
|
|
elseif (INSTALL_ARCHIVE_DIR)
|
|
|
- install (FILES $<TARGET_FILE:${TARGET_NAME}> DESTINATION ${INSTALL_ARCHIVE_DIR}/$<CONFIG> RENAME lib${TARGET_NAME}.a.${ARCH}) # Workaround CMake limitation as it does not support generator-expression for RENAME option
|
|
|
+ install (FILES $<TARGET_FILE:${TARGET_NAME}> DESTINATION ${INSTALL_ARCHIVE_DIR}/$<CONFIG>\${EFFECTIVE_PLATFORM_NAME} RENAME lib${TARGET_NAME}.a.${ARCH}) # This is a hack to workaround CMake (current) limitation
|
|
|
endif ()
|
|
|
|
|
|
# Install headers for building and using the Urho3D library (no direct dependencies but library user may need them)
|