// 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.

syntax = "proto2";

package build.xcode;
option java_outer_classname = "XcodeGenProtos";
option java_package = "com.google.devtools.build.xcode.xcodegen.proto";

// Protos named "*Control" are protos that can be used to tell Xcodegen what to
// do.

// Contains all information needed to pass to Xcodegen for it to generate a
// project file.
message Control {
  // Relative path to the project.pbxproj file. This value is used to construct
  // relative paths in the xcodeproj file, as well as to specify where to write
  // the resulting project file.
  optional string pbxproj = 1;

  // The targets to generate.
  repeated TargetControl target = 2;

  // Project-level build settings. These are shared with every target, unless
  // an individual target overrides any of them.
  repeated XcodeprojBuildSetting build_setting = 3;
}

// Information about dependency on a separate target.
message DependencyControl {
  // Label of the target in the project file that is depended upon.
  optional string target_label = 1;

  // Set to true if this dependency is that of a xctest target on its TEST_HOST.
  // Considered 'false' if omitted.
  optional bool test_host = 2;
}

// Contains information specific to a single target in the project file.
// Next ID: 23
message TargetControl {
  // A short name for the target that need not be unique. For instance, for
  // binary targets this corresponds to the product name.
  optional string name = 1;

  // Relative paths to source files to compile. Each source file is added to
  // the sources build phase of the target, so any file accepted by Xcode is
  // valid.
  repeated string source_file = 2;

  // Identical to source_file, but only Objective-C[++] source files are
  // valid. These sources are compiled without ARC.
  repeated string non_arc_source_file = 6;

  // Relative paths to support files, such as BUILD, header, and non-compiled
  // source files. These are included in the project so they can be opened in
  // the project explorer view, but are not compiled into object files.
  repeated string support_file = 3;

  // Dependencies this target has on other targets.
  repeated DependencyControl dependency = 4;

  // (Used for objc_binary and objc_bundle_library targets) path to the
  // -Info.plist file for the application.
  optional string infoplist = 5;

  // Label corresponding to the target. This is needed to determine a
  // unique name for the target in the project. This is similar to the name
  // field, but is globally unique and may be long.
  optional string label = 7;

  // Additional flags to pass to the [objective] c[++] compiler.
  repeated string copt = 8;

  // Additional flags to pass to the linker.
  repeated string linkopt = 22;

  // Paths to *.xcassets directories to include in the target as asset
  // catalogs. For all targets, this causes the .xcassets directory to be
  // included in the Project Navigator. For targets that can include them (e.g.
  // objc_binary), this causes them to be included in the resources build
  // phase.
  repeated string xcassets_dir = 9;

  // Miscellaneous build settings. Each setting is applied to all build
  // configurations.
  repeated XcodeprojBuildSetting build_setting = 10;

  // Paths to strings or xib files. Xcodegen will determine automatically if
  // they are localized (i.e. are in a directory named *.lproj) or not.
  // TODO(bazel-team): Introduce a more powerful resource file protobuf, a
  // list of which can be used to specify all resources.
  repeated string general_resource_file = 11;

  // SDK frameworks to link with this target. This should be every framework
  // required by the targets in the transitive dependency tree. Xcodegen does
  // not find these transitive dependencies automatically; they must be added
  // to this repeated field.
  repeated string sdk_framework = 12;

  // Paths to non-SDK frameworks to link with this target, relative to the
  // same path as every other path in the control file. This should be every
  // framework required by the targets in the transitive dependency tree.
  repeated string framework = 21;

  // Path to all .xcdatamodel directories required. All directories inside
  // a .xcdatamodeld directory are grouped into XCVersionGroups by the path of
  // the .xcdatamodeld directory.
  repeated string xcdatamodel = 13;

  // Path to all .a libraries to link with this target. When used on static
  // library targets, the library is not actually linked, but it will appear
  // in the Xcode Project Navigator. These are considered to be pre-built
  // libraries. In other words, they are NOT built by Xcode as a dependency
  // before this target is built.
  repeated string imported_library = 14;

  // Path to directories to include as user header search paths. These are non-
  // recursive. These should be specified here rather than in the build_setting
  // field because the build_setting field requires paths to be specified
  // relative to the container of the .xcodeproj directory, while this
  // attribute is relative to the same path as every other path in the control
  // file. These paths correspond to the "-iquote" arguments passed to the
  // compiler.
  repeated string user_header_search_path = 15;

  // Path to directories to include as header search paths. These are non-
  // recursive. These should be specified here rather than in the build_setting
  // field because the build_setting field requires paths to be specified
  // relative to the container of the .xcodeproj directory, while this
  // attribute is relative to the same path as every other path in the control
  // file. These paths correspond to the "-I" arguments passed to the
  // compiler.
  repeated string header_search_path = 16;

  // GCC_PREFIX_HEADER path. Needs to be be specified here rather than in the
  // build_setting field because the build_setting field requires paths to be
  // specified relative to the container of the .xcodeproj directory, while
  // this attribute is relative to the same path as every other path in the
  // control file.
  optional string pch_path = 20;

  // Path to .bundle directories this target depends on. For static library
  // targets, this only causes the bundle to appear in the Project Navigator.
  // For application target, this also causes the bundle to be linked with the
  // application.
  repeated string bundle_import = 17;

  // The product type, for instance "com.apple.product-type.bundle". If
  // omitted, the presence of the infoplist field indicates the type:
  // has infoplist: "com.apple.product-type.application"
  // does not have infoplist: "com.apple.product-type.library.static"
  optional string product_type = 18;

  // SDK .dylib files to link with this target. Each name should not include the
  // the path or the .dylib extension, e.g. "libz" to link in
  // "SDKROOT/usr/lib/libz.dylib". For all targets, this causes the library to
  // appear in the Project Navigator. For binary targets, this causes the
  // library to be linked with the final binary.
  repeated string sdk_dylib = 19;
}

// Represents the mapping of a build setting recognized by Xcode project files,
// for instance ASSETCATALOG_COMPILER_APPICON_NAME.
message XcodeprojBuildSetting {
  optional string name = 1;
  optional string value = 2;
}
