cmake_modules/CMakePascalInformation.cmake
branchwebgl
changeset 9521 8054d9d775fd
parent 9515 9af6176fcd8f
child 9950 2759212a27de
--- a/cmake_modules/CMakePascalInformation.cmake	Fri Oct 11 11:55:31 2013 +0200
+++ b/cmake_modules/CMakePascalInformation.cmake	Fri Oct 11 17:43:13 2013 +0200
@@ -2,13 +2,13 @@
 # It also loads the available platform file for the system-compiler
 # if it exists.
 
+# in case fpc ever becomes included in cmake
 get_filename_component(CMAKE_BASE_NAME ${CMAKE_Pascal_COMPILER} NAME_WE)
 set(CMAKE_SYSTEM_AND_Pascal_COMPILER_INFO_FILE
     ${CMAKE_ROOT}/Modules/Platform/${CMAKE_SYSTEM_NAME}-${CMAKE_BASE_NAME}.cmake)
 include(Platform/${CMAKE_SYSTEM_NAME}-${CMAKE_BASE_NAME} OPTIONAL)
 
 # This section should actually be in Platform/${CMAKE_SYSTME_NAME}-fpc.cmake
-set(CMAKE_Pascal_FLAGS_INIT "-l- -v0ewn")
 set(CMAKE_Pascal_FLAGS_DEBUG_INIT "-g -gl -gp -gh")
 set(CMAKE_Pascal_FLAGS_MINSIZEREL_INIT "-Os -dNDEBUG")
 set(CMAKE_Pascal_FLAGS_RELEASE_INIT "-O3 -dNDEBUG")
@@ -33,31 +33,34 @@
 # so if these are not set just copy the flags from the c version
 
 # No flags supported during linking as a shell script takes care of it
-if(NOT CMAKE_SHARED_LIBRARY_CREATE_Pascal_FLAGS)
-#-dynamiclib -Wl,-headerpad_max_install_names for C
-    set(CMAKE_SHARED_LIBRARY_CREATE_Pascal_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS})
-endif(NOT CMAKE_SHARED_LIBRARY_CREATE_Pascal_FLAGS)
+# however to avoid interferences we escape -Wl flags to the Pascal -k
+#if(NOT CMAKE_SHARED_LIBRARY_CREATE_Pascal_FLAGS)
+#-shared (linux) / -dynamiclib -Wl,-headerpad_max_install_names (darwin)
+#    string(REGEX REPLACE "-Wl," "-k" CMAKE_SHARED_LIBRARY_CREATE_Pascal_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS})
+#endif(NOT CMAKE_SHARED_LIBRARY_CREATE_Pascal_FLAGS)
 
-if(NOT CMAKE_SHARED_LIBRARY_Pascal_FLAGS)
-    #another similarity, fpc: -fPIC  Same as -Cg
-    #(maybe required only for x86_64)
-    set(CMAKE_SHARED_LIBRARY_Pascal_FLAGS ${CMAKE_SHARED_LIBRARY_C_FLAGS})
-endif(NOT CMAKE_SHARED_LIBRARY_Pascal_FLAGS)
+if(NOT CMAKE_SHARED_LIBRARY_Pascal_FLAGS AND CMAKE_SHARED_LIBRARY_C_FLAGS)
+#-fPIC
+    string(REGEX REPLACE "-Wl," "-k" CMAKE_SHARED_LIBRARY_Pascal_FLAGS ${CMAKE_SHARED_LIBRARY_C_FLAGS})
+endif()
 
-if(NOT CMAKE_SHARED_LIBRARY_LINK_Pascal_FLAGS)
-    set(CMAKE_SHARED_LIBRARY_LINK_Pascal_FLAGS ${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS})
-endif(NOT CMAKE_SHARED_LIBRARY_LINK_Pascal_FLAGS)
+if(NOT CMAKE_SHARED_LIBRARY_LINK_Pascal_FLAGS AND CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)
+#-rdynamic (linux) / (empty on darwin)
+    string(REGEX REPLACE "-Wl," "-k" CMAKE_SHARED_LIBRARY_LINK_Pascal_FLAGS ${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS})
+endif()
 
-#if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG)
-#    set(CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG ${CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG})
-#endif(NOT CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG)
+if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG)
+#-Wl,-rpath,
+    set(CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG "-k-rpath")
+endif(NOT CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG)
 
-#if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG_SEP)
-#    set(CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG_SEP ${CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG_SEP})
-#endif(NOT CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG_SEP)
+if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG_SEP)
+    set(CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG_SEP ${CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG_SEP})
+endif(NOT CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG_SEP)
 
 if(NOT CMAKE_SHARED_LIBRARY_RPATH_LINK_Pascal_FLAG)
-    set(CMAKE_SHARED_LIBRARY_RPATH_LINK_Pascal_FLAG ${CMAKE_SHARED_LIBRARY_RPATH_LINK_C_FLAG})
+#-Wl,-rpath-link,
+    set(CMAKE_SHARED_LIBRARY_RPATH_LINK_Pascal_FLAG "-k-rpath-link")
 endif(NOT CMAKE_SHARED_LIBRARY_RPATH_LINK_Pascal_FLAG)
 
 # for most systems a module is the same as a shared library
@@ -69,13 +72,14 @@
 endif(NOT CMAKE_MODULE_EXISTS)
 
 # repeat for modules
-if(NOT CMAKE_SHARED_MODULE_CREATE_Pascal_FLAGS)
-    set(CMAKE_SHARED_MODULE_CREATE_Pascal_FLAGS ${CMAKE_SHARED_MODULE_CREATE_C_FLAGS})
-endif(NOT CMAKE_SHARED_MODULE_CREATE_Pascal_FLAGS)
+if(NOT CMAKE_SHARED_MODULE_CREATE_Pascal_FLAGS AND CMAKE_SHARED_MODULE_CREATE_C_FLAGS)
+# ? (linux) / -bundle -Wl,-headerpad_max_install_names (darwin)
+    string(REGEX REPLACE "-Wl," "-k" CMAKE_SHARED_MODULE_CREATE_Pascal_FLAGS ${CMAKE_SHARED_MODULE_CREATE_C_FLAGS})
+endif()
 
-if(NOT CMAKE_SHARED_MODULE_Pascal_FLAGS)
-    set(CMAKE_SHARED_MODULE_Pascal_FLAGS ${CMAKE_SHARED_MODULE_C_FLAGS})
-endif(NOT CMAKE_SHARED_MODULE_Pascal_FLAGS)
+if(NOT CMAKE_SHARED_MODULE_Pascal_FLAGS AND CMAKE_SHARED_MODULE_C_FLAGS)
+    string(REGEX REPLACE "-Wl," "-k" CMAKE_SHARED_MODULE_Pascal_FLAGS ${CMAKE_SHARED_MODULE_C_FLAGS})
+endif()
 
 if(NOT CMAKE_SHARED_MODULE_RUNTIME_Pascal_FLAG)
     set(CMAKE_SHARED_MODULE_RUNTIME_Pascal_FLAG ${CMAKE_SHARED_MODULE_RUNTIME_C_FLAG})
@@ -85,6 +89,7 @@
     set(CMAKE_SHARED_MODULE_RUNTIME_Pascal_FLAG_SEP ${CMAKE_SHARED_MODULE_RUNTIME_C_FLAG_SEP})
 endif(NOT CMAKE_SHARED_MODULE_RUNTIME_Pascal_FLAG_SEP)
 
+# now other system things
 if(NOT CMAKE_INCLUDE_FLAG_Pascal)
     #amazing, fpc: -I<x>  Add <x> to include path
     set(CMAKE_INCLUDE_FLAG_Pascal ${CMAKE_INCLUDE_FLAG_C})
@@ -94,14 +99,20 @@
     set(CMAKE_INCLUDE_FLAG_SEP_Pascal ${CMAKE_INCLUDE_FLAG_SEP_C})
 endif(NOT CMAKE_INCLUDE_FLAG_SEP_Pascal)
 
+if(NOT CMAKE_Pascal_FRAMEWORK_SEARCH_FLAG)
+    #however -F won't work, -Ff is Pascal equivalent
+    set(CMAKE_Pascal_FRAMEWORK_SEARCH_FLAG "-Ff")
+endif(NOT CMAKE_Pascal_FRAMEWORK_SEARCH_FLAG)
+
 # Copy C version of this flag which is normally determined in platform file.
 if(NOT CMAKE_SHARED_LIBRARY_SONAME_Pascal_FLAG)
+#-soname (linux) / -install-name (dawin)
     set(CMAKE_SHARED_LIBRARY_SONAME_Pascal_FLAG ${CMAKE_SHARED_LIBRARY_SONAME_C_FLAG})
 endif(NOT CMAKE_SHARED_LIBRARY_SONAME_Pascal_FLAG)
 
 set(CMAKE_VERBOSE_MAKEFILE FALSE CACHE BOOL "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make.  This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo.")
 
-set(CMAKE_Pascal_FLAGS "$ENV{FPFLAGS} ${CMAKE_Pascal_FLAGS_INIT} ${CMAKE_Pascal_FLAGS}" CACHE STRING "Flags for Pascal compiler.")
+#set(CMAKE_Pascal_FLAGS "$ENV{FPFLAGS} ${CMAKE_Pascal_FLAGS_INIT} ${CMAKE_Pascal_FLAGS}" CACHE STRING "Flags for Pascal compiler." FORCE)
 
 include(CMakeCommonLanguageInclude)
 
@@ -161,18 +172,27 @@
     if(UNIX)
         #when you have multiple ld installation make sure you get the one bundled with the system C compiler
         include(Platform/${CMAKE_SYSTEM_NAME}-GNU-C.cmake OPTIONAL)
-        if(CMAKE_C_COMPILER)
+        if(CMAKE_COMPILER_IS_GNUCC)
             get_filename_component(CMAKE_C_COMPILER_DIR ${CMAKE_C_COMPILER} PATH)
             set(CMAKE_Pascal_UNIX_FLAGS "-FD${CMAKE_C_COMPILER_DIR}")
-        endif(CMAKE_C_COMPILER)
+        endif(CMAKE_COMPILER_IS_GNUCC)
         if(APPLE)
-            #add user framework directory
-            set(CMAKE_Pascal_UNIX_FLAGS "-Ff~/Library/Frameworks ${CMAKE_Pascal_UNIX_FLAGS}")
+            #TODO: take care of CMAKE_INSTALL_NAME_DIR for shared targets
+        else(APPLE)
+            if(CMAKE_INSTALL_RPATH)
+                #need to escape twice because we use a script to link
+                #\\\\ is just \\ which escapes '\' in the final script
+                #same for $$ which escapes '$' in cmake
+                string(REGEX REPLACE "\\$" "\\\\$$" CMAKE_INSTALL_RPATH_ESCAPED ${CMAKE_INSTALL_RPATH})
+                #normally this flag is found in <LINK_LIBRARIES> but that's not active here
+                set(CMAKE_Pascal_UNIX_FLAGS "${CMAKE_SHARED_LIBRARY_RUNTIME_Pascal_FLAG} -k'${CMAKE_INSTALL_RPATH_ESCAPED}' ${CMAKE_Pascal_UNIX_FLAGS}")
+            endif()
         endif(APPLE)
     endif(UNIX)
 
+    #-Cn is mandatory as it's what creates the ppas.* script
     set(CMAKE_Pascal_COMPILE_OBJECT
-        "<CMAKE_Pascal_COMPILER> -Cn -FE${EXECUTABLE_OUTPUT_PATH} -FU${CMAKE_CURRENT_BINARY_DIR}/<OBJECT_DIR> ${CMAKE_Pascal_UNIX_FLAGS} <FLAGS> <SOURCE>")
+        "<CMAKE_Pascal_COMPILER> -Cn -FE${EXECUTABLE_OUTPUT_PATH} -FU${CMAKE_CURRENT_BINARY_DIR}/<OBJECT_DIR> ${CMAKE_Pascal_UNIX_FLAGS} <FLAGS> <CMAKE_Pascal_LINK_FLAGS> <SOURCE>")
 endif(NOT CMAKE_Pascal_COMPILE_OBJECT)
 
 # link Pascal objects in a single executable