Browse Source

Upgrade CMake build system to build universal Mac libraries and correctly compile Mac Samples.

Lloyd Weehuizen 15 years ago
parent
commit
a856c0c56b
4 changed files with 303 additions and 45 deletions
  1. 92 45
      Build/CMakeLists.txt
  2. 36 0
      Build/cmake/FindCarbon.cmake
  3. 147 0
      Build/cmake/FindPkgMacros.cmake
  4. 28 0
      Build/cmake/SampleFileList.cmake

+ 92 - 45
Build/CMakeLists.txt

@@ -2,13 +2,18 @@
 # Build script for libRocket =======
 #===================================
 
+if(APPLE)
+# We use the new OSX_ARCHITECTURES property
+cmake_minimum_required(VERSION 2.8.1)
+else()
 cmake_minimum_required(VERSION 2.6)
+endif()
 
 project(libRocket C CXX)
 
 set(LIBROCKET_VERSION_MAJOR 1)
 set(LIBROCKET_VERSION_MINOR 2)
-set(LIBROCKET_VERSION_PATCH 0)
+set(LIBROCKET_VERSION_PATCH 1)
 set(PROJECT_VERSION ${LIBROCKET_VERSION_MAJOR}.${LIBROCKET_VERSION_MINOR}.${LIBROCKET_VERSION_PATCH})
 
 # Search in the 'cmake' directory for additional CMake modules.
@@ -29,7 +34,7 @@ include(TestForSTDNamespace)
 #===================================
 
 if(NOT CMAKE_BUILD_TYPE)
-    set(CMAKE_BUILD_TYPE Debug CACHE STRING
+    set(CMAKE_BUILD_TYPE Release CACHE STRING
         "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
         FORCE)
 endif()
@@ -42,21 +47,28 @@ if(NOT BUILD_SHARED_LIBS)
     add_definitions(-DSTATIC_LIB)
 endif()
 
-if(CMAKE_COMPILER_IS_GNUCXX AND NOT APPLE)
-    add_definitions(-Wno-conversion-null)
-endif()
-
 #===================================
 # Find dependencies ================
 #===================================
 
-find_package(Freetype REQUIRED)
+# FreeType
+if(WIN32)
+	set(FREETYPE_INCLUDE_DIRS ../../support/freetype/include)
+	set(FREETYPE_LIBRARY freetype243MT.lib)
+	set(FREETYPE_LINK_DIRS ../../support/lib)
+	set(FREETYPE_FOUND TRUE)
+else()
+	find_package(Freetype REQUIRED)	
+endif()
 
 if(FREETYPE_FOUND)
-    include_directories(${FREETYPE_INCLUDE_DIRS})
-    list(APPEND CORE_LINK_LIBS ${FREETYPE_LIBRARY})
+		include_directories(${FREETYPE_INCLUDE_DIRS})
+		link_directories(${FREETYPE_LINK_DIRS})
+		list(APPEND CORE_LINK_LIBS ${FREETYPE_LIBRARY})
 endif()
+mark_as_advanced(FREETYPE_INCLUDE_DIRS FREETYPE_LIBRARY FREETYPE_LINK_DIRECTORIES)
 
+# Boost and Python
 if(BUILD_PYTHON_BINDINGS)
     find_package(PythonInterp REQUIRED)
     find_package(PythonLibs REQUIRED)
@@ -93,7 +105,6 @@ include_directories(
 # Include list of source files
 include(FileList)
 
-
 #===================================
 # Build libraries ==================
 #===================================
@@ -112,6 +123,12 @@ foreach(library ${LIBRARIES})
                            VERSION ${PROJECT_VERSION}
                            SOVERSION ${LIBROCKET_VERSION_MAJOR}
     )
+    
+    if(APPLE)
+    	set_target_properties(${NAME} PROPERTIES
+    					OSX_ARCHITECTURES "i386;x86_64;"
+    	)
+    endif()
 
     install(TARGETS ${NAME}
             LIBRARY DESTINATION lib
@@ -120,7 +137,6 @@ foreach(library ${LIBRARIES})
 endforeach(library)
 
 # Build python bindings
-
 if(BUILD_PYTHON_BINDINGS)
     set(LIBRARIES core controls)
 
@@ -164,58 +180,89 @@ macro(bl_sample NAME)
     add_executable(${NAME} ${${NAME}_SRC_FILES}
                            ${${NAME}_HDR_FILES}
     )
+    
+    if (APPLE)
+    	# We only support i386 for the samples as it still uses Carbon
+    	set_target_properties(${NAME} PROPERTIES
+    						OSX_ARCHITECTURES "i386;"
+    	)
+    endif()
 
     target_link_libraries(${NAME} shell)
 endmacro()
 
 if(BUILD_SAMPLES)
     include(SampleFileList)
+    include(FindCarbon)
+    
+    set(sample_LIBRARIES
+    	shell 
+    	RocketCore 
+    	RocketControls
+    	RocketDebugger
+	)
+
+	# Find OpenGL 
+	if(WIN32)
+	
+	else()
+    	find_package(OpenGL REQUIRED)
+    	   
+    	if(OPENGL_FOUND)
+        	include_directories(${OPENGL_INCLUDE_DIR})
+        	list(APPEND sample_LIBRARIES
+        		${OPENGL_LIBRARIES}
+        	)
+    	endif()
 
-    find_package(OpenGL REQUIRED)
-
-    if(OPENGL_FOUND)
-        include_directories(${OPENGL_INCLUDE_DIR})
     endif()
-
-    set(SAMPLES_DIR opt/Rocket/Samples)
-
-    # The samples use the shell library
-    include_directories(${PROJECT_SOURCE_DIR}/Samples/shell/include)
-
-    # Deal with platform specific sources for sample shell
+    
+    # Find X11/Cocoa
     if(WIN32)
-        list(APPEND samples basic_directx)
-        list(APPEND shell_SRC_FILES
-            ${PROJECT_SOURCE_DIR}/Samples/shell/src/win32/ShellWin32.cpp
-            ${PROJECT_SOURCE_DIR}/Samples/shell/src/win32/InputWin32.cpp
-        )
-        list(APPEND shell_HDR_FILES
-            ${PROJECT_SOURCE_DIR}/Samples/shell/include/win32/InputWin32.h
-        )
     elseif(APPLE)
-        list(APPEND shell_SRC_FILES
-            ${PROJECT_SOURCE_DIR}/Samples/shell/src/macosx/ShellMacOSX.cpp
-            ${PROJECT_SOURCE_DIR}/Samples/shell/src/macosx/InputMacOSX.cpp
-        )
-        list(APPEND shell_HDR_FILES
-            ${PROJECT_SOURCE_DIR}/Samples/shell/include/macosx/InputMacOSX.h
-        )
+    	find_package(Carbon REQUIRED)
+    	
+    	if (Carbon_FOUND)
+    		include_directories(${Carbon_INCLUDE_DIR})
+        	list(APPEND sample_LIBRARIES
+        		${Carbon_LIBRARIES}
+        	)
+    	endif()
+    	
+    	find_package(Cocoa REQUIRED)
+    	
+    	if (Cocoa_FOUND)
+    		include_directories(${Cocoa_INCLUDE_DIR})
+        	list(APPEND sample_LIBRARIES
+        		${Cocoa_LIBRARIES}
+        	)
+    	endif()
     else()
-        list(APPEND shell_SRC_FILES
-            ${PROJECT_SOURCE_DIR}/Samples/shell/src/x11/ShellX11.cpp
-            ${PROJECT_SOURCE_DIR}/Samples/shell/src/x11/InputX11.cpp
-        )
-        list(APPEND shell_HDR_FILES
-            ${PROJECT_SOURCE_DIR}/Samples/shell/include/x11/InputX11.h
-        )
+    	find_package(X11 REQUIRED)
+        if (X11_FOUND)
+        	list(APPEND sample_LIBRARIES
+        		${X11_LIBRARIES}
+        		)
+        endif()
     endif()
+   
+    set(SAMPLES_DIR opt/Rocket/Samples)
+
+    # The samples use the shell library
+    include_directories(${PROJECT_SOURCE_DIR}/Samples/shell/include)
 
     # Build and install sample shell library
     add_library(shell ${shell_SRC_FILES}
                       ${shell_HDR_FILES}
     )
+    if (APPLE)
+    	# We only support i386 for the samples as it still uses Carbon
+    	set_target_properties(shell PROPERTIES
+    						OSX_ARCHITECTURES "i386;"
+    	)
+    endif()
 
-    target_link_libraries(shell RocketCore RocketControls RocketDebugger ${OPENGL_LIBRARIES})
+    target_link_libraries(${sample_LIBRARIES})
 
     install(TARGETS shell
             LIBRARY DESTINATION lib

+ 36 - 0
Build/cmake/FindCarbon.cmake

@@ -0,0 +1,36 @@
+# - Try to find Carbon
+# Once done, this will define
+#
+#  Carbon_FOUND - system has Carbon
+#  Carbon_INCLUDE_DIRS - the Carbon include directories 
+#  Carbon_LIBRARIES - link these to use Carbon
+
+include(FindPkgMacros)
+findpkg_begin(Carbon)
+
+# construct search paths
+set(Carbon_PREFIX_PATH ${Carbon_HOME} $ENV{Carbon_HOME}
+  ${OGRE_HOME} $ENV{OGRE_HOME})
+create_search_paths(Carbon)
+# redo search if prefix path changed
+clear_if_changed(Carbon_PREFIX_PATH
+  Carbon_LIBRARY_FWK
+  Carbon_LIBRARY_REL
+  Carbon_LIBRARY_DBG
+  Carbon_INCLUDE_DIR
+)
+
+set(Carbon_LIBRARY_NAMES Carbon)
+get_debug_names(Carbon_LIBRARY_NAMES)
+
+use_pkgconfig(Carbon_PKGC Carbon)
+
+findpkg_framework(Carbon)
+
+find_path(Carbon_INCLUDE_DIR NAMES Carbon.h HINTS ${Carbon_INC_SEARCH_PATH} ${Carbon_PKGC_INCLUDE_DIRS} PATH_SUFFIXES Carbon)
+find_library(Carbon_LIBRARY_REL NAMES ${Carbon_LIBRARY_NAMES} HINTS ${Carbon_LIB_SEARCH_PATH} ${Carbon_PKGC_LIBRARY_DIRS})
+find_library(Carbon_LIBRARY_DBG NAMES ${Carbon_LIBRARY_NAMES_DBG} HINTS ${Carbon_LIB_SEARCH_PATH} ${Carbon_PKGC_LIBRARY_DIRS})
+make_library_set(Carbon_LIBRARY)
+
+findpkg_finish(Carbon)
+add_parent_dir(Carbon_INCLUDE_DIRS Carbon_INCLUDE_DIR)

+ 147 - 0
Build/cmake/FindPkgMacros.cmake

@@ -0,0 +1,147 @@
+##################################################################
+# Provides some common functionality for the FindPackage modules
+##################################################################
+
+# Begin processing of package
+macro(findpkg_begin PREFIX)
+  if (NOT ${PREFIX}_FIND_QUIETLY)
+    message(STATUS "Looking for ${PREFIX}...")
+  endif ()
+endmacro(findpkg_begin)
+
+# Display a status message unless FIND_QUIETLY is set
+macro(pkg_message PREFIX)
+  if (NOT ${PREFIX}_FIND_QUIETLY)
+    message(STATUS ${ARGN})
+  endif ()
+endmacro(pkg_message)
+
+# Get environment variable, define it as ENV_$var and make sure backslashes are converted to forward slashes
+macro(getenv_path VAR)
+   set(ENV_${VAR} $ENV{${VAR}})
+   # replace won't work if var is blank
+   if (ENV_${VAR})
+     string( REGEX REPLACE "\\\\" "/" ENV_${VAR} ${ENV_${VAR}} )
+   endif ()
+endmacro(getenv_path)
+
+# Construct search paths for includes and libraries from a PREFIX_PATH
+macro(create_search_paths PREFIX)
+  foreach(dir ${${PREFIX}_PREFIX_PATH})
+    set(${PREFIX}_INC_SEARCH_PATH ${${PREFIX}_INC_SEARCH_PATH}
+      ${dir}/include ${dir}/Include ${dir}/include/${PREFIX} ${dir}/Headers)
+    set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH}
+      ${dir}/lib ${dir}/Lib ${dir}/lib/${PREFIX} ${dir}/Libs)
+    set(${PREFIX}_BIN_SEARCH_PATH ${${PREFIX}_BIN_SEARCH_PATH}
+      ${dir}/bin)
+  endforeach(dir)
+  set(${PREFIX}_FRAMEWORK_SEARCH_PATH ${${PREFIX}_PREFIX_PATH})
+endmacro(create_search_paths)
+
+# clear cache variables if a certain variable changed
+macro(clear_if_changed TESTVAR)
+  # test against internal check variable
+  # HACK: Apparently, adding a variable to the cache cleans up the list
+  # a bit. We need to also remove any empty strings from the list, but
+  # at the same time ensure that we are actually dealing with a list.
+  list(APPEND ${TESTVAR} "")
+  list(REMOVE_ITEM ${TESTVAR} "")
+  if (NOT "${${TESTVAR}}" STREQUAL "${${TESTVAR}_INT_CHECK}")
+    message(STATUS "${TESTVAR} changed.")
+    foreach(var ${ARGN})
+      set(${var} "NOTFOUND" CACHE STRING "x" FORCE)
+    endforeach(var)
+  endif ()
+  set(${TESTVAR}_INT_CHECK ${${TESTVAR}} CACHE INTERNAL "x" FORCE)
+endmacro(clear_if_changed)
+
+# Try to get some hints from pkg-config, if available
+macro(use_pkgconfig PREFIX PKGNAME)
+  find_package(PkgConfig)
+  if (PKG_CONFIG_FOUND)
+    pkg_check_modules(${PREFIX} ${PKGNAME})
+  endif ()
+endmacro (use_pkgconfig)
+
+# Couple a set of release AND debug libraries (or frameworks)
+macro(make_library_set PREFIX)
+  if (${PREFIX}_FWK)
+    set(${PREFIX} ${${PREFIX}_FWK})
+  elseif (${PREFIX}_REL AND ${PREFIX}_DBG)
+    set(${PREFIX} optimized ${${PREFIX}_REL} debug ${${PREFIX}_DBG})
+  elseif (${PREFIX}_REL)
+    set(${PREFIX} ${${PREFIX}_REL})
+  elseif (${PREFIX}_DBG)
+    set(${PREFIX} ${${PREFIX}_DBG})
+  endif ()
+endmacro(make_library_set)
+
+# Generate debug names from given release names
+macro(get_debug_names PREFIX)
+  foreach(i ${${PREFIX}})
+    set(${PREFIX}_DBG ${${PREFIX}_DBG} ${i}d ${i}D ${i}_d ${i}_D ${i}_debug ${i})
+  endforeach(i)
+endmacro(get_debug_names)
+
+# Add the parent dir from DIR to VAR 
+macro(add_parent_dir VAR DIR)
+  get_filename_component(${DIR}_TEMP "${${DIR}}/.." ABSOLUTE)
+  set(${VAR} ${${VAR}} ${${DIR}_TEMP})
+endmacro(add_parent_dir)
+
+# Do the final processing for the package find.
+macro(findpkg_finish PREFIX)
+  # skip if already processed during this run
+  if (NOT ${PREFIX}_FOUND)
+    if (${PREFIX}_INCLUDE_DIR AND ${PREFIX}_LIBRARY)
+      set(${PREFIX}_FOUND TRUE)
+      set(${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIR})
+      set(${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARY})
+      if (NOT ${PREFIX}_FIND_QUIETLY)
+        message(STATUS "Found ${PREFIX}: ${${PREFIX}_LIBRARIES}")
+      endif ()
+    else ()
+      if (NOT ${PREFIX}_FIND_QUIETLY)
+        message(STATUS "Could not locate ${PREFIX}")
+      endif ()
+      if (${PREFIX}_FIND_REQUIRED)
+        message(FATAL_ERROR "Required library ${PREFIX} not found! Install the library (including dev packages) and try again. If the library is already installed, set the missing variables manually in cmake.")
+      endif ()
+    endif ()
+
+    mark_as_advanced(${PREFIX}_INCLUDE_DIR ${PREFIX}_LIBRARY ${PREFIX}_LIBRARY_REL ${PREFIX}_LIBRARY_DBG ${PREFIX}_LIBRARY_FWK)
+  endif ()
+endmacro(findpkg_finish)
+
+
+# Slightly customised framework finder
+MACRO(findpkg_framework fwk)
+  IF(APPLE)
+    SET(${fwk}_FRAMEWORK_PATH
+      ${${fwk}_FRAMEWORK_SEARCH_PATH}
+      ${CMAKE_FRAMEWORK_PATH}
+      ~/Library/Frameworks
+      /Library/Frameworks
+      /System/Library/Frameworks
+      /Network/Library/Frameworks
+      /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/System/Library/Frameworks/
+      ${CMAKE_CURRENT_SOURCE_DIR}/lib/Release
+      ${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug
+      ${OGRE_PREFIX_PATH}/lib/Release
+      ${OGRE_PREFIX_PATH}/lib/Debug
+      ${OGRE_PREFIX_BUILD}/lib/Release
+      ${OGRE_PREFIX_BUILD}/lib/Debug
+    )
+    FOREACH(dir ${${fwk}_FRAMEWORK_PATH})
+      SET(fwkpath ${dir}/${fwk}.framework)
+      IF(EXISTS ${fwkpath})
+        SET(${fwk}_FRAMEWORK_INCLUDES ${${fwk}_FRAMEWORK_INCLUDES}
+          ${fwkpath}/Headers ${fwkpath}/PrivateHeaders)
+        SET(${fwk}_FRAMEWORK_PATH ${dir})
+        if (NOT ${fwk}_LIBRARY_FWK)
+          SET(${fwk}_LIBRARY_FWK "-framework ${fwk}")
+        endif ()
+      ENDIF(EXISTS ${fwkpath})
+    ENDFOREACH(dir)
+  ENDIF(APPLE)
+ENDMACRO(findpkg_framework)

+ 28 - 0
Build/cmake/SampleFileList.cmake

@@ -165,3 +165,31 @@ set(shell_SRC_FILES
     ${PROJECT_SOURCE_DIR}/Samples/shell/src/Shell.cpp
 )
 
+# Deal with platform specific sources for sample shell
+if(WIN32)
+	list(APPEND samples basic_directx)
+	list(APPEND shell_SRC_FILES
+		${PROJECT_SOURCE_DIR}/Samples/shell/src/win32/ShellWin32.cpp
+		${PROJECT_SOURCE_DIR}/Samples/shell/src/win32/InputWin32.cpp
+	)
+	list(APPEND shell_HDR_FILES
+		${PROJECT_SOURCE_DIR}/Samples/shell/include/win32/InputWin32.h
+	)
+elseif(APPLE)
+	list(APPEND shell_SRC_FILES
+		${PROJECT_SOURCE_DIR}/Samples/shell/src/macosx/ShellMacOSX.cpp
+		${PROJECT_SOURCE_DIR}/Samples/shell/src/macosx/InputMacOSX.cpp
+	)
+	list(APPEND shell_HDR_FILES
+		${PROJECT_SOURCE_DIR}/Samples/shell/include/macosx/InputMacOSX.h
+	)
+else()
+	list(APPEND shell_SRC_FILES
+		${PROJECT_SOURCE_DIR}/Samples/shell/src/x11/ShellX11.cpp
+		${PROJECT_SOURCE_DIR}/Samples/shell/src/x11/InputX11.cpp
+	)
+	list(APPEND shell_HDR_FILES
+		${PROJECT_SOURCE_DIR}/Samples/shell/include/x11/InputX11.h
+	)
+endif()
+