~elementary-pantheon/contractor/master

« back to all changes in this revision

Viewing changes to cmake/ValaPrecompile.cmake

  • Committer: Victor
  • Date: 2013-05-01 20:40:22 UTC
  • mto: This revision was merged to the branch mainline in revision 117.
  • Revision ID: git-v1:99d708225e3c84a32f833e38b34e5d5ef6271231
[CMake] Use new ValaPrecompile module to make compilations more efficient and fix a bug related to double-execution of valac.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
##
2
2
# Copyright 2009-2010 Jakob Westhoff. All rights reserved.
 
3
# Copyright 2012 elementary.
3
4
4
5
# Redistribution and use in source and binary forms, with or without
5
6
# modification, are permitted provided that the following conditions are met:
74
75
#   be a header file as well as an internal header file being generated called
75
76
#   <provided_name>.h and <provided_name>_internal.h
76
77
#
 
78
# GENERATE_GIR
 
79
#   Have the compiler generate a GObject-Introspection repository file with
 
80
#   name: <provided_name>.gir. This can be later used to create a binary typelib
 
81
#   using the GI compiler.
 
82
#
 
83
# GENERATE_SYMBOLS
 
84
#   Output a <provided_name>.symbols file containing all the exported symbols.
 
85
77
86
# The following call is a simple example to the vala_precompile macro showing
78
87
# an example to every of the optional sections:
79
88
#
80
 
#   vala_precompile(VALA_C
 
89
#   vala_precompile(VALA_C mytargetname
81
90
#       source1.vala
82
91
#       source2.vala
83
92
#       source3.vala
95
104
#       myvapi
96
105
#   GENERATE_HEADER
97
106
#       myheader
 
107
#   GENERATE_GIR
 
108
#       mygir
 
109
#   GENERATE_SYMBOLS
 
110
#       mysymbols
98
111
#   )
99
112
#
100
113
# Most important is the variable VALA_C which will contain all the generated c
101
114
# file names after the call.
102
115
##
103
116
 
104
 
macro(vala_precompile output)
105
 
    parse_arguments(ARGS "PACKAGES;OPTIONS;DIRECTORY;GENERATE_HEADER;GENERATE_VAPI;CUSTOM_VAPIS" "" ${ARGN})
 
117
macro(vala_precompile output target_name)
 
118
    parse_arguments(ARGS "TARGET;PACKAGES;OPTIONS;DIRECTORY;GENERATE_GIR;GENERATE_SYMBOLS;GENERATE_HEADER;GENERATE_VAPI;CUSTOM_VAPIS" "" ${ARGN})
 
119
 
106
120
    if(ARGS_DIRECTORY)
107
121
        set(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${ARGS_DIRECTORY})
108
122
    else(ARGS_DIRECTORY)
115
129
    endforeach(pkg ${ARGS_PACKAGES})
116
130
    set(in_files "")
117
131
    set(out_files "")
 
132
    set(out_files_display "")
118
133
    set(${output} "")
119
134
    foreach(src ${ARGS_DEFAULT_ARGS})
120
 
        string(REPLACE ${CMAKE_CURRENT_SOURCE_DIR}/ "" src ${src})
121
 
        string(REGEX MATCH "^/" IS_MATCHED ${src})
122
 
        if(${IS_MATCHED} MATCHES "/")
123
 
            list(APPEND in_files "${src}")
124
 
        else()
125
 
            list(APPEND in_files "${CMAKE_CURRENT_SOURCE_DIR}/${src}")
126
 
        endif()
 
135
        list(APPEND in_files "${CMAKE_CURRENT_SOURCE_DIR}/${src}")
127
136
        string(REPLACE ".vala" ".c" src ${src})
128
137
        string(REPLACE ".gs" ".c" src ${src})
129
 
        if(${IS_MATCHED} MATCHES "/")
130
 
            get_filename_component(VALA_FILE_NAME ${src} NAME)
131
 
            set(out_file "${CMAKE_CURRENT_BINARY_DIR}/${VALA_FILE_NAME}")
132
 
            list(APPEND out_files "${CMAKE_CURRENT_BINARY_DIR}/${VALA_FILE_NAME}")
133
 
        else()
134
 
            set(out_file "${DIRECTORY}/${src}")
135
 
            list(APPEND out_files "${DIRECTORY}/${src}")
136
 
        endif()
 
138
        set(out_file "${DIRECTORY}/${src}")
 
139
        list(APPEND out_files "${DIRECTORY}/${src}")
 
140
        list(APPEND out_files_display "${src}")
137
141
        list(APPEND ${output} ${out_file})
138
142
    endforeach(src ${ARGS_DEFAULT_ARGS})
139
143
 
151
155
    set(vapi_arguments "")
152
156
    if(ARGS_GENERATE_VAPI)
153
157
        list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_VAPI}.vapi")
154
 
        set(vapi_arguments "--internal-vapi=${ARGS_GENERATE_VAPI}.vapi")
155
 
 
156
 
        # Header and internal header is needed to generate internal vapi
157
 
        if (NOT ARGS_GENERATE_HEADER)
158
 
            set(ARGS_GENERATE_HEADER ${ARGS_GENERATE_VAPI})
159
 
        endif(NOT ARGS_GENERATE_HEADER)
 
158
        list(APPEND out_files_display "${ARGS_GENERATE_VAPI}.vapi")
 
159
        set(vapi_arguments "--library=${ARGS_GENERATE_VAPI}" "--vapi=${ARGS_GENERATE_VAPI}.vapi")
160
160
    endif(ARGS_GENERATE_VAPI)
161
161
 
162
162
    set(header_arguments "")
163
163
    if(ARGS_GENERATE_HEADER)
164
164
        list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_HEADER}.h")
165
 
        list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_HEADER}_internal.h")
166
 
        list(APPEND header_arguments "--header=${DIRECTORY}/${ARGS_GENERATE_HEADER}.h")
167
 
        list(APPEND header_arguments "--internal-header=${DIRECTORY}/${ARGS_GENERATE_HEADER}_internal.h")
 
165
        list(APPEND out_files_display "${ARGS_GENERATE_HEADER}.h")
 
166
        list(APPEND header_arguments "--header=${ARGS_GENERATE_HEADER}.h")
168
167
    endif(ARGS_GENERATE_HEADER)
169
168
 
170
 
    add_custom_command(OUTPUT ${out_files} 
 
169
    set(gir_arguments "")
 
170
    if(ARGS_GENERATE_GIR)
 
171
        list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_GIR}.gir")
 
172
        list(APPEND out_files_display "${ARGS_GENERATE_GIR}.gir")
 
173
        set(gir_arguments "--gir=${ARGS_GENERATE_GIR}.gir")
 
174
    endif(ARGS_GENERATE_GIR)
 
175
 
 
176
    set(symbols_arguments "")
 
177
    if(ARGS_GENERATE_SYMBOLS)
 
178
        list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_SYMBOLS}.symbols")
 
179
        list(APPEND out_files_display "${ARGS_GENERATE_SYMBOLS}.symbols")
 
180
        set(symbols_arguments "--symbols=${ARGS_GENERATE_SYMBOLS}.symbols")
 
181
    endif(ARGS_GENERATE_SYMBOLS)
 
182
 
 
183
    # Workaround for a bug that would make valac run twice. This file is written
 
184
    # after the vala compiler generates C source code.
 
185
    set(OUTPUT_STAMP ${CMAKE_CURRENT_BINARY_DIR}/${target_name}_valac.stamp)
 
186
 
 
187
    add_custom_command(
 
188
    OUTPUT
 
189
        ${OUTPUT_STAMP}
171
190
    COMMAND 
172
191
        ${VALA_EXECUTABLE} 
173
192
    ARGS 
174
193
        "-C" 
175
194
        ${header_arguments} 
176
 
        ${vapi_arguments}
 
195
        ${vapi_arguments} 
 
196
        ${gir_arguments} 
 
197
        ${symbols_arguments} 
177
198
        "-b" ${CMAKE_CURRENT_SOURCE_DIR} 
178
199
        "-d" ${DIRECTORY} 
179
200
        ${vala_pkg_opts} 
180
201
        ${ARGS_OPTIONS} 
181
202
        ${in_files} 
182
203
        ${custom_vapi_arguments}
 
204
    COMMAND
 
205
        touch
 
206
    ARGS
 
207
        ${OUTPUT_STAMP}
183
208
    DEPENDS 
184
209
        ${in_files} 
185
210
        ${ARGS_CUSTOM_VAPIS}
 
211
    COMMENT
 
212
        "Generating ${out_files_display}"
186
213
    )
 
214
 
 
215
    # This command will be run twice for some reason (pass a non-empty string to COMMENT
 
216
    # in order to see it). Since valac is not executed from here, this won't be a problem.
 
217
    add_custom_command(OUTPUT ${out_files} DEPENDS ${OUTPUT_STAMP} COMMENT "")
187
218
endmacro(vala_precompile)