~khurshid-alam/indicator-sound/lp-1714517

« back to all changes in this revision

Viewing changes to cmake/UseVala.cmake

  • Committer: Pete Woods
  • Date: 2013-08-16 03:13:41 UTC
  • mto: This revision was merged to the branch mainline in revision 367.
  • Revision ID: pete.woods@canonical.com-20130816031341-796d95t01jzc0aue
Build using cmake

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# - Precompilation of Vala/Genie source files into C sources
 
2
# Makes use of the parallel build ability introduced in Vala 0.11. Derived
 
3
# from a similar module by Jakob Westhoff and the original GNU Make rules.
 
4
# Might be a bit oversimplified.
 
5
#
 
6
# This module defines three functions. The first one:
 
7
#
 
8
#   vala_init (id
 
9
#     [DIRECTORY dir]          - Output directory (binary dir by default)
 
10
#     [PACKAGES package...]    - Package dependencies
 
11
#     [OPTIONS option...]      - Extra valac options
 
12
#     [CUSTOM_VAPIS file...])  - Custom vapi files to include in the build
 
13
#     [DEPENDS targets...])    - Extra dependencies for code generation
 
14
#
 
15
# initializes a single precompilation unit using the given arguments.
 
16
# You can put files into it via the following function:
 
17
#
 
18
#   vala_add (id source.vala
 
19
#     [DEPENDS source...])     - Vala/Genie source or .vapi dependencies
 
20
#
 
21
# Finally retrieve paths for generated C files by calling:
 
22
#
 
23
#   vala_finish (id
 
24
#     [SOURCES sources_var]          - Input Vala/Genie sources
 
25
#     [OUTPUTS outputs_var]          - Output C sources
 
26
#     [GENERATE_HEADER id.h          - Generate id.h and id_internal.h
 
27
#       [GENERATE_VAPI id.vapi]      - Generate a vapi file
 
28
#       [GENERATE_SYMBOLS id.def]])  - Generate a list of public symbols
 
29
#
 
30
 
 
31
#=============================================================================
 
32
# Copyright Přemysl Janouch 2011
 
33
# All rights reserved.
 
34
#
 
35
# Redistribution and use in source and binary forms, with or without
 
36
# modification, are permitted provided that the following conditions are met:
 
37
#     * Redistributions of source code must retain the above copyright
 
38
#       notice, this list of conditions and the following disclaimer.
 
39
#     * Redistributions in binary form must reproduce the above copyright
 
40
#       notice, this list of conditions and the following disclaimer in the
 
41
#       documentation and/or other materials provided with the distribution.
 
42
#
 
43
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
 
44
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 
45
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 
46
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE
 
47
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
48
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 
49
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
50
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 
51
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 
52
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 
53
# OF SUCH DAMAGE.
 
54
#=============================================================================
 
55
 
 
56
find_package (Vala 0.18 REQUIRED)
 
57
include (CMakeParseArguments)
 
58
 
 
59
function (vala_init id)
 
60
        set (_multi_value PACKAGES OPTIONS CUSTOM_VAPIS DEPENDS)
 
61
        cmake_parse_arguments (arg "" "DIRECTORY" "${_multi_value}" ${ARGN})
 
62
 
 
63
        if (arg_DIRECTORY)
 
64
                set (directory ${arg_DIRECTORY})
 
65
                if (NOT IS_DIRECTORY ${directory})
 
66
                        file (MAKE_DIRECTORY ${directory})
 
67
                endif (NOT IS_DIRECTORY ${directory})
 
68
        else (arg_DIRECTORY)
 
69
                set (directory ${CMAKE_CURRENT_BINARY_DIR})
 
70
        endif (arg_DIRECTORY)
 
71
 
 
72
        set (pkg_opts)
 
73
        foreach (pkg ${arg_PACKAGES})
 
74
                list (APPEND pkg_opts "--pkg=${pkg}")
 
75
        endforeach (pkg)
 
76
 
 
77
        set (VALA_${id}_DIR "${directory}" PARENT_SCOPE)
 
78
        set (VALA_${id}_ARGS ${pkg_opts} ${arg_OPTIONS}
 
79
                ${arg_CUSTOM_VAPIS} PARENT_SCOPE)
 
80
        set (VALA_${id}_DEPENDS ${arg_DEPENDS}
 
81
                PARENT_SCOPE)
 
82
 
 
83
        set (VALA_${id}_SOURCES "" PARENT_SCOPE)
 
84
        set (VALA_${id}_OUTPUTS "" PARENT_SCOPE)
 
85
        set (VALA_${id}_FAST_VAPI_FILES "" PARENT_SCOPE)
 
86
        set (VALA_${id}_FAST_VAPI_ARGS "" PARENT_SCOPE)
 
87
endfunction (vala_init)
 
88
 
 
89
function (vala_add id file)
 
90
        cmake_parse_arguments (arg "" "" "DEPENDS" ${ARGN})
 
91
 
 
92
        if (NOT IS_ABSOLUTE "${file}")
 
93
                set (file "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
 
94
        endif (NOT IS_ABSOLUTE "${file}")
 
95
 
 
96
        get_filename_component (output_name "${file}" NAME)
 
97
        get_filename_component (output_base "${file}" NAME_WE)
 
98
        set (output_base "${VALA_${id}_DIR}/${output_base}")
 
99
 
 
100
        # XXX: It would be best to have it working without touching the vapi
 
101
        #      but it appears this cannot be done in CMake.
 
102
        add_custom_command (OUTPUT "${output_base}.vapi"
 
103
                COMMAND ${VALA_COMPILER} "${file}" "--fast-vapi=${output_base}.vapi"
 
104
                COMMAND ${CMAKE_COMMAND} -E touch "${output_base}.vapi"
 
105
                DEPENDS "${file}"
 
106
                COMMENT "Generating a fast vapi for ${output_name}" VERBATIM)
 
107
 
 
108
        set (vapi_opts)
 
109
        set (vapi_depends)
 
110
        foreach (vapi ${arg_DEPENDS})
 
111
                if (NOT IS_ABSOLUTE "${vapi}")
 
112
                        set (vapi "${VALA_${id}_DIR}/${vapi}.vapi")
 
113
                endif (NOT IS_ABSOLUTE "${vapi}")
 
114
 
 
115
                list (APPEND vapi_opts "--use-fast-vapi=${vapi}")
 
116
                list (APPEND vapi_depends "${vapi}")
 
117
        endforeach (vapi)
 
118
 
 
119
        add_custom_command (OUTPUT "${output_base}.c"
 
120
                COMMAND ${VALA_COMPILER} "${file}" -C ${vapi_opts} ${VALA_${id}_ARGS}
 
121
                COMMAND ${CMAKE_COMMAND} -E touch "${output_base}.c"
 
122
                DEPENDS "${file}" ${vapi_depends} ${VALA_${id}_DEPENDS}
 
123
                WORKING_DIRECTORY "${VALA_${id}_DIR}"
 
124
                COMMENT "Precompiling ${output_name}" VERBATIM)
 
125
 
 
126
        set (VALA_${id}_SOURCES ${VALA_${id}_SOURCES}
 
127
                "${file}" PARENT_SCOPE)
 
128
        set (VALA_${id}_OUTPUTS ${VALA_${id}_OUTPUTS}
 
129
                "${output_base}.c" PARENT_SCOPE)
 
130
        set (VALA_${id}_FAST_VAPI_FILES ${VALA_${id}_FAST_VAPI_FILES}
 
131
                "${output_base}.vapi" PARENT_SCOPE)
 
132
        set (VALA_${id}_FAST_VAPI_ARGS ${VALA_${id}_FAST_VAPI_ARGS}
 
133
                "--use-fast-vapi=${output_base}.vapi" PARENT_SCOPE)
 
134
endfunction (vala_add)
 
135
 
 
136
function (vala_finish id)
 
137
        set (_one_value SOURCES OUTPUTS
 
138
                GENERATE_VAPI GENERATE_HEADER GENERATE_SYMBOLS)
 
139
        cmake_parse_arguments (arg "" "${_one_value}" "" ${ARGN})
 
140
 
 
141
        if (arg_SOURCES)
 
142
                set (${arg_SOURCES} ${VALA_${id}_SOURCES} PARENT_SCOPE)
 
143
        endif (arg_SOURCES)
 
144
 
 
145
        if (arg_OUTPUTS)
 
146
                set (${arg_OUTPUTS} ${VALA_${id}_OUTPUTS} PARENT_SCOPE)
 
147
        endif (arg_OUTPUTS)
 
148
 
 
149
        set (outputs)
 
150
        set (export_args)
 
151
 
 
152
        if (arg_GENERATE_VAPI)
 
153
                if (NOT IS_ABSOLUTE "${arg_GENERATE_VAPI}")
 
154
                        set (arg_GENERATE_VAPI
 
155
                                "${VALA_${id}_DIR}/${arg_GENERATE_VAPI}")
 
156
                endif (NOT IS_ABSOLUTE "${arg_GENERATE_VAPI}")
 
157
 
 
158
                list (APPEND outputs "${arg_GENERATE_VAPI}")
 
159
                list (APPEND export_args "--internal-vapi=${arg_GENERATE_VAPI}")
 
160
 
 
161
                if (NOT arg_GENERATE_HEADER)
 
162
                        message (FATAL_ERROR "Header generation required for vapi")
 
163
                endif (NOT arg_GENERATE_HEADER)
 
164
        endif (arg_GENERATE_VAPI)
 
165
 
 
166
        if (arg_GENERATE_SYMBOLS)
 
167
                if (NOT IS_ABSOLUTE "${arg_GENERATE_SYMBOLS}")
 
168
                        set (arg_GENERATE_SYMBOLS
 
169
                                "${VALA_${id}_DIR}/${arg_GENERATE_SYMBOLS}")
 
170
                endif (NOT IS_ABSOLUTE "${arg_GENERATE_SYMBOLS}")
 
171
 
 
172
                list (APPEND outputs "${arg_GENERATE_SYMBOLS}")
 
173
                list (APPEND export_args "--symbols=${arg_GENERATE_SYMBOLS}")
 
174
 
 
175
                if (NOT arg_GENERATE_HEADER)
 
176
                        message (FATAL_ERROR "Header generation required for symbols")
 
177
                endif (NOT arg_GENERATE_HEADER)
 
178
        endif (arg_GENERATE_SYMBOLS)
 
179
 
 
180
        if (arg_GENERATE_HEADER)
 
181
                if (NOT IS_ABSOLUTE "${arg_GENERATE_HEADER}")
 
182
                        set (arg_GENERATE_HEADER
 
183
                                "${VALA_${id}_DIR}/${arg_GENERATE_HEADER}")
 
184
                endif (NOT IS_ABSOLUTE "${arg_GENERATE_HEADER}")
 
185
 
 
186
                get_filename_component (header_path "${arg_GENERATE_HEADER}" PATH)
 
187
                get_filename_component (header_name "${arg_GENERATE_HEADER}" NAME_WE)
 
188
                set (header_base "${header_path}/${header_name}")
 
189
                get_filename_component (header_ext "${arg_GENERATE_HEADER}" EXT)
 
190
 
 
191
                list (APPEND outputs
 
192
                        "${header_base}${header_ext}"
 
193
                        "${header_base}_internal${header_ext}")
 
194
                list (APPEND export_args
 
195
                        "--header=${header_base}${header_ext}"
 
196
                        "--internal-header=${header_base}_internal${header_ext}")
 
197
        endif (arg_GENERATE_HEADER)
 
198
 
 
199
        if (outputs)
 
200
                add_custom_command (OUTPUT ${outputs}
 
201
                        COMMAND ${VALA_COMPILER} -C ${VALA_${id}_ARGS}
 
202
                                ${export_args} ${VALA_${id}_FAST_VAPI_ARGS}
 
203
                        DEPENDS ${VALA_${id}_FAST_VAPI_FILES}
 
204
                        COMMENT "Generating vapi/headers/symbols" VERBATIM)
 
205
        endif (outputs)
 
206
endfunction (vala_finish id)
 
207
 
 
208
 
 
209
function (vapi_gen id)
 
210
        set (_one_value LIBRARY INPUT)
 
211
        set (_multi_value PACKAGES)
 
212
        cmake_parse_arguments (arg "" "${_one_value}" "${_multi_value}" ${ARGN})
 
213
 
 
214
        set(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${id}.vapi")
 
215
        if (arg_LIBRARY)
 
216
                set (OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${arg_LIBRARY}.vapi")
 
217
        endif (arg_LIBRARY)
 
218
        
 
219
        set("${id}_OUTPUT" ${OUTPUT} PARENT_SCOPE)
 
220
        
 
221
        set(PACKAGE_LIST)
 
222
        foreach(PACKAGE ${arg_PACKAGES})
 
223
                list(APPEND PACKAGE_LIST "--pkg" ${PACKAGE})
 
224
        endforeach()
 
225
        
 
226
        add_custom_command(
 
227
                OUTPUT
 
228
                        ${OUTPUT}
 
229
                COMMAND
 
230
                        ${VAPI_GEN}
 
231
                        ${PACKAGE_LIST}
 
232
                        --library=${arg_LIBRARY}
 
233
                        ${arg_INPUT}
 
234
                DEPENDS
 
235
                        ${arg_INPUT}
 
236
                VERBATIM
 
237
        )
 
238
        
 
239
        add_custom_target(${id} ALL DEPENDS ${OUTPUT})
 
240
endfunction (vapi_gen id)
 
241