1# LuaDist CMake utility library.
2# Provides sane project defaults and macros common to LuaDist CMake builds.
3#
4# Copyright (C) 2007-2012 LuaDist.
5# by David Manura, Peter Drahoš
6# Redistribution and use of this file is allowed according to the terms of the MIT license.
7# For details see the COPYRIGHT file distributed with LuaDist.
8# Please note that the package source code is licensed under its own license.
9
10## Extract information from dist.info
11if ( NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/dist.info )
12  message ( FATAL_ERROR
13    "Missing dist.info file (${CMAKE_CURRENT_SOURCE_DIR}/dist.info)." )
14endif ()
15file ( READ ${CMAKE_CURRENT_SOURCE_DIR}/dist.info DIST_INFO )
16if ( "${DIST_INFO}" STREQUAL "" )
17  message ( FATAL_ERROR "Failed to load dist.info." )
18endif ()
19# Reads field `name` from dist.info string `DIST_INFO` into variable `var`.
20macro ( _parse_dist_field name var )
21  string ( REGEX REPLACE ".*${name}[ \t]?=[ \t]?[\"']([^\"']+)[\"'].*" "\\1"
22           ${var} "${DIST_INFO}" )
23  if ( ${var} STREQUAL DIST_INFO )
24    message ( FATAL_ERROR "Failed to extract \"${var}\" from dist.info" )
25  endif ()
26endmacro ()
27#
28_parse_dist_field ( name DIST_NAME )
29_parse_dist_field ( version DIST_VERSION )
30_parse_dist_field ( license DIST_LICENSE )
31_parse_dist_field ( author DIST_AUTHOR )
32_parse_dist_field ( maintainer DIST_MAINTAINER )
33_parse_dist_field ( url DIST_URL )
34_parse_dist_field ( desc DIST_DESC )
35message ( "DIST_NAME: ${DIST_NAME}")
36message ( "DIST_VERSION: ${DIST_VERSION}")
37message ( "DIST_LICENSE: ${DIST_LICENSE}")
38message ( "DIST_AUTHOR: ${DIST_AUTHOR}")
39message ( "DIST_MAINTAINER: ${DIST_MAINTAINER}")
40message ( "DIST_URL: ${DIST_URL}")
41message ( "DIST_DESC: ${DIST_DESC}")
42string ( REGEX REPLACE ".*depends[ \t]?=[ \t]?[\"']([^\"']+)[\"'].*" "\\1"
43         DIST_DEPENDS ${DIST_INFO} )
44if ( DIST_DEPENDS STREQUAL DIST_INFO )
45  set ( DIST_DEPENDS "" )
46endif ()
47message ( "DIST_DEPENDS: ${DIST_DEPENDS}")
48## 2DO: Parse DIST_DEPENDS and try to install Dependencies with automatically using externalproject_add
49
50
51## INSTALL DEFAULTS (Relative to CMAKE_INSTALL_PREFIX)
52# Primary paths
53set ( INSTALL_BIN bin CACHE PATH "Where to install binaries to." )
54set ( INSTALL_LIB lib CACHE PATH "Where to install libraries to." )
55set ( INSTALL_INC include CACHE PATH "Where to install headers to." )
56set ( INSTALL_ETC etc CACHE PATH "Where to store configuration files" )
57set ( INSTALL_SHARE share CACHE PATH "Directory for shared data." )
58
59# Secondary paths
60option ( INSTALL_VERSION
61      "Install runtime libraries and executables with version information." OFF)
62set ( INSTALL_DATA ${INSTALL_SHARE}/${DIST_NAME} CACHE PATH
63      "Directory the package can store documentation, tests or other data in.")
64set ( INSTALL_DOC  ${INSTALL_DATA}/doc CACHE PATH
65      "Recommended directory to install documentation into.")
66set ( INSTALL_EXAMPLE ${INSTALL_DATA}/example CACHE PATH
67      "Recommended directory to install examples into.")
68set ( INSTALL_TEST ${INSTALL_DATA}/test CACHE PATH
69      "Recommended directory to install tests into.")
70set ( INSTALL_FOO  ${INSTALL_DATA}/etc CACHE PATH
71      "Where to install additional files")
72
73# Tweaks and other defaults
74# Setting CMAKE to use loose block and search for find modules in source directory
75set ( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true )
76set ( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH} )
77option ( BUILD_SHARED_LIBS "Build shared libraries" ON )
78
79# In MSVC, prevent warnings that can occur when using standard libraries.
80if ( MSVC )
81  add_definitions ( -D_CRT_SECURE_NO_WARNINGS )
82endif ()
83
84# RPath and relative linking
85option ( USE_RPATH "Use relative linking." ON)
86if ( USE_RPATH )
87  string ( REGEX REPLACE "[^!/]+" ".." UP_DIR ${INSTALL_BIN} )
88  set ( CMAKE_SKIP_BUILD_RPATH FALSE CACHE STRING "" FORCE )
89  set ( CMAKE_BUILD_WITH_INSTALL_RPATH FALSE CACHE STRING "" FORCE )
90  set ( CMAKE_INSTALL_RPATH $ORIGIN/${UP_DIR}/${INSTALL_LIB}
91        CACHE STRING "" FORCE )
92  set ( CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE CACHE STRING "" FORCE )
93  set ( CMAKE_INSTALL_NAME_DIR @executable_path/${UP_DIR}/${INSTALL_LIB}
94        CACHE STRING "" FORCE )
95endif ()
96
97## MACROS
98# Parser macro
99macro ( parse_arguments prefix arg_names option_names)
100  set ( DEFAULT_ARGS )
101  foreach ( arg_name ${arg_names} )
102    set ( ${prefix}_${arg_name} )
103  endforeach ()
104  foreach ( option ${option_names} )
105    set ( ${prefix}_${option} FALSE )
106  endforeach ()
107
108  set ( current_arg_name DEFAULT_ARGS )
109  set ( current_arg_list )
110  foreach ( arg ${ARGN} )
111    set ( larg_names ${arg_names} )
112    list ( FIND larg_names "${arg}" is_arg_name )
113    if ( is_arg_name GREATER -1 )
114      set ( ${prefix}_${current_arg_name} ${current_arg_list} )
115      set ( current_arg_name ${arg} )
116      set ( current_arg_list )
117    else ()
118      set ( loption_names ${option_names} )
119      list ( FIND loption_names "${arg}" is_option )
120      if ( is_option GREATER -1 )
121        set ( ${prefix}_${arg} TRUE )
122      else ()
123        set ( current_arg_list ${current_arg_list} ${arg} )
124      endif ()
125    endif ()
126  endforeach ()
127  set ( ${prefix}_${current_arg_name} ${current_arg_list} )
128endmacro ()
129
130
131# install_executable ( executable_targets )
132# Installs any executables generated using "add_executable".
133# USE: install_executable ( lua )
134# NOTE: subdirectories are NOT supported
135set ( CPACK_COMPONENT_RUNTIME_DISPLAY_NAME "${DIST_NAME} Runtime" )
136set ( CPACK_COMPONENT_RUNTIME_DESCRIPTION
137      "Executables and runtime libraries. Installed into ${INSTALL_BIN}." )
138macro ( install_executable )
139  foreach ( _file ${ARGN} )
140    if ( INSTALL_VERSION )
141      set_target_properties ( ${_file} PROPERTIES VERSION ${DIST_VERSION}
142                              SOVERSION ${DIST_VERSION} )
143    endif ()
144    install ( TARGETS ${_file} RUNTIME DESTINATION ${INSTALL_BIN}
145              COMPONENT Runtime )
146  endforeach()
147endmacro ()
148
149# install_library ( library_targets )
150# Installs any libraries generated using "add_library" into apropriate places.
151# USE: install_library ( libexpat )
152# NOTE: subdirectories are NOT supported
153set ( CPACK_COMPONENT_LIBRARY_DISPLAY_NAME "${DIST_NAME} Development Libraries" )
154set ( CPACK_COMPONENT_LIBRARY_DESCRIPTION
155  "Static and import libraries needed for development. Installed into ${INSTALL_LIB} or ${INSTALL_BIN}." )
156macro ( install_library )
157  foreach ( _file ${ARGN} )
158    if ( INSTALL_VERSION )
159      set_target_properties ( ${_file} PROPERTIES VERSION ${DIST_VERSION}
160                              SOVERSION ${DIST_VERSION} )
161    endif ()
162    install ( TARGETS ${_file}
163              RUNTIME DESTINATION ${INSTALL_BIN} COMPONENT Runtime
164              LIBRARY DESTINATION ${INSTALL_LIB} COMPONENT Runtime
165              ARCHIVE DESTINATION ${INSTALL_LIB} COMPONENT Library )
166  endforeach()
167endmacro ()
168
169# helper function for various install_* functions, for PATTERN/REGEX args.
170macro ( _complete_install_args )
171  if ( NOT("${_ARG_PATTERN}" STREQUAL "") )
172    set ( _ARG_PATTERN PATTERN ${_ARG_PATTERN} )
173  endif ()
174  if ( NOT("${_ARG_REGEX}" STREQUAL "") )
175    set ( _ARG_REGEX REGEX ${_ARG_REGEX} )
176  endif ()
177endmacro ()
178
179# install_header ( files/directories [INTO destination] )
180# Install a directories or files into header destination.
181# USE: install_header ( lua.h luaconf.h ) or install_header ( GL )
182# USE: install_header ( mylib.h INTO mylib )
183# For directories, supports optional PATTERN/REGEX arguments like install().
184set ( CPACK_COMPONENT_HEADER_DISPLAY_NAME "${DIST_NAME} Development Headers" )
185set ( CPACK_COMPONENT_HEADER_DESCRIPTION
186      "Headers needed for development. Installed into ${INSTALL_INC}." )
187macro ( install_header )
188  parse_arguments ( _ARG "INTO;PATTERN;REGEX" "" ${ARGN} )
189  _complete_install_args()
190  foreach ( _file ${_ARG_DEFAULT_ARGS} )
191    if ( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${_file}" )
192      install ( DIRECTORY ${_file} DESTINATION ${INSTALL_INC}/${_ARG_INTO}
193                COMPONENT Header ${_ARG_PATTERN} ${_ARG_REGEX} )
194    else ()
195      install ( FILES ${_file} DESTINATION ${INSTALL_INC}/${_ARG_INTO}
196                COMPONENT Header )
197    endif ()
198  endforeach()
199endmacro ()
200
201# install_data ( files/directories [INTO destination] )
202# This installs additional data files or directories.
203# USE: install_data ( extra data.dat )
204# USE: install_data ( image1.png image2.png INTO images )
205# For directories, supports optional PATTERN/REGEX arguments like install().
206set ( CPACK_COMPONENT_DATA_DISPLAY_NAME "${DIST_NAME} Data" )
207set ( CPACK_COMPONENT_DATA_DESCRIPTION
208      "Application data. Installed into ${INSTALL_DATA}." )
209macro ( install_data )
210  parse_arguments ( _ARG "INTO;PATTERN;REGEX" "" ${ARGN} )
211  _complete_install_args()
212  foreach ( _file ${_ARG_DEFAULT_ARGS} )
213    if ( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${_file}" )
214      install ( DIRECTORY ${_file}
215                DESTINATION ${INSTALL_DATA}/${_ARG_INTO}
216                COMPONENT Data ${_ARG_PATTERN} ${_ARG_REGEX} )
217    else ()
218      install ( FILES ${_file} DESTINATION ${INSTALL_DATA}/${_ARG_INTO}
219                COMPONENT Data )
220    endif ()
221  endforeach()
222endmacro ()
223
224# INSTALL_DOC ( files/directories [INTO destination] )
225# This installs documentation content
226# USE: install_doc ( doc/ doc.pdf )
227# USE: install_doc ( index.html INTO html )
228# For directories, supports optional PATTERN/REGEX arguments like install().
229set ( CPACK_COMPONENT_DOCUMENTATION_DISPLAY_NAME "${DIST_NAME} Documentation" )
230set ( CPACK_COMPONENT_DOCUMENTATION_DESCRIPTION
231      "Application documentation. Installed into ${INSTALL_DOC}." )
232macro ( install_doc )
233  parse_arguments ( _ARG "INTO;PATTERN;REGEX" "" ${ARGN} )
234  _complete_install_args()
235  foreach ( _file ${_ARG_DEFAULT_ARGS} )
236    if ( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${_file}" )
237      install ( DIRECTORY ${_file} DESTINATION ${INSTALL_DOC}/${_ARG_INTO}
238                COMPONENT Documentation ${_ARG_PATTERN} ${_ARG_REGEX} )
239    else ()
240      install ( FILES ${_file} DESTINATION ${INSTALL_DOC}/${_ARG_INTO}
241                COMPONENT Documentation )
242    endif ()
243  endforeach()
244endmacro ()
245
246# install_example ( files/directories [INTO destination]  )
247# This installs additional examples
248# USE: install_example ( examples/ exampleA )
249# USE: install_example ( super_example super_data INTO super)
250# For directories, supports optional PATTERN/REGEX argument like install().
251set ( CPACK_COMPONENT_EXAMPLE_DISPLAY_NAME "${DIST_NAME} Examples" )
252set ( CPACK_COMPONENT_EXAMPLE_DESCRIPTION
253    "Examples and their associated data. Installed into ${INSTALL_EXAMPLE}." )
254macro ( install_example )
255  parse_arguments ( _ARG "INTO;PATTERN;REGEX" "" ${ARGN} )
256  _complete_install_args()
257  foreach ( _file ${_ARG_DEFAULT_ARGS} )
258    if ( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${_file}" )
259      install ( DIRECTORY ${_file} DESTINATION ${INSTALL_EXAMPLE}/${_ARG_INTO}
260                COMPONENT Example ${_ARG_PATTERN} ${_ARG_REGEX} )
261    else ()
262      install ( FILES ${_file} DESTINATION ${INSTALL_EXAMPLE}/${_ARG_INTO}
263                COMPONENT Example )
264    endif ()
265  endforeach()
266endmacro ()
267
268# install_test ( files/directories [INTO destination] )
269# This installs tests and test files, DOES NOT EXECUTE TESTS
270# USE: install_test ( my_test data.sql )
271# USE: install_test ( feature_x_test INTO x )
272# For directories, supports optional PATTERN/REGEX argument like install().
273set ( CPACK_COMPONENT_TEST_DISPLAY_NAME "${DIST_NAME} Tests" )
274set ( CPACK_COMPONENT_TEST_DESCRIPTION
275      "Tests and associated data. Installed into ${INSTALL_TEST}." )
276macro ( install_test )
277  parse_arguments ( _ARG "INTO;PATTERN;REGEX" "" ${ARGN} )
278  _complete_install_args()
279  foreach ( _file ${_ARG_DEFAULT_ARGS} )
280    if ( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${_file}" )
281      install ( DIRECTORY ${_file} DESTINATION ${INSTALL_TEST}/${_ARG_INTO}
282                COMPONENT Test ${_ARG_PATTERN} ${_ARG_REGEX} )
283    else ()
284      install ( FILES ${_file} DESTINATION ${INSTALL_TEST}/${_ARG_INTO}
285                COMPONENT Test )
286    endif ()
287  endforeach()
288endmacro ()
289
290# install_foo ( files/directories [INTO destination] )
291# This installs optional or otherwise unneeded content
292# USE: install_foo ( etc/ example.doc )
293# USE: install_foo ( icon.png logo.png INTO icons)
294# For directories, supports optional PATTERN/REGEX argument like install().
295set ( CPACK_COMPONENT_OTHER_DISPLAY_NAME "${DIST_NAME} Unspecified Content" )
296set ( CPACK_COMPONENT_OTHER_DESCRIPTION
297      "Other unspecified content. Installed into ${INSTALL_FOO}." )
298macro ( install_foo )
299  parse_arguments ( _ARG "INTO;PATTERN;REGEX" "" ${ARGN} )
300  _complete_install_args()
301  foreach ( _file ${_ARG_DEFAULT_ARGS} )
302    if ( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${_file}" )
303      install ( DIRECTORY ${_file} DESTINATION ${INSTALL_FOO}/${_ARG_INTO}
304                COMPONENT Other ${_ARG_PATTERN} ${_ARG_REGEX} )
305    else ()
306      install ( FILES ${_file} DESTINATION ${INSTALL_FOO}/${_ARG_INTO}
307                COMPONENT Other )
308    endif ()
309  endforeach()
310endmacro ()
311
312## CTest defaults
313
314## CPack defaults
315set ( CPACK_GENERATOR "ZIP" )
316set ( CPACK_STRIP_FILES TRUE )
317set ( CPACK_PACKAGE_NAME "${DIST_NAME}" )
318set ( CPACK_PACKAGE_VERSION "${DIST_VERSION}")
319set ( CPACK_PACKAGE_VENDOR "LuaDist" )
320set ( CPACK_COMPONENTS_ALL Runtime Library Header Data Documentation Example Other )
321include ( CPack )
322