2
2
# Copyright 2009-2010 Jakob Westhoff. All rights reserved.
3
# Copyright 2012 elementary.
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
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.
84
# Output a <provided_name>.symbols file containing all the exported symbols.
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:
80
# vala_precompile(VALA_C
89
# vala_precompile(VALA_C mytargetname
100
113
# Most important is the variable VALA_C which will contain all the generated c
101
114
# file names after the call.
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})
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})
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}")
125
list(APPEND in_files "${CMAKE_CURRENT_SOURCE_DIR}/${src}")
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}")
134
set(out_file "${DIRECTORY}/${src}")
135
list(APPEND out_files "${DIRECTORY}/${src}")
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})
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")
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)
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)
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)
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)
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)
172
191
${VALA_EXECUTABLE}
175
194
${header_arguments}
177
198
"-b" ${CMAKE_CURRENT_SOURCE_DIR}
178
199
"-d" ${DIRECTORY}
182
203
${custom_vapi_arguments}
185
210
${ARGS_CUSTOM_VAPIS}
212
"Generating ${out_files_display}"
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)