Try to inline singleton pattern functions
[hiphop-php.git] / CMake / HPHPFunctions.cmake
blobf6c167af46811a8c42c3ab83805e44d24b009b37
1 function(auto_sources RETURN_VALUE PATTERN SOURCE_SUBDIRS)
3   if ("${SOURCE_SUBDIRS}" STREQUAL "RECURSE")
4     SET(PATH ".")
5     if (${ARGC} EQUAL 4)
6       list(GET ARGV 3 PATH)
7     endif ()
8   endif()
10   if ("${SOURCE_SUBDIRS}" STREQUAL "RECURSE")
11     unset(${RETURN_VALUE})
12     file(GLOB SUBDIR_FILES "${PATH}/${PATTERN}")
13     list(APPEND ${RETURN_VALUE} ${SUBDIR_FILES})
15     file(GLOB subdirs RELATIVE ${PATH} ${PATH}/*)
17     foreach(DIR ${subdirs})
18       if (IS_DIRECTORY ${PATH}/${DIR})
19         if (NOT "${DIR}" STREQUAL "CMakeFiles")
20           file(GLOB_RECURSE SUBDIR_FILES "${PATH}/${DIR}/${PATTERN}")
21           list(APPEND ${RETURN_VALUE} ${SUBDIR_FILES})
22         endif()
23       endif()
24     endforeach()
25   else ()
26     file(GLOB ${RETURN_VALUE} "${PATTERN}")
28     foreach (PATH ${SOURCE_SUBDIRS})
29       file(GLOB SUBDIR_FILES "${PATH}/${PATTERN}")
30       list(APPEND ${RETURN_VALUE} ${SUBDIR_FILES})
31     endforeach(PATH ${SOURCE_SUBDIRS})
32   endif ()
34   if (${FILTER_OUT})
35     list(REMOVE_ITEM ${RETURN_VALUE} ${FILTER_OUT})
36   endif()
38   set(${RETURN_VALUE} ${${RETURN_VALUE}} PARENT_SCOPE)
39 endfunction(auto_sources)
41 macro(HHVM_SELECT_SOURCES DIR)
42   auto_sources(files "*.cpp" "RECURSE" "${DIR}")
43   foreach(f ${files})
44     if (NOT (${f} MATCHES "(ext_hhvm|/(old-)?tests?/)"))
45       list(APPEND CXX_SOURCES ${f})
46     endif()
47   endforeach()
48   auto_sources(files "*.c" "RECURSE" "${DIR}")
49   foreach(f ${files})
50     if (NOT (${f} MATCHES "(ext_hhvm|/(old-)?tests?/)"))
51       list(APPEND C_SOURCES ${f})
52     endif()
53   endforeach()
54   auto_sources(files "*.S" "RECURSE" "${DIR}")
55   foreach(f ${files})
56     if (NOT (${f} MATCHES "(ext_hhvm|/(old-)?tests?/)"))
57       list(APPEND ASM_SOURCES ${f})
58     endif()
59   endforeach()
60   auto_sources(files "*.h" "RECURSE" "${DIR}")
61   foreach(f ${files})
62     if (NOT (${f} MATCHES "(/(old-)?tests?/)"))
63       list(APPEND HEADER_SOURCES ${f})
64     endif()
65   endforeach()
66 endmacro(HHVM_SELECT_SOURCES)
68 function(CONTAINS_STRING FILE SEARCH RETURN_VALUE)
69   file(STRINGS ${FILE} FILE_CONTENTS REGEX ".*${SEARCH}.*")
70   if (FILE_CONTENTS)
71     set(${RETURN_VALUE} True PARENT_SCOPE)
72   endif()
73 endfunction(CONTAINS_STRING)
75 macro(MYSQL_SOCKET_SEARCH)
76   foreach (i
77       /var/run/mysqld/mysqld.sock
78       /var/tmp/mysql.sock
79       /var/run/mysql/mysql.sock
80       /var/lib/mysql/mysql.sock
81       /var/mysql/mysql.sock
82       /usr/local/mysql/var/mysql.sock
83       /Private/tmp/mysql.sock
84       /private/tmp/mysql.sock
85       /tmp/mysql.sock
86       )
87     if (EXISTS ${i})
88       set(MYSQL_SOCK ${i})
89       break()
90     endif()
91   endforeach()
93   if (MYSQL_SOCK)
94     set(MYSQL_UNIX_SOCK_ADDR ${MYSQL_SOCK} CACHE STRING "Path to MySQL Socket")
95   endif()
96 endmacro()
98 function(append_systemlib TARGET SOURCE SECTNAME)
99   if (APPLE)
100     set(${TARGET}_SLIBS ${${TARGET}_SLIBS} -Wl,-sectcreate,__text,${SECTNAME},${SOURCE} PARENT_SCOPE)
101   else()
102     set(${TARGET}_SLIBS ${${TARGET}_SLIBS} "--add-section" "${SECTNAME}=${SOURCE}" PARENT_SCOPE)
103   endif()
104   # Add the systemlib file to the "LINK_DEPENDS" for the systemlib, this will cause it
105   # to be relinked and the systemlib re-embedded
106   set_property(TARGET ${TARGET} APPEND PROPERTY LINK_DEPENDS ${SOURCE})
107 endfunction(append_systemlib)
109 function(embed_systemlibs TARGET DEST)
110   if (APPLE)
111     target_link_libraries(${TARGET} ${${TARGET}_SLIBS})
112   else()
113     add_custom_command(TARGET ${TARGET} POST_BUILD
114       COMMAND "objcopy"
115       ARGS ${${TARGET}_SLIBS} ${DEST}
116       COMMENT "Embedding php in ${TARGET}")
117   endif()
118 endfunction(embed_systemlibs)
120 macro(embed_systemlib_byname TARGET SLIB)
121   get_filename_component(SLIB_BN ${SLIB} "NAME_WE")
122   string(LENGTH ${SLIB_BN} SLIB_BN_LEN)
123   math(EXPR SLIB_BN_REL_LEN "${SLIB_BN_LEN} - 4")
124   string(SUBSTRING ${SLIB_BN} 4 ${SLIB_BN_REL_LEN} SLIB_EXTNAME)
125   string(MD5 SLIB_HASH_NAME ${SLIB_EXTNAME})
126   # Some platforms limit section names to 16 characters :(
127   string(SUBSTRING ${SLIB_HASH_NAME} 0 12 SLIB_HASH_NAME_SHORT)
128   append_systemlib(${TARGET} ${SLIB} "ext.${SLIB_HASH_NAME_SHORT}")
129 endmacro()
131 function(embed_all_systemlibs TARGET ROOT DEST)
132   append_systemlib(${TARGET} ${ROOT}/system/systemlib.php systemlib)
133   auto_sources(SYSTEMLIBS "ext_*.php" "RECURSE" "${HPHP_HOME}/hphp/runtime")
134   foreach(SLIB ${SYSTEMLIBS})
135     embed_systemlib_byname(${TARGET} ${SLIB})
136   endforeach()
137   embed_systemlibs(${TARGET} ${DEST})
138 endfunction(embed_all_systemlibs)
140 # Custom install function that doesn't relink, instead it uses chrpath to change it, if
141 # it's available, otherwise, it leaves the chrpath alone
142 function(HHVM_INSTALL TARGET DEST)
143   get_target_property(LOC ${TARGET} LOCATION)
144   get_target_property(TY ${TARGET} TYPE)
145   if (FOUND_CHRPATH)
146     get_target_property(RPATH ${TARGET} INSTALL_RPATH)
147     if (NOT RPATH STREQUAL "RPATH-NOTFOUND")
148       if (RPATH STREQUAL "")
149         install(CODE "execute_process(COMMAND \"${CHRPATH}\" \"-d\" \"${LOC}\" ERROR_QUIET)")
150       else()
151         install(CODE "execute_process(COMMAND \"${CHRPATH}\" \"-r\" \"${RPATH}\" \"${LOC}\" ERROR_QUIET)")
152       endif()
153     endif()
154   endif()
155   install(CODE "FILE(INSTALL DESTINATION \"\${CMAKE_INSTALL_PREFIX}/${DEST}\" TYPE ${TY} FILES \"${LOC}\")")
156 endfunction(HHVM_INSTALL)
158 function(HHVM_PUBLIC_HEADERS TARGET)
159   install(
160     CODE "INCLUDE(\"${HPHP_HOME}/CMake/HPHPFunctions.cmake\")
161       HHVM_INSTALL_HEADERS(${TARGET} ${HPHP_HOME}
162       \"${CMAKE_INSTALL_PREFIX}/include\" ${ARGN})"
163     COMPONENT dev)
164 endfunction()
166 function(HHVM_INSTALL_HEADERS TARGET SRCROOT DEST)
167   message(STATUS "Installing header files for ${TARGET}")
168   foreach(src_rel ${ARGN})
169     # Determine the relative directory name so that we can mirror the
170     # directory structure in the output
171     file(RELATIVE_PATH dest_rel ${SRCROOT} ${src_rel})
172     if (IS_ABSOLUTE ${dest_rel})
173       message(WARNING "${TARGET}: Header file ${dest_rel} is not inside ${SRCROOT}")
174     else()
175       string(FIND ${dest_rel} / slash_pos REVERSE)
176       if(slash_pos EQUAL -1)
177         set(dest_rel)
178       else()
179         string(SUBSTRING ${dest_rel} 0 ${slash_pos} dest_rel)
180       endif()
181       file(COPY ${src_rel}
182         DESTINATION "$ENV{DESTDIR}${DEST}/${dest_rel}"
183         NO_SOURCE_PERMISSIONS)
184     endif()
185   endforeach()
186 endfunction()
188 macro(HHVM_EXT_OPTION EXTNAME PACKAGENAME)
189   if (NOT DEFINED EXT_${EXTNAME})
190     # Implicit check
191     find_package(${PACKAGENAME})
192   elseif (EXT_${EXTNAME} STREQUAL "ON")
193     # Explicit check
194     find_package(${PACKAGENAME} REQUIRED)
195   endif()
196 endmacro()