Parcourir la source

Enable LuaJIT universal binary build on iOS platform.

Yao Wei Tjong 姚伟忠 il y a 10 ans
Parent
commit
17734a1b77

+ 6 - 8
CMake/Modules/Urho3D-CMake-common.cmake

@@ -51,6 +51,9 @@ if (IOS)
         set (IOS_SYSROOT ${IOS_SYSROOT} CACHE INTERNAL "Path to iOS system root")
     endif ()
     set (CMAKE_FIND_ROOT_PATH ${IOS_SYSROOT})
+    if (IPHONEOS_DEPLOYMENT_TARGET)
+        set (CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET ${IPHONEOS_DEPLOYMENT_TARGET})
+    endif ()
     # Ensure the CMAKE_OSX_DEPLOYMENT_TARGET is set to empty
     set (CMAKE_OSX_DEPLOYMENT_TARGET)
     unset (CMAKE_OSX_DEPLOYMENT_TARGET CACHE)
@@ -527,7 +530,7 @@ if (APPLE)
         # IOS-specific setup
         add_definitions (-DIOS)
         if (URHO3D_64BIT)
-            set (CMAKE_OSX_ARCHITECTURES $(ARCHS_STANDARD_INCLUDING_64_BIT))
+            set (CMAKE_OSX_ARCHITECTURES $(ARCHS_STANDARD))
         else ()
             set (CMAKE_OSX_ARCHITECTURES $(ARCHS_STANDARD_32_BIT))
         endif ()
@@ -536,7 +539,7 @@ if (APPLE)
         if (XCODE)
             # OSX-specific setup
             if (URHO3D_64BIT)
-                set (CMAKE_OSX_ARCHITECTURES $(ARCHS_STANDARD_32_64_BIT))   # Build Mach-O universal binary containing both x86_64 and i386 archs
+                set (CMAKE_OSX_ARCHITECTURES $(ARCHS_STANDARD_32_64_BIT))
             else ()
                 set (CMAKE_OSX_ARCHITECTURES $(ARCHS_STANDARD_32_BIT))
             endif ()
@@ -982,11 +985,6 @@ macro (setup_target)
         list (APPEND TARGET_PROPERTIES LINK_DEPENDS "${LINK_DEPENDS}")  # Stringify with semicolons already escaped
         unset (LINK_DEPENDS)
     endif ()
-    # CMake does not support IPHONEOS_DEPLOYMENT_TARGET the same manner as it supports CMAKE_OSX_DEPLOYMENT_TARGET
-    # The iOS deployment target is set using the corresponding Xcode attribute as target property instead
-    if (IOS AND IPHONEOS_DEPLOYMENT_TARGET)
-        list (APPEND TARGET_PROPERTIES XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET ${IPHONEOS_DEPLOYMENT_TARGET})
-    endif ()
     # Extra compiler flags for Xcode which are dynamically changed based on active arch in order to support Mach-O universal binary targets
     # When targeting x86 with SSE enabled; or when targeting iOS with NEON enabled as universal binary includes iPhoneSimulator x86 arch too
     if (XCODE AND (URHO3D_SSE OR URHO3D_NEON))
@@ -1144,7 +1142,7 @@ macro (setup_executable)
                 list (APPEND FILES ${LOCATION}/${TARGET_NAME}.${EXT})
             endforeach ()
             install (FILES ${FILES} DESTINATION ${DEST_BUNDLE_DIR} OPTIONAL)    # We get html.map or html.mem depend on the build configuration
-        elseif (DEST_RUNTIME_DIR AND DEST_BUNDLE_DIR)
+        elseif (DEST_RUNTIME_DIR AND (DEST_BUNDLE_DIR OR NOT IOS))
             install (TARGETS ${TARGET_NAME} RUNTIME DESTINATION ${DEST_RUNTIME_DIR} BUNDLE DESTINATION ${DEST_BUNDLE_DIR})
             if (WIN32 AND NOT ARG_NODEPS AND URHO3D_LIB_TYPE STREQUAL SHARED AND NOT URHO3D_DLL_INSTALLED)
                 if (TARGET Urho3D)

+ 1 - 1
CMakeLists.txt

@@ -77,7 +77,7 @@ set (SYSROOT ${ANDROID_TOOLCHAIN_ROOT} ${RPI_SYSROOT} ${MINGW_SYSROOT} ${IOS_SYS
 set (DEST_PKGCONFIG_DIR lib${LIB_SUFFIX}/pkgconfig)
 # Install application launcher scripts
 file (GLOB APP_SCRIPTS ${CMAKE_SOURCE_DIR}/bin/*${SCRIPT_EXT})
-install (PROGRAMS ${APP_SCRIPTS} DESTINATION ${DEST_RUNTIME_DIR})
+install (PROGRAMS ${APP_SCRIPTS} DESTINATION ${DEST_RUNTIME_DIR})   # DEST_RUNTIME_DIR variable is set by the set_output_directories() macro call in the Urho3D-CMake-common module
 # Install resource directories required by applications built with Urho3D library
 install (DIRECTORY ${CMAKE_SOURCE_DIR}/bin/CoreData ${CMAKE_SOURCE_DIR}/bin/Data DESTINATION ${DEST_SHARE_DIR}/Resources)
 # Install CMake modules and toolchains provided by and for Urho3D

+ 73 - 19
Source/ThirdParty/LuaJIT/CMakeLists.txt

@@ -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)

+ 12 - 4
Source/ThirdParty/LuaJIT/src/host/CMakeLists.txt

@@ -22,7 +22,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)
@@ -51,12 +55,16 @@ if (NOT CMAKE_PROJECT_NAME STREQUAL Urho3D)
         string (REPLACE +D -D ${ESCAPED_VAR} "${${ESCAPED_VAR}}")       # Stringify against empty variable
         string (REPLACE , ";" ${ESCAPED_VAR} "${${ESCAPED_VAR}}")
     endforeach ()
-else ()
-    set (PRIVATE PRIVATE)
 endif ()
 
 # Add dependency target
-add_subdirectory (minilua)
+set (TARGET_NAME minilua)
+set (SOURCE_FILES minilua.c)
+if (NOT MSVC)
+    set (LIBS m)
+endif ()
+setup_executable (PRIVATE TOOL NODEPS)
+unset (LIBS)
 
 # Define target name
 set (TARGET_NAME buildvm)

+ 0 - 35
Source/ThirdParty/LuaJIT/src/host/minilua/CMakeLists.txt

@@ -1,35 +0,0 @@
-#
-# Copyright (c) 2008-2015 the Urho3D project.
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-#
-
-# Define target name
-set (TARGET_NAME minilua)
-
-# Define source files
-set (SOURCE_FILES ../minilua.c)
-
-# Define dependency libs
-if (NOT MSVC)
-    set (LIBS m)
-endif ()
-
-# Setup target
-setup_executable (PRIVATE TOOL NODEPS)

+ 12 - 6
Source/Urho3D/CMakeLists.txt

@@ -96,9 +96,18 @@ if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/librevision.h)
     execute_process (COMMAND ${CMAKE_COMMAND} -DFILENAME=${CMAKE_CURRENT_BINARY_DIR}/librevision.h -P CMake/Modules/GetUrho3DRevision.cmake
         WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_QUIET ERROR_QUIET)
 endif ()
+set (URHO3D_DEPS ${STATIC_LIBRARY_TARGETS})
+if (TARGET LuaJIT_universal)
+    list (REMOVE_ITEM URHO3D_DEPS LuaJIT)
+    set (LuaJIT_universal_symbolic LuaJIT_universal_symbolic)
+    add_custom_command (OUTPUT ${LuaJIT_universal_symbolic}
+        COMMAND xcodebuild -target LuaJIT_universal -configuration $(CONFIGURATION)
+        WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
+    set_source_files_properties (${LuaJIT_universal_symbolic} PROPERTIES SYMBOLIC TRUE)
+endif ()
 add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/librevision.h
     COMMAND ${CMAKE_COMMAND} -DFILENAME=${CMAKE_CURRENT_BINARY_DIR}/librevision.h -P CMake/Modules/GetUrho3DRevision.cmake
-    DEPENDS ${STATIC_LIBRARY_TARGETS} ${CMAKE_SOURCE_DIR}/CMake/Modules/GetUrho3DRevision.cmake
+    DEPENDS ${URHO3D_DEPS} ${CMAKE_SOURCE_DIR}/CMake/Modules/GetUrho3DRevision.cmake
     WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
     COMMENT "Generating GIT revision number (tag + last commit SHA-1)")
 
@@ -214,7 +223,7 @@ if (MSVC AND URHO3D_LIB_TYPE STREQUAL SHARED)   # MSVC linker does not have forc
 endif ()
 
 # Aggregate all source files
-list (APPEND SOURCE_FILES ${GEN_CPP_FILES} ${ALL_OBJ_FILES} librevision.h Urho3D.h)
+list (APPEND SOURCE_FILES ${GEN_CPP_FILES} ${ALL_OBJ_FILES} librevision.h Urho3D.h ${LuaJIT_universal_symbolic})
 
 # Define dependency libs
 # Add include directories to find the precompiled header, export header, and installed headers from thirdparty libs
@@ -247,9 +256,6 @@ if (IOS)
     set (EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL)
 endif ()
 setup_library (${URHO3D_LIB_TYPE} ${EXCLUDE_FROM_ALL})
-if (TARGET LuaJIT_universal)
-    add_dependencies (${TARGET_NAME} LuaJIT_universal)
-endif ()
 if (NOT ANDROID AND NOT WEB)
     file (READ .soversion SOVERSION)
     string (STRIP ${SOVERSION} SOVERSION)
@@ -266,7 +272,7 @@ endif ()
 if (IOS)
     # Add a custom target to build Mach-O universal binary consisting of iphoneos (universal ARM archs including 'arm64' if 64-bit is enabled) and iphonesimulator (i386 arch and also x86_64 arch if 64-bit is enabled)
     add_custom_target (${TARGET_NAME}_universal ALL
-        COMMAND if lipo -info $<TARGET_FILE:${TARGET_NAME}> 2>/dev/null |grep -cq 'i386.*armv7'\; then echo $<TARGET_FILE:${TARGET_NAME}> is already a Mach-O universal binary consisting of both iphoneos and iphonesimulator archs\; else mv $<TARGET_FILE:${TARGET_NAME}>{,.ori} && if lipo -info $<TARGET_FILE:${TARGET_NAME}>.ori 2>/dev/null |grep -cq i386\; then sdk=iphoneos\; else sdk=iphonesimulator\; fi && xcodebuild -target ${TARGET_NAME} -configuration $(CONFIGURATION) -sdk $$sdk 2>&1 && mv $<TARGET_FILE:${TARGET_NAME}>{,.new} && lipo -create -output $<TARGET_FILE:${TARGET_NAME}>{,.ori,.new} && rm $<TARGET_FILE:${TARGET_NAME}>{.ori,.new}\; fi
+        COMMAND if lipo -info $<TARGET_FILE:${TARGET_NAME}> 2>/dev/null |egrep -cq 'i386.*armv7|armv7.*i386'\; then echo $<TARGET_FILE:${TARGET_NAME}> is already a Mach-O universal binary consisting of both iphoneos and iphonesimulator archs\; else mv $<TARGET_FILE:${TARGET_NAME}>{,.ori} && if lipo -info $<TARGET_FILE:${TARGET_NAME}>.ori 2>/dev/null |grep -cq i386\; then sdk=iphoneos\; else sdk=iphonesimulator\; fi && xcodebuild -target ${TARGET_NAME} -configuration $(CONFIGURATION) -sdk $$sdk 2>&1 && mv $<TARGET_FILE:${TARGET_NAME}>{,.new} && lipo -create -output $<TARGET_FILE:${TARGET_NAME}>{,.ori,.new} && rm $<TARGET_FILE:${TARGET_NAME}>{.ori,.new}\; fi
         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
         COMMENT "Creating Mach-O universal binary library consisting of both iphoneos and iphonesimulator archs")
     install (FILES $<TARGET_FILE:${TARGET_NAME}> DESTINATION ${DEST_LIBRARY_DIR})