aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java
diff options
context:
space:
mode:
authorGravatar Cal Peyser <cpeyser@google.com>2016-11-15 20:21:38 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2016-11-16 15:56:43 +0000
commit5bb4ff6886450217f00765c7ed19055ff08e9568 (patch)
tree0e6c8a00d58e6f26283a9fb116b450c6f3a7f7f1 /src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java
parent60751d02cf9e2d78ab5d4bf9fee0006b8adcf453 (diff)
Implement basic objc executable linking in the CROSSTOOL.
The following link features are *not* implemented yet: 1) Objc++ linking semantics 2) Dead stripping 3) --should_prioritize_static_libs 4) DSYM generation 5) Coverage support 6) Swift interop 7) Linkmap -- MOS_MIGRATED_REVID=139232434
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java58
1 files changed, 48 insertions, 10 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java
index ec51c8413f..74f33ab913 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java
@@ -103,6 +103,14 @@ public abstract class Link {
STATIC,
DYNAMIC
}
+
+ /**
+ * Whether a particular link target is executable.
+ */
+ public enum Executable {
+ EXECUTABLE,
+ NOT_EXECUTABLE
+ }
/**
* Types of ELF files that can be created by the linker (.a, .so, .lo,
@@ -115,7 +123,8 @@ public abstract class Link {
Staticness.STATIC,
"c++-link-static-library",
Picness.NOPIC,
- ArtifactCategory.STATIC_LIBRARY),
+ ArtifactCategory.STATIC_LIBRARY,
+ Executable.NOT_EXECUTABLE),
/** An objc static archive. */
OBJC_ARCHIVE(
@@ -123,19 +132,35 @@ public abstract class Link {
Staticness.STATIC,
"objc-archive",
Picness.NOPIC,
- ArtifactCategory.STATIC_LIBRARY),
+ ArtifactCategory.STATIC_LIBRARY,
+ Executable.NOT_EXECUTABLE),
/** An objc fully linked static archive. */
OBJC_FULLY_LINKED_ARCHIVE(
- ".a", Staticness.STATIC, "objc-fully-link", Picness.NOPIC, ArtifactCategory.STATIC_LIBRARY),
+ ".a",
+ Staticness.STATIC,
+ "objc-fully-link",
+ Picness.NOPIC,
+ ArtifactCategory.STATIC_LIBRARY,
+ Executable.NOT_EXECUTABLE),
+ /** An objc executable. */
+ OBJC_EXECUTABLE(
+ "",
+ Staticness.STATIC,
+ "objc-executable",
+ Picness.NOPIC,
+ ArtifactCategory.EXECUTABLE,
+ Executable.EXECUTABLE),
+
/** A static archive with .pic.o object files (compiled with -fPIC). */
PIC_STATIC_LIBRARY(
".pic.a",
Staticness.STATIC,
"c++-link-pic-static-library",
Picness.PIC,
- ArtifactCategory.STATIC_LIBRARY),
+ ArtifactCategory.STATIC_LIBRARY,
+ Executable.NOT_EXECUTABLE),
/** An interface dynamic library. */
INTERFACE_DYNAMIC_LIBRARY(
@@ -143,7 +168,8 @@ public abstract class Link {
Staticness.DYNAMIC,
"c++-link-interface-dynamic-library",
Picness.NOPIC, // Actually PIC but it's not indicated in the file name
- ArtifactCategory.INTERFACE_LIBRARY),
+ ArtifactCategory.INTERFACE_LIBRARY,
+ Executable.NOT_EXECUTABLE),
/** A dynamic library. */
DYNAMIC_LIBRARY(
@@ -151,7 +177,8 @@ public abstract class Link {
Staticness.DYNAMIC,
"c++-link-dynamic-library",
Picness.NOPIC, // Actually PIC but it's not indicated in the file name
- ArtifactCategory.DYNAMIC_LIBRARY),
+ ArtifactCategory.DYNAMIC_LIBRARY,
+ Executable.NOT_EXECUTABLE),
/** A static archive without removal of unused object files. */
ALWAYS_LINK_STATIC_LIBRARY(
@@ -159,7 +186,8 @@ public abstract class Link {
Staticness.STATIC,
"c++-link-alwayslink-static-library",
Picness.NOPIC,
- ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY),
+ ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY,
+ Executable.NOT_EXECUTABLE),
/** A PIC static archive without removal of unused object files. */
ALWAYS_LINK_PIC_STATIC_LIBRARY(
@@ -167,7 +195,8 @@ public abstract class Link {
Staticness.STATIC,
"c++-link-alwayslink-pic-static-library",
Picness.PIC,
- ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY),
+ ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY,
+ Executable.NOT_EXECUTABLE),
/** An executable binary. */
EXECUTABLE(
@@ -175,25 +204,29 @@ public abstract class Link {
Staticness.DYNAMIC,
"c++-link-executable",
Picness.NOPIC, // Picness is not indicate in the file name
- ArtifactCategory.EXECUTABLE);
+ ArtifactCategory.EXECUTABLE,
+ Executable.EXECUTABLE);
private final String extension;
private final Staticness staticness;
private final String actionName;
private final ArtifactCategory linkerOutput;
private final Picness picness;
+ private final Executable executable;
LinkTargetType(
String extension,
Staticness staticness,
String actionName,
Picness picness,
- ArtifactCategory linkerOutput) {
+ ArtifactCategory linkerOutput,
+ Executable executable) {
this.extension = extension;
this.staticness = staticness;
this.actionName = actionName;
this.linkerOutput = linkerOutput;
this.picness = picness;
+ this.executable = executable;
}
/**
@@ -223,6 +256,11 @@ public abstract class Link {
public String getActionName() {
return actionName;
}
+
+ /** Returns true iff this link type is executable */
+ public boolean isExecutable() {
+ return (executable == Executable.EXECUTABLE);
+ }
}
/**