# Copyright 2015 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# TODO move to j2objc dir

licenses(["notice"])  # Apache License 2.0

exports_files(["LICENSE"])

J2_DIR = "j2objc-0.9.7/"

package(
    default_visibility = ["//visibility:public"],
)

java_import(
    name = "annotations",
    jars = [J2_DIR + "lib/j2objc_annotations.jar"],
)

java_import(
    name = "j2objc",
    jars = [J2_DIR + str for str in [
        "lib/j2objc.jar",
        "lib/guava-14.0.1.jar",
    ]] + glob([J2_DIR + "lib/org.eclipse.*.jar"]),
    exports = [":annotations"],
)

java_import(
    name = "jre_emul_jar",
    jars = [J2_DIR + "lib/jre_emul.jar"],
)

filegroup(
    name = "jre_emul_headers",
    #srcs = glob([J2_DIR + "include/IOSClass.h"]),
    srcs = [J2_DIR + "include/IOSClass.h"],
)

objc_import(
    name = "jre_emul_archive",
    hdrs = glob([J2_DIR + "include/**"]),
    includes = [J2_DIR + "include"],
    archives = [J2_DIR + "lib/libjre_emul.a"],
)
