#!/usr/bin/env python
# Copyright (C) 2011-2014 Igalia S.L.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

import sys
import os

sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../jhbuild") )
import jhbuildrc_common
jhbuildrc_common.init(globals(), "gtk") 

__gtk_tools_directory = os.path.abspath(os.path.dirname(__file__))
sys.path = [__gtk_tools_directory] + sys.path
import common

# We always enable introspection so that we can sniff out problems with our
# annotations sooner rather than later.
autogenargs='--enable-introspection'

# LLVM requires that builddir != srcdir, and it's not possible to do that in jhbuild only
# for a module, so we do it here globally since it's a good idea for all other modules as well.
buildroot = os.path.join(os.path.dirname(checkoutroot), "Build")

# For the layout tests: path where llvmpipe/software-only mesa libraries are installed.
os.environ['LLVMPIPE_LIBGL_PATH'] = os.path.abspath(os.path.join(prefix, 'softGL', 'lib'))

# We only want to export this when bulding the JHBuild, but not when building WebKit.
# When the build-webkit script is used, we end executing 'jhbuild [...] run cmake [...]'.
# But when the JHBuild gets built, we end executing 'jhbuild [...] build'.
# So we can know if we are building the JHBuild by checking that 'run' is not an argument.
if 'run' not in sys.argv:
    os.environ['CFLAGS'] = '-Wno-error -O2 -g1'
    os.environ['CXXFLAGS'] = '-Wno-error -O2 -g1'
    # For building gstreamer plugins on the Mac.
    os.environ['OBJCFLAGS'] = '-Wno-error -O2 -g1'
