Merge branch 'master' into blender2.8
[blender.git] / build_files / cmake / platform / platform_apple_xcode.cmake
1 # ***** BEGIN GPL LICENSE BLOCK *****
2 #
3 # This program is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License
5 # as published by the Free Software Foundation; either version 2
6 # of the License, or (at your option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software Foundation,
15 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # The Original Code is Copyright (C) 2016, Blender Foundation
18 # All rights reserved.
19 #
20 # Contributor(s): Jacques Beaurain.
21 #
22 # ***** END GPL LICENSE BLOCK *****
23
24 # Xcode and system configuration for Apple.
25
26 # require newer cmake on osx because of version handling,
27 # older cmake cannot handle 2 digit subversion!
28 cmake_minimum_required(VERSION 3.0.0)
29
30 if(NOT CMAKE_OSX_ARCHITECTURES)
31         set(CMAKE_OSX_ARCHITECTURES x86_64 CACHE STRING
32                 "Choose the architecture you want to build Blender for: i386, x86_64 or ppc"
33                 FORCE)
34 endif()
35
36 if(NOT DEFINED OSX_SYSTEM)
37         execute_process(
38                         COMMAND xcodebuild -version -sdk macosx SDKVersion
39                         OUTPUT_VARIABLE OSX_SYSTEM
40                         OUTPUT_STRIP_TRAILING_WHITESPACE)
41 endif()
42
43 # workaround for incorrect cmake xcode lookup for developer previews - XCODE_VERSION does not
44 # take xcode-select path into account but would always look  into /Applications/Xcode.app
45 # while dev versions are named Xcode<version>-DP<preview_number>
46 execute_process(
47                 COMMAND xcode-select --print-path
48                 OUTPUT_VARIABLE XCODE_CHECK OUTPUT_STRIP_TRAILING_WHITESPACE)
49 string(REPLACE "/Contents/Developer" "" XCODE_BUNDLE ${XCODE_CHECK}) # truncate to bundlepath in any case
50
51 if(${CMAKE_GENERATOR} MATCHES "Xcode")
52
53         # earlier xcode has no bundled developer dir, no sense in getting xcode path from
54         if(${XCODE_VERSION} VERSION_GREATER 4.2) 
55                 # reduce to XCode name without dp extension
56                 string(SUBSTRING "${XCODE_CHECK}" 14 6 DP_NAME) 
57                 if(${DP_NAME} MATCHES Xcode5)
58                         set(XCODE_VERSION 5)
59                 endif()
60         endif()
61
62         ##### cmake incompatibility with xcode  4.3 and higher #####
63         if(${XCODE_VERSION} MATCHES '') # cmake fails due looking for xcode in the wrong path, thus will be empty var
64                 message(FATAL_ERROR "Xcode 4.3 and higher must be used with cmake 2.8-8 or higher")
65         endif()
66         ### end cmake incompatibility with xcode 4.3 and higher ###
67         
68         if(${XCODE_VERSION} VERSION_EQUAL 4 OR ${XCODE_VERSION} VERSION_GREATER 4 AND ${XCODE_VERSION} VERSION_LESS 4.3)
69                 # Xcode 4 defaults to the Apple LLVM Compiler.
70                 # Override the default compiler selection because Blender only compiles with gcc up to xcode 4.2
71                 set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "com.apple.compilers.llvmgcc42")
72                 message(STATUS "Setting compiler to: " ${CMAKE_XCODE_ATTRIBUTE_GCC_VERSION})
73         endif()
74 else() # unix makefile generator does not fill XCODE_VERSION var, so we get it with a command
75         execute_process(COMMAND xcodebuild -version OUTPUT_VARIABLE XCODE_VERS_BUILD_NR)
76         string(SUBSTRING "${XCODE_VERS_BUILD_NR}" 6 3 XCODE_VERSION) # truncate away build-nr
77         unset(XCODE_VERS_BUILD_NR)
78 endif()
79
80 message(STATUS "Detected OS X ${OSX_SYSTEM} and Xcode ${XCODE_VERSION} at ${XCODE_BUNDLE}")
81
82 if(${XCODE_VERSION} VERSION_LESS 4.3)
83         # use guaranteed existing sdk
84         set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX${OSX_SYSTEM}.sdk CACHE PATH "" FORCE)
85 else()
86         # note: xcode-select path could be ambigous,
87         # cause /Applications/Xcode.app/Contents/Developer or /Applications/Xcode.app would be allowed
88         # so i use a selfcomposed bundlepath here  
89         set(OSX_SYSROOT_PREFIX ${XCODE_BUNDLE}/Contents/Developer/Platforms/MacOSX.platform)
90         message(STATUS "OSX_SYSROOT_PREFIX: " ${OSX_SYSROOT_PREFIX})
91         set(OSX_DEVELOPER_PREFIX /Developer/SDKs/MacOSX${OSX_SYSTEM}.sdk) # use guaranteed existing sdk
92         set(CMAKE_OSX_SYSROOT ${OSX_SYSROOT_PREFIX}/${OSX_DEVELOPER_PREFIX} CACHE PATH "" FORCE)
93         if(${CMAKE_GENERATOR} MATCHES "Xcode")
94                 # to silence sdk not found warning, just overrides CMAKE_OSX_SYSROOT
95                 set(CMAKE_XCODE_ATTRIBUTE_SDKROOT macosx${OSX_SYSTEM})
96         endif()
97 endif()
98
99 if(OSX_SYSTEM MATCHES 10.9)
100         # make sure syslibs and headers are looked up in sdk ( expecially for 10.9 openGL atm. )
101         set(CMAKE_FIND_ROOT_PATH ${CMAKE_OSX_SYSROOT})
102 endif()
103
104 if(WITH_CXX11)
105         # 10.9 is our min. target, if you use higher sdk, weak linking happens
106         if(CMAKE_OSX_DEPLOYMENT_TARGET)
107                 if(${CMAKE_OSX_DEPLOYMENT_TARGET} VERSION_LESS 10.9)
108                         message(STATUS "Setting deployment target to 10.9, lower versions are incompatible with WITH_CXX11")
109                         set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "" FORCE)
110                 endif()
111         else()
112                 set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "" FORCE)
113         endif()
114 else()
115         if(NOT CMAKE_OSX_DEPLOYMENT_TARGET)
116                 # 10.6 is our min. target, if you use higher sdk, weak linking happens
117                 set(CMAKE_OSX_DEPLOYMENT_TARGET "10.6" CACHE STRING "" FORCE)
118         endif()
119 endif()
120
121 if(NOT ${CMAKE_GENERATOR} MATCHES "Xcode")
122         # force CMAKE_OSX_DEPLOYMENT_TARGET for makefiles, will not work else ( cmake bug ? )
123         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}")
124         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}")
125         add_definitions("-DMACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}")
126 endif()