From e060a449009075b574bd555831f4652acad35451 Mon Sep 17 00:00:00 2001
From: Fons Rademakers <Fons.Rademakers@cern.ch>
Date: Thu, 19 Apr 2012 10:06:46 +0000
Subject: [PATCH] From Pere: - add support for 'clang' compiler, which was not
 the case before. - add support for 'cocoa' - Added rpath link options
 "@loader_path/../lib" for executables and   "@rpath" for libraries for MacOSX
 platform

git-svn-id: http://root.cern.ch/svn/root/trunk@43836 27541ba8-7e3a-0410-8455-c3a389f83636
---
 CMakeLists.txt                            |  2 +-
 cint/cint/CMakeLists.txt                  |  2 ++
 cint/cint/PlatformDependentSettings.cmake |  4 +++
 cmake/modules/CheckCompiler.cmake         |  2 +-
 cmake/modules/RootNewMacros.cmake         | 17 +++++++--
 cmake/modules/SetUpMacOS.cmake            | 44 ++++++++++++++++++++---
 core/CMakeLists.txt                       | 21 +++++++++++
 core/macosx/CMakeLists.txt                | 15 ++++++++
 graf2d/CMakeLists.txt                     |  4 +++
 graf2d/cocoa/CMakeLists.txt               | 15 ++++++++
 graf2d/quartz/CMakeLists.txt              | 12 +++++++
 graf3d/eve/CMakeLists.txt                 |  2 +-
 graf3d/gviz3d/CMakeLists.txt              |  2 +-
 net/net/CMakeLists.txt                    |  2 +-
 14 files changed, 132 insertions(+), 12 deletions(-)
 create mode 100644 core/macosx/CMakeLists.txt
 create mode 100644 graf2d/cocoa/CMakeLists.txt
 create mode 100644 graf2d/quartz/CMakeLists.txt

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3e17bf65045..3d506f31545 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -60,7 +60,7 @@ add_subdirectory (proof)
 add_subdirectory (html)
 add_subdirectory (montecarlo)
 add_subdirectory (geom)
-if(NOT WIN32)
+if(x11)
   add_subdirectory (rootx)
 endif()
 add_subdirectory (misc)
diff --git a/cint/cint/CMakeLists.txt b/cint/cint/CMakeLists.txt
index 452082e3286..1c181003525 100644
--- a/cint/cint/CMakeLists.txt
+++ b/cint/cint/CMakeLists.txt
@@ -58,6 +58,8 @@ set_source_files_properties(loadfile_tmp.cxx  COMPILE_FLAGS "-UR__HAVE_CONFIG -D
 #---Generate and/or copy the iosenum headerfile to the include directory-------------------------------
 if(${CLANG_MAJOR} EQUAL 2)
   set(IOSENUM_H ${PROJECT_SOURCE_DIR}/cint/iosenum/iosenum.${ROOT_ARCHITECTURE}3)
+elseif(${CLANG_MAJOR} EQUAL 3)
+  set(IOSENUM_H ${PROJECT_SOURCE_DIR}/cint/iosenum/iosenum.${ROOT_ARCHITECTURE}3)
 elseif(${GCC_MAJOR} EQUAL 4)
   set(IOSENUM_H ${PROJECT_SOURCE_DIR}/cint/iosenum/iosenum.${ROOT_ARCHITECTURE}3)
 elseif(${GCC_MAJOR} EQUAL 3)
diff --git a/cint/cint/PlatformDependentSettings.cmake b/cint/cint/PlatformDependentSettings.cmake
index 7300fa43634..7628b2f892f 100644
--- a/cint/cint/PlatformDependentSettings.cmake
+++ b/cint/cint/PlatformDependentSettings.cmake
@@ -111,6 +111,10 @@ IF(${CLANG_MAJOR} EQUAL 2)
   LIST(APPEND CINT_CXX_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/dict/gcc4strm.cxx)
 ENDIF(${CLANG_MAJOR} EQUAL 2)
 
+IF(${CLANG_MAJOR} EQUAL 3)
+  LIST(REMOVE_ITEM CINT_CXX_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/dict/libstrm.cxx ${CMAKE_CURRENT_SOURCE_DIR}/src/dict/longif.cxx)
+  LIST(APPEND CINT_CXX_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/dict/gcc4strm.cxx)
+ENDIF()
 
 if (CMAKE_C_COMPILER MATCHES "xlC")
   LIST(REMOVE_ITEM CINT_CXX_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/dict/libstrm.cxx ${CMAKE_CURRENT_SOURCE_DIR}/src/dict/longif.cxx)
diff --git a/cmake/modules/CheckCompiler.cmake b/cmake/modules/CheckCompiler.cmake
index 4335a977e56..777df5911e3 100644
--- a/cmake/modules/CheckCompiler.cmake
+++ b/cmake/modules/CheckCompiler.cmake
@@ -13,7 +13,7 @@ endif()
 
 
 #----Test if clang setup works----------------------------------------------------------------------
-if(CMAKE_C_COMPILER MATCHES clang)
+if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
   exec_program(${CMAKE_C_COMPILER} ARGS "-v" OUTPUT_VARIABLE _clang_version_info)
   string(REGEX REPLACE "^.*[ ]([0-9]+)\\.[0-9].*$" "\\1" CLANG_MAJOR "${_clang_version_info}")
   string(REGEX REPLACE "^.*[ ][0-9]+\\.([0-9]).*$" "\\1" CLANG_MINOR "${_clang_version_info}")
diff --git a/cmake/modules/RootNewMacros.cmake b/cmake/modules/RootNewMacros.cmake
index 22697881b4b..bcd6a8fff02 100644
--- a/cmake/modules/RootNewMacros.cmake
+++ b/cmake/modules/RootNewMacros.cmake
@@ -44,6 +44,12 @@ else()
       IMPORT_PREFIX ${libprefix} )
 endif()
 
+if(APPLE)
+   set(ROOT_LIBRARY_PROPERTIES ${ROOT_LIBRARY_PROPERTIES} 
+       INSTALL_NAME_DIR "@rpath"
+       BUILD_WITH_INSTALL_RPATH ON)
+endif()
+
 #---Modify the behaviour for local and non-local builds--------------------------------------------
 
 if(CMAKE_PROJECT_NAME STREQUAL ROOT)
@@ -103,14 +109,19 @@ function(ROOT_GET_SOURCES variable cwd )
   set(sources)
   foreach( fp ${ARGN})  
     if( IS_ABSOLUTE ${fp}) 
-      file(GLOB files ${fp})     
+      file(GLOB files ${fp})
     else()
       file(GLOB files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${cwd}/${fp})
     endif()
     if(files) 
-      set(sources ${sources} ${files})
+      foreach(s ${files})
+        if(fp MATCHES "[*]" AND s MATCHES "(^|/)G__") # Eliminate G__* files only when using wildcards
+        else()
+          set(sources ${sources} ${s})
+        endif()
+      endforeach()
     else()
-      if(fp MATCHES G__)
+      if(fp MATCHES "(^|/)G__")
         set(sources ${fp} ${sources})
       else()
         set(sources ${sources} ${fp})
diff --git a/cmake/modules/SetUpMacOS.cmake b/cmake/modules/SetUpMacOS.cmake
index ca8795d36b0..190195b57b4 100644
--- a/cmake/modules/SetUpMacOS.cmake
+++ b/cmake/modules/SetUpMacOS.cmake
@@ -73,14 +73,50 @@ if (CMAKE_SYSTEM_NAME MATCHES Darwin)
      #settings for cint
      set(CPPPREP "${CMAKE_CXX_COMPILER} -E -C")  
      set(CXXOUT "-o ")
-     set(EXPLICITLINK "no") #TODO
-
      set(EXEEXT "")
      set(SOEXT "so")
 
-  else (CMAKE_COMPILER_IS_GNUCXX)
+  elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
+  
+     message(STATUS "Found LLVM compiler collection")
+     execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+     SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -W -Wall -Woverloaded-virtual -fsigned-char -fno-common")
+     SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -W -Wall -fsigned-char -fno-common")
+     SET(CMAKE_Fortran_FLAGS "${CMAKE_FORTRAN_FLAGS} -std=legacy")
+     SET(CINT_CXX_DEFINITIONS "-DG__REGEXP -DG__UNIX -DG__SHAREDLIB -DG__ROOT -DG__REDIRECTIO -DG__OSFDLL -DG__STD_EXCEPTION")
+     SET(CINT_C_DEFINITIONS "-DG__REGEXP -DG__UNIX -DG__SHAREDLIB -DG__ROOT -DG__REDIRECTIO -DG__OSFDLL -DG__STD_EXCEPTION")
+  
+     SET(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS} -flat_namespace -single_module -undefined dynamic_lookup")
+     SET(CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS} -flat_namespace -single_module -undefined dynamic_lookup")
+  
+     set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -bind_at_load -m64")
+     set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -bind_at_load -m64")
+
+     # Select flags.
+     set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
+     set(CMAKE_CXX_FLAGS_RELEASE        "-O2")
+     set(CMAKE_CXX_FLAGS_DEBUG          "-g -O2 -fno-reorder-blocks -fno-schedule-insns -fno-inline")
+     set(CMAKE_CXX_FLAGS_DEBUGFULL      "-g3 -fno-inline")
+     set(CMAKE_CXX_FLAGS_PROFILE        "-g3 -fno-inline -ftest-coverage -fprofile-arcs")
+     set(CMAKE_C_FLAGS_RELWITHDEBINFO   "-O2 -g")
+     set(CMAKE_C_FLAGS_RELEASE          "-O2")
+     set(CMAKE_C_FLAGS_DEBUG            "-g -O2 -fno-reorder-blocks -fno-schedule-insns -fno-inline")
+     set(CMAKE_C_FLAGS_DEBUGFULL        "-g3 -fno-inline")
+     set(CMAKE_C_FLAGS_PROFILE          "-g3 -fno-inline -ftest-coverage -fprofile-arcs")
+   
+     #settings for cint
+     set(CPPPREP "${CMAKE_CXX_COMPILER} -E -C")  
+     set(CXXOUT "-o ")
+     set(EXEEXT "")
+     set(SOEXT "so")
+  else()
     MESSAGE(FATAL_ERROR "There is no setup for this compiler up to now. Don't know waht to do. Stop cmake at this point.")
-  endif (CMAKE_COMPILER_IS_GNUCXX)
+  endif()
+  
+  #---Set Linker flags----------------------------------------------------------------------
+  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath,@loader_path/../lib")
+
   
 else (CMAKE_SYSTEM_NAME MATCHES Darwin)
   MESSAGE(FATAL_ERROR "There is no setup for this this Apple system up to now. Don't know waht to do. Stop cmake at this point.")
diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt
index d8fdb00d1b1..82575311253 100644
--- a/core/CMakeLists.txt
+++ b/core/CMakeLists.txt
@@ -9,6 +9,7 @@ ROOT_USE_PACKAGE(core/meta)
 ROOT_USE_PACKAGE(core/textinput)
 ROOT_USE_PACKAGE(core/unix)
 ROOT_USE_PACKAGE(core/winnt)
+ROOT_USE_PACKAGE(core/macosx)
 ROOT_USE_PACKAGE(core/zip)
 ROOT_USE_PACKAGE(core/lzma)
 ROOT_USE_PACKAGE(cint/cint)
@@ -30,6 +31,9 @@ endif()
 if(WIN32)
   add_subdirectory(winnt)
 endif()
+if(cocoa)
+  add_subdirectory(macosx)
+endif()
 add_subdirectory(zip)
 add_subdirectory(lzma)
 add_subdirectory(base)
@@ -44,6 +48,7 @@ set(CORE_DICTIONARIES
     ${META_DICTIONARY} 
     ${UNIX_DICTIONARY} 
     ${WINNT_DICTIONARY} 
+    ${MACOSX_DICTIONARY} 
     ${BASE1_DICTIONARY} 
     ${BASE2_DICTIONARY} 
     ${BASE3_DICTIONARY} 
@@ -61,6 +66,9 @@ endif()
 if(WIN32)
   set_source_files_properties(${WINNT_DICTIONARY} GENERATED)
 endif()
+if(cocoa)
+  set_source_files_properties(${MACOSX_DICTIONARY} GENERATED)
+endif()
 set_source_files_properties(${BASE1_DICTIONARY} GENERATED)
 set_source_files_properties(${BASE2_DICTIONARY} GENERATED)
 set_source_files_properties(${BASE3_DICTIONARY} GENERATED)
@@ -107,8 +115,18 @@ include_directories( ${INCLUDE_DIRECTORIES})
 
 if(WIN32)
    set(corelinklibs shell32.lib WSock32.lib Oleaut32.lib Iphlpapi.lib)
+elseif(cocoa)
+   set(corelinklibs "-framework Cocoa")
 endif()
 
+#---Add flags to compile ObjC++
+foreach(src ${LibCore_SRCS})
+  if(${src} MATCHES "\\.mm$")
+    set_source_files_properties(${src} COMPILE_FLAGS "-ObjC++ -std=c++11")
+  endif()
+endforeach()
+
+
 ROOT_LINKER_LIBRARY(Core ${LibCore_SRCS} ${CORE_DICTIONARIES} 
                     LIBRARIES ${PCRE_LIBRARIES} ${LZMA_LIBRARIES} ${ZLIB_LIBRARY} ${CMAKE_DL_LIBS} ${CMAKE_THREAD_LIBS_INIT} ${corelinklibs}
                     DEPENDENCIES Cint)
@@ -119,6 +137,9 @@ endif()
 if(WIN32)
   add_dependencies(Core WINNT_DICTIONARY)
 endif()
+if(cocoa)
+  add_dependencies(Core MACOSX_DICTIONARY)
+endif()
 add_dependencies(Core TEXTINPUT_DICTIONARY)
 if(builtin_pcre)
   add_dependencies(Core PCRE)
diff --git a/core/macosx/CMakeLists.txt b/core/macosx/CMakeLists.txt
new file mode 100644
index 00000000000..a03e315eef9
--- /dev/null
+++ b/core/macosx/CMakeLists.txt
@@ -0,0 +1,15 @@
+############################################################################
+# CMakeLists.txt file for building ROOT core/macosx package
+############################################################################
+
+ROOT_GLOB_SOURCES(sources ${CMAKE_CURRENT_SOURCE_DIR}/src/*.mm)
+
+ROOT_GENERATE_DICTIONARY(G__Macosx T*.h LINKDEF LinkDef.h)
+set(MACOSX_DICTIONARY ${CMAKE_CURRENT_BINARY_DIR}/G__Macosx.cxx  PARENT_SCOPE)
+
+set(LibCore_SRCS ${LibCore_SRCS} ${sources} PARENT_SCOPE)
+set(LibCore_LINKDEF ${LibCore_LINKDEF} ${CMAKE_CURRENT_SOURCE_DIR}/inc/LinkDef.h PARENT_SCOPE)
+add_custom_target(MACOSX_DICTIONARY DEPENDS G__Macosx.cxx)
+set_target_properties(MACOSX_DICTIONARY PROPERTIES FOLDER Dictionaries)
+
+ROOT_INSTALL_HEADERS()
diff --git a/graf2d/CMakeLists.txt b/graf2d/CMakeLists.txt
index 1a6cf03d5c2..1074ec24153 100644
--- a/graf2d/CMakeLists.txt
+++ b/graf2d/CMakeLists.txt
@@ -23,5 +23,9 @@ endif()
 if(fitsio)
   add_subdirectory(fitsio)
 endif()
+if(cocoa)
+  add_subdirectory(quartz)
+  add_subdirectory(cocoa)
+endif()
 
 
diff --git a/graf2d/cocoa/CMakeLists.txt b/graf2d/cocoa/CMakeLists.txt
new file mode 100644
index 00000000000..556051cb836
--- /dev/null
+++ b/graf2d/cocoa/CMakeLists.txt
@@ -0,0 +1,15 @@
+############################################################################
+# CMakeLists.txt file for building ROOT graf2d/cocoa package
+# @author Pere Mato, CERN
+############################################################################
+
+ROOT_USE_PACKAGE(graf2d/quartz)
+ROOT_USE_PACKAGE(gui/gui)
+
+add_definitions("-ObjC++ -std=c++11")
+
+ROOT_GENERATE_DICTIONARY(G__Cocoa T*.h LINKDEF LinkDef.h)
+ROOT_GENERATE_ROOTMAP(GCocoa LINKDEF LinkDef.h DEPENDENCIES Gui GQuartz )
+ROOT_LINKER_LIBRARY(GCocoa *.mm  G__Cocoa.cxx LIBRARIES  "-framework Cocoa" DEPENDENCIES Gui GQuartz )
+ROOT_INSTALL_HEADERS()
+
diff --git a/graf2d/quartz/CMakeLists.txt b/graf2d/quartz/CMakeLists.txt
new file mode 100644
index 00000000000..32851e99349
--- /dev/null
+++ b/graf2d/quartz/CMakeLists.txt
@@ -0,0 +1,12 @@
+############################################################################
+# CMakeLists.txt file for building ROOT graf2d/quartz package
+# @author Pere Mato, CERN
+############################################################################
+
+add_definitions("-ObjC++ -std=c++11")
+
+ROOT_GENERATE_DICTIONARY(G__Quartz "" LINKDEF LinkDef.h)
+ROOT_GENERATE_ROOTMAP(GQuartz LINKDEF LinkDef.h DEPENDENCIES )
+ROOT_LINKER_LIBRARY(GQuartz *.mm  G__Quartz.cxx LIBRARIES  "-framework Cocoa" DEPENDENCIES )
+ROOT_INSTALL_HEADERS()
+
diff --git a/graf3d/eve/CMakeLists.txt b/graf3d/eve/CMakeLists.txt
index 93240208cc4..72ee0852833 100644
--- a/graf3d/eve/CMakeLists.txt
+++ b/graf3d/eve/CMakeLists.txt
@@ -30,6 +30,6 @@ ROOT_GENERATE_DICTIONARY(G__Eve1 ${headers1} LINKDEF src/SolarisCCDictHack.h Lin
 ROOT_GENERATE_DICTIONARY(G__Eve2 ${headers2} LINKDEF src/SolarisCCDictHack.h LinkDef2.h)
 
 ROOT_GENERATE_ROOTMAP(Eve LINKDEF LinkDef1.h LinkDef2.h DEPENDENCIES Geom GeomPainter Graf3d Gui Gpad Graf Hist Physics Ged EG Tree TreePlayer RGL RIO Rint MathCore)
-ROOT_LINKER_LIBRARY(Eve *.cxx G__Eve1.cxx G__Eve2.cxx LIBRARIES ${OPENGL_LIBRARIES} GLEW Cint Core DEPENDENCIES Geom Ged RGL Physics EG)
+ROOT_LINKER_LIBRARY(Eve *.cxx G__Eve1.cxx G__Eve2.cxx LIBRARIES ${OPENGL_LIBRARIES} GLEW FTGL Cint Core DEPENDENCIES Geom Ged RGL Physics EG)
 
 ROOT_INSTALL_HEADERS()
\ No newline at end of file
diff --git a/graf3d/gviz3d/CMakeLists.txt b/graf3d/gviz3d/CMakeLists.txt
index 3172c986263..bc3feeb6fa8 100644
--- a/graf3d/gviz3d/CMakeLists.txt
+++ b/graf3d/gviz3d/CMakeLists.txt
@@ -9,5 +9,5 @@ ROOT_USE_PACKAGE(geom/geom)
 
 ROOT_GENERATE_DICTIONARY(G__Gviz3d *.h LINKDEF LinkDef.h)
 ROOT_GENERATE_ROOTMAP(Gviz3d LINKDEF LinkDef.h DEPENDENCIES Gui Ged Gpad Graf3d Graf Geom RGL)
-ROOT_LINKER_LIBRARY(Gviz3d *.cxx G__Gviz3d.cxx LIBRARIES DEPENDENCIES Gui Ged Geom RGL)
+ROOT_LINKER_LIBRARY(Gviz3d *.cxx G__Gviz3d.cxx LIBRARIES GLEW FTGL DEPENDENCIES Gui Ged Geom RGL)
 ROOT_INSTALL_HEADERS()
diff --git a/net/net/CMakeLists.txt b/net/net/CMakeLists.txt
index 3e885ec7669..37a863f6555 100644
--- a/net/net/CMakeLists.txt
+++ b/net/net/CMakeLists.txt
@@ -18,7 +18,7 @@ else()
   add_definitions(-DR__SSL)
 endif()
 
-if(NOT crypto)
+if(NOT ssl AND NOT CRYPTLIBS)
   list(REMOVE_ITEM headers TAS3File.h)
   list(REMOVE_ITEM headers TGSFile.h)
   list(REMOVE_ITEM headers THTTPMessage.h)
-- 
GitLab