Search in sources :

Example 1 with DebugPathSanitizer

use of com.facebook.buck.cxx.DebugPathSanitizer in project buck by facebook.

the class AppleCxxPlatforms method buildWithExecutableChecker.

@VisibleForTesting
static AppleCxxPlatform buildWithExecutableChecker(ProjectFilesystem filesystem, AppleSdk targetSdk, String minVersion, String targetArchitecture, final AppleSdkPaths sdkPaths, BuckConfig buckConfig, AppleConfig appleConfig, ExecutableFinder executableFinder, Optional<ProcessExecutor> processExecutor, Optional<AppleToolchain> swiftToolChain) {
    AppleCxxPlatform.Builder platformBuilder = AppleCxxPlatform.builder();
    ImmutableList.Builder<Path> toolSearchPathsBuilder = ImmutableList.builder();
    // Search for tools from most specific to least specific.
    toolSearchPathsBuilder.add(sdkPaths.getSdkPath().resolve(USR_BIN)).add(sdkPaths.getSdkPath().resolve("Developer").resolve(USR_BIN)).add(sdkPaths.getPlatformPath().resolve("Developer").resolve(USR_BIN));
    for (Path toolchainPath : sdkPaths.getToolchainPaths()) {
        toolSearchPathsBuilder.add(toolchainPath.resolve(USR_BIN));
    }
    if (sdkPaths.getDeveloperPath().isPresent()) {
        toolSearchPathsBuilder.add(sdkPaths.getDeveloperPath().get().resolve(USR_BIN));
        toolSearchPathsBuilder.add(sdkPaths.getDeveloperPath().get().resolve("Tools"));
    }
    // TODO(bhamiltoncx): Add more and better cflags.
    ImmutableList.Builder<String> cflagsBuilder = ImmutableList.builder();
    cflagsBuilder.add("-isysroot", sdkPaths.getSdkPath().toString());
    cflagsBuilder.add("-iquote", filesystem.getRootPath().toString());
    cflagsBuilder.add("-arch", targetArchitecture);
    cflagsBuilder.add(targetSdk.getApplePlatform().getMinVersionFlagPrefix() + minVersion);
    if (targetSdk.getApplePlatform().equals(ApplePlatform.WATCHOS)) {
        cflagsBuilder.add("-fembed-bitcode");
    }
    ImmutableList.Builder<String> ldflagsBuilder = ImmutableList.builder();
    ldflagsBuilder.addAll(Linkers.iXlinker("-sdk_version", targetSdk.getVersion(), "-ObjC"));
    if (targetSdk.getApplePlatform().equals(ApplePlatform.WATCHOS)) {
        ldflagsBuilder.addAll(Linkers.iXlinker("-bitcode_verify", "-bitcode_hide_symbols", "-bitcode_symbol_map"));
    }
    // Populate Xcode version keys from Xcode's own Info.plist if available.
    Optional<String> xcodeBuildVersion = Optional.empty();
    Optional<Path> developerPath = sdkPaths.getDeveloperPath();
    if (developerPath.isPresent()) {
        Path xcodeBundlePath = developerPath.get().getParent();
        if (xcodeBundlePath != null) {
            File xcodeInfoPlistPath = xcodeBundlePath.resolve("Info.plist").toFile();
            try {
                NSDictionary parsedXcodeInfoPlist = (NSDictionary) PropertyListParser.parse(xcodeInfoPlistPath);
                NSObject xcodeVersionObject = parsedXcodeInfoPlist.objectForKey("DTXcode");
                if (xcodeVersionObject != null) {
                    Optional<String> xcodeVersion = Optional.of(xcodeVersionObject.toString());
                    platformBuilder.setXcodeVersion(xcodeVersion);
                }
            } catch (IOException e) {
                LOG.warn("Error reading Xcode's info plist %s; ignoring Xcode versions", xcodeInfoPlistPath);
            } catch (PropertyListFormatException | ParseException | ParserConfigurationException | SAXException e) {
                LOG.warn("Error in parsing %s; ignoring Xcode versions", xcodeInfoPlistPath);
            }
        }
        // different than the build number in the Info.plist, sigh.
        if (processExecutor.isPresent()) {
            xcodeBuildVersion = appleConfig.getXcodeBuildVersionSupplier(developerPath.get(), processExecutor.get()).get();
            platformBuilder.setXcodeBuildVersion(xcodeBuildVersion);
            LOG.debug("Xcode build version is: " + xcodeBuildVersion.orElse("<absent>"));
        }
    }
    ImmutableList.Builder<String> versions = ImmutableList.builder();
    versions.add(targetSdk.getVersion());
    ImmutableList<String> toolchainVersions = targetSdk.getToolchains().stream().map(AppleToolchain::getVersion).flatMap(Optionals::toStream).collect(MoreCollectors.toImmutableList());
    if (toolchainVersions.isEmpty()) {
        if (!xcodeBuildVersion.isPresent()) {
            throw new HumanReadableException("Failed to read toolchain versions and Xcode version.");
        }
        versions.add(xcodeBuildVersion.get());
    } else {
        versions.addAll(toolchainVersions);
    }
    String version = Joiner.on(':').join(versions.build());
    ImmutableList<Path> toolSearchPaths = toolSearchPathsBuilder.build();
    Tool clangPath = VersionedTool.of(getToolPath("clang", toolSearchPaths, executableFinder), "apple-clang", version);
    Tool clangXxPath = VersionedTool.of(getToolPath("clang++", toolSearchPaths, executableFinder), "apple-clang++", version);
    Tool ar = VersionedTool.of(getToolPath("ar", toolSearchPaths, executableFinder), "apple-ar", version);
    Tool ranlib = VersionedTool.builder().setPath(getToolPath("ranlib", toolSearchPaths, executableFinder)).setName("apple-ranlib").setVersion(version).build();
    Tool strip = VersionedTool.of(getToolPath("strip", toolSearchPaths, executableFinder), "apple-strip", version);
    Tool nm = VersionedTool.of(getToolPath("nm", toolSearchPaths, executableFinder), "apple-nm", version);
    Tool actool = VersionedTool.of(getToolPath("actool", toolSearchPaths, executableFinder), "apple-actool", version);
    Tool ibtool = VersionedTool.of(getToolPath("ibtool", toolSearchPaths, executableFinder), "apple-ibtool", version);
    Tool momc = VersionedTool.of(getToolPath("momc", toolSearchPaths, executableFinder), "apple-momc", version);
    Tool xctest = VersionedTool.of(getToolPath("xctest", toolSearchPaths, executableFinder), "apple-xctest", version);
    Tool dsymutil = VersionedTool.of(getToolPath("dsymutil", toolSearchPaths, executableFinder), "apple-dsymutil", version);
    Tool lipo = VersionedTool.of(getToolPath("lipo", toolSearchPaths, executableFinder), "apple-lipo", version);
    Tool lldb = VersionedTool.of(getToolPath("lldb", toolSearchPaths, executableFinder), "lldb", version);
    Optional<Path> stubBinaryPath = targetSdk.getApplePlatform().getStubBinaryPath().map(input -> sdkPaths.getSdkPath().resolve(input));
    CxxBuckConfig config = new CxxBuckConfig(buckConfig);
    UserFlavor targetFlavor = UserFlavor.of(Flavor.replaceInvalidCharacters(targetSdk.getName() + "-" + targetArchitecture), String.format("SDK: %s, architecture: %s", targetSdk.getName(), targetArchitecture));
    ImmutableBiMap.Builder<Path, Path> sanitizerPaths = ImmutableBiMap.builder();
    sanitizerPaths.put(sdkPaths.getSdkPath(), Paths.get("APPLE_SDKROOT"));
    sanitizerPaths.put(sdkPaths.getPlatformPath(), Paths.get("APPLE_PLATFORM_DIR"));
    if (sdkPaths.getDeveloperPath().isPresent()) {
        sanitizerPaths.put(sdkPaths.getDeveloperPath().get(), Paths.get("APPLE_DEVELOPER_DIR"));
    }
    DebugPathSanitizer compilerDebugPathSanitizer = new PrefixMapDebugPathSanitizer(config.getDebugPathSanitizerLimit(), File.separatorChar, Paths.get("."), sanitizerPaths.build(), filesystem.getRootPath().toAbsolutePath(), CxxToolProvider.Type.CLANG, filesystem);
    DebugPathSanitizer assemblerDebugPathSanitizer = new MungingDebugPathSanitizer(config.getDebugPathSanitizerLimit(), File.separatorChar, Paths.get("."), sanitizerPaths.build());
    ImmutableList<String> cflags = cflagsBuilder.build();
    ImmutableMap.Builder<String, String> macrosBuilder = ImmutableMap.builder();
    macrosBuilder.put("SDKROOT", sdkPaths.getSdkPath().toString());
    macrosBuilder.put("PLATFORM_DIR", sdkPaths.getPlatformPath().toString());
    macrosBuilder.put("CURRENT_ARCH", targetArchitecture);
    if (sdkPaths.getDeveloperPath().isPresent()) {
        macrosBuilder.put("DEVELOPER_DIR", sdkPaths.getDeveloperPath().get().toString());
    }
    ImmutableMap<String, String> macros = macrosBuilder.build();
    Optional<String> buildVersion = Optional.empty();
    Path platformVersionPlistPath = sdkPaths.getPlatformPath().resolve("version.plist");
    try (InputStream versionPlist = Files.newInputStream(platformVersionPlistPath)) {
        NSDictionary versionInfo = (NSDictionary) PropertyListParser.parse(versionPlist);
        if (versionInfo != null) {
            NSObject productBuildVersion = versionInfo.objectForKey("ProductBuildVersion");
            if (productBuildVersion != null) {
                buildVersion = Optional.of(productBuildVersion.toString());
            } else {
                LOG.warn("In %s, missing ProductBuildVersion. Build version will be unset for this platform.", platformVersionPlistPath);
            }
        } else {
            LOG.warn("Empty version plist in %s. Build version will be unset for this platform.", platformVersionPlistPath);
        }
    } catch (NoSuchFileException e) {
        LOG.warn("%s does not exist. Build version will be unset for this platform.", platformVersionPlistPath);
    } catch (PropertyListFormatException | SAXException | ParserConfigurationException | ParseException | IOException e) {
        // Some other error occurred, print the exception since it may contain error details.
        LOG.warn(e, "Failed to parse %s. Build version will be unset for this platform.", platformVersionPlistPath);
    }
    PreprocessorProvider aspp = new PreprocessorProvider(new ConstantToolProvider(clangPath), CxxToolProvider.Type.CLANG);
    CompilerProvider as = new CompilerProvider(new ConstantToolProvider(clangPath), CxxToolProvider.Type.CLANG);
    PreprocessorProvider cpp = new PreprocessorProvider(new ConstantToolProvider(clangPath), CxxToolProvider.Type.CLANG);
    CompilerProvider cc = new CompilerProvider(new ConstantToolProvider(clangPath), CxxToolProvider.Type.CLANG);
    PreprocessorProvider cxxpp = new PreprocessorProvider(new ConstantToolProvider(clangXxPath), CxxToolProvider.Type.CLANG);
    CompilerProvider cxx = new CompilerProvider(new ConstantToolProvider(clangXxPath), CxxToolProvider.Type.CLANG);
    ImmutableList.Builder<String> whitelistBuilder = ImmutableList.builder();
    whitelistBuilder.add("^" + Pattern.quote(sdkPaths.getSdkPath().toString()) + "\\/.*");
    whitelistBuilder.add("^" + Pattern.quote(sdkPaths.getPlatformPath().toString() + "/Developer/Library/Frameworks") + "\\/.*");
    for (Path toolchainPath : sdkPaths.getToolchainPaths()) {
        LOG.debug("Apple toolchain path: %s", toolchainPath);
        try {
            whitelistBuilder.add("^" + Pattern.quote(toolchainPath.toRealPath().toString()) + "\\/.*");
        } catch (IOException e) {
            LOG.warn(e, "Apple toolchain path could not be resolved: %s", toolchainPath);
        }
    }
    HeaderVerification headerVerification = config.getHeaderVerification().withPlatformWhitelist(whitelistBuilder.build());
    LOG.debug("Headers verification platform whitelist: %s", headerVerification.getPlatformWhitelist());
    CxxPlatform cxxPlatform = CxxPlatforms.build(targetFlavor, Platform.MACOS, config, as, aspp, cc, cxx, cpp, cxxpp, new DefaultLinkerProvider(LinkerProvider.Type.DARWIN, new ConstantToolProvider(clangXxPath)), ImmutableList.<String>builder().addAll(cflags).addAll(ldflagsBuilder.build()).build(), strip, new BsdArchiver(ar), ranlib, new PosixNmSymbolNameTool(nm), cflagsBuilder.build(), ImmutableList.of(), cflags, ImmutableList.of(), "dylib", "%s.dylib", "a", "o", compilerDebugPathSanitizer, assemblerDebugPathSanitizer, macros, Optional.empty(), headerVerification);
    ApplePlatform applePlatform = targetSdk.getApplePlatform();
    ImmutableList.Builder<Path> swiftOverrideSearchPathBuilder = ImmutableList.builder();
    AppleSdkPaths.Builder swiftSdkPathsBuilder = AppleSdkPaths.builder().from(sdkPaths);
    if (swiftToolChain.isPresent()) {
        swiftOverrideSearchPathBuilder.add(swiftToolChain.get().getPath().resolve(USR_BIN));
        swiftSdkPathsBuilder.setToolchainPaths(ImmutableList.of(swiftToolChain.get().getPath()));
    }
    Optional<SwiftPlatform> swiftPlatform = getSwiftPlatform(applePlatform.getName(), targetArchitecture + "-apple-" + applePlatform.getSwiftName().orElse(applePlatform.getName()) + minVersion, version, swiftSdkPathsBuilder.build(), swiftOverrideSearchPathBuilder.addAll(toolSearchPaths).build(), executableFinder);
    platformBuilder.setCxxPlatform(cxxPlatform).setSwiftPlatform(swiftPlatform).setAppleSdk(targetSdk).setAppleSdkPaths(sdkPaths).setMinVersion(minVersion).setBuildVersion(buildVersion).setActool(actool).setIbtool(ibtool).setMomc(momc).setCopySceneKitAssets(getOptionalTool("copySceneKitAssets", toolSearchPaths, executableFinder, version)).setXctest(xctest).setDsymutil(dsymutil).setLipo(lipo).setStubBinary(stubBinaryPath).setLldb(lldb).setCodesignAllocate(getOptionalTool("codesign_allocate", toolSearchPaths, executableFinder, version)).setCodesignProvider(appleConfig.getCodesignProvider());
    return platformBuilder.build();
}
Also used : NSDictionary(com.dd.plist.NSDictionary) NoSuchFileException(java.nio.file.NoSuchFileException) CompilerProvider(com.facebook.buck.cxx.CompilerProvider) SAXException(org.xml.sax.SAXException) DefaultLinkerProvider(com.facebook.buck.cxx.DefaultLinkerProvider) MungingDebugPathSanitizer(com.facebook.buck.cxx.MungingDebugPathSanitizer) DebugPathSanitizer(com.facebook.buck.cxx.DebugPathSanitizer) PrefixMapDebugPathSanitizer(com.facebook.buck.cxx.PrefixMapDebugPathSanitizer) VersionedTool(com.facebook.buck.rules.VersionedTool) PosixNmSymbolNameTool(com.facebook.buck.cxx.PosixNmSymbolNameTool) Tool(com.facebook.buck.rules.Tool) BsdArchiver(com.facebook.buck.cxx.BsdArchiver) MungingDebugPathSanitizer(com.facebook.buck.cxx.MungingDebugPathSanitizer) ImmutableMap(com.google.common.collect.ImmutableMap) PropertyListFormatException(com.dd.plist.PropertyListFormatException) ImmutableBiMap(com.google.common.collect.ImmutableBiMap) PreprocessorProvider(com.facebook.buck.cxx.PreprocessorProvider) File(java.io.File) PosixNmSymbolNameTool(com.facebook.buck.cxx.PosixNmSymbolNameTool) SwiftPlatform(com.facebook.buck.swift.SwiftPlatform) NSObject(com.dd.plist.NSObject) ConstantToolProvider(com.facebook.buck.rules.ConstantToolProvider) ImmutableList(com.google.common.collect.ImmutableList) HeaderVerification(com.facebook.buck.cxx.HeaderVerification) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) Path(java.nio.file.Path) PrefixMapDebugPathSanitizer(com.facebook.buck.cxx.PrefixMapDebugPathSanitizer) CxxPlatform(com.facebook.buck.cxx.CxxPlatform) InputStream(java.io.InputStream) IOException(java.io.IOException) CxxBuckConfig(com.facebook.buck.cxx.CxxBuckConfig) HumanReadableException(com.facebook.buck.util.HumanReadableException) UserFlavor(com.facebook.buck.model.UserFlavor) ParseException(java.text.ParseException) VisibleForTesting(com.google.common.annotations.VisibleForTesting)

Example 2 with DebugPathSanitizer

use of com.facebook.buck.cxx.DebugPathSanitizer in project buck by facebook.

the class CompDirReplacerIntegrationTest method runCompDirReplacerWithPlatformFlavor.

private void runCompDirReplacerWithPlatformFlavor(Flavor platformFlavor) throws IOException, InterruptedException {
    assumeTrue(Platform.detect() == Platform.MACOS);
    ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario(this, "apple_binary_with_platform", tmp);
    workspace.setUp();
    BuildTarget target = BuildTargetFactory.newInstance("//Apps/TestApp:TestApp").withAppendedFlavors(platformFlavor);
    ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("build", "--config", "cxx.cflags=-g", target.getFullyQualifiedName());
    result.assertSuccess();
    Path sanitizedObjectFilePath = workspace.getPath(BuildTargets.getGenPath(filesystem, target.withFlavors(platformFlavor, InternalFlavor.of("compile-" + sanitize("main.c.o"))), "%s").resolve("main.c.o"));
    Path unsanizitedObjectFilePath = workspace.getPath(filesystem.getBuckPaths().getScratchDir().resolve(Paths.get("unsanitized.main.c.o")));
    // this was stolen from the implementation detail of AppleCxxPlatforms
    DebugPathSanitizer sanitizer = new MungingDebugPathSanitizer(250, File.separatorChar, Paths.get("."), ImmutableBiMap.of());
    String oldCompDirValue = sanitizer.getCompilationDirectory();
    String newCompDirValue = workspace.getDestPath().toString();
    result = workspace.runBuckCommand("machoutils", "fix_compdir", "--binary", sanitizedObjectFilePath.toString(), "--output", unsanizitedObjectFilePath.toString(), "--old_compdir", oldCompDirValue, "--new_compdir", newCompDirValue);
    result.assertSuccess();
    ProcessExecutor.Result sanitizedResult = workspace.runCommand("dwarfdump", sanitizedObjectFilePath.toString());
    ProcessExecutor.Result unsanitizedResult = workspace.runCommand("dwarfdump", unsanizitedObjectFilePath.toString());
    assertThat(sanitizedResult.getStdout().orElse(""), containsString("AT_comp_dir( \"./////////////////////////////"));
    assertThat(unsanitizedResult.getStdout().orElse(""), not(containsString("AT_comp_dir( \"./////////////////////////////")));
    assertThat(unsanitizedResult.getStdout().orElse(""), containsString("AT_comp_dir( \"" + newCompDirValue));
}
Also used : Path(java.nio.file.Path) ProjectWorkspace(com.facebook.buck.testutil.integration.ProjectWorkspace) MungingDebugPathSanitizer(com.facebook.buck.cxx.MungingDebugPathSanitizer) BuildTarget(com.facebook.buck.model.BuildTarget) MungingDebugPathSanitizer(com.facebook.buck.cxx.MungingDebugPathSanitizer) DebugPathSanitizer(com.facebook.buck.cxx.DebugPathSanitizer) Matchers.containsString(org.hamcrest.Matchers.containsString) ProcessExecutor(com.facebook.buck.util.ProcessExecutor)

Example 3 with DebugPathSanitizer

use of com.facebook.buck.cxx.DebugPathSanitizer in project buck by facebook.

the class ObjectPathsAbsolutifierIntegrationTest method testAbsolutifyingPathsPreservesCodeSignature.

@Test
public void testAbsolutifyingPathsPreservesCodeSignature() throws Exception {
    assumeTrue(Platform.detect() == Platform.MACOS);
    assumeTrue(FakeAppleDeveloperEnvironment.supportsCodeSigning());
    ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario(this, "simple_application_bundle_with_codesigning", tmp);
    workspace.setUp();
    BuildTarget target = workspace.newBuildTarget("//:DemoApp#iphoneos-arm64,dwarf");
    workspace.runBuckCommand("build", "--config", "cxx.cflags=-g", target.getFullyQualifiedName()).assertSuccess();
    workspace.verify(Paths.get("DemoApp_output.expected"), BuildTargets.getGenPath(filesystem, BuildTarget.builder(target).addFlavors(AppleDescriptions.NO_INCLUDE_FRAMEWORKS_FLAVOR).build(), "%s"));
    Path appPath = workspace.getPath(BuildTargets.getGenPath(filesystem, BuildTarget.builder(target).addFlavors(AppleDescriptions.NO_INCLUDE_FRAMEWORKS_FLAVOR).build(), "%s").resolve(target.getShortName() + ".app"));
    Path sanitizedBinaryPath = appPath.resolve(target.getShortName());
    assertThat(Files.exists(sanitizedBinaryPath), equalTo(true));
    assertThat(checkCodeSigning(sanitizedBinaryPath), equalTo(true));
    assertThat(checkCodeSigning(appPath), equalTo(true));
    Path unsanizitedBinaryPath = workspace.getPath(filesystem.getBuckPaths().getTmpDir().resolve(sanitizedBinaryPath.getParent().getFileName()).resolve(sanitizedBinaryPath.getFileName()));
    filesystem.mkdirs(unsanizitedBinaryPath.getParent());
    // copy bundle
    MoreFiles.copyRecursively(sanitizedBinaryPath.getParent(), unsanizitedBinaryPath.getParent());
    DebugPathSanitizer sanitizer = getDebugPathSanitizer();
    String oldCompDirValue = sanitizer.getCompilationDirectory();
    String newCompDirValue = workspace.getDestPath().toString();
    ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("machoutils", "absolutify_object_paths", "--binary", sanitizedBinaryPath.toString(), "--output", unsanizitedBinaryPath.toString(), "--old_compdir", oldCompDirValue, "--new_compdir", newCompDirValue);
    result.assertSuccess();
    assertThat(Files.exists(unsanizitedBinaryPath), equalTo(true));
    // of course signature should be broken
    assertThat(checkCodeSigning(unsanizitedBinaryPath), equalTo(false));
    // but it should stay unchanged from what is used to be
    assertThat(checkCodeSignatureMatchesBetweenFiles(unsanizitedBinaryPath, sanitizedBinaryPath), equalTo(true));
}
Also used : Path(java.nio.file.Path) ProjectWorkspace(com.facebook.buck.testutil.integration.ProjectWorkspace) BuildTarget(com.facebook.buck.model.BuildTarget) MungingDebugPathSanitizer(com.facebook.buck.cxx.MungingDebugPathSanitizer) DebugPathSanitizer(com.facebook.buck.cxx.DebugPathSanitizer) Matchers.containsString(org.hamcrest.Matchers.containsString) Test(org.junit.Test)

Example 4 with DebugPathSanitizer

use of com.facebook.buck.cxx.DebugPathSanitizer in project buck by facebook.

the class ObjectPathsAbsolutifierIntegrationTest method runAndCheckAbsolutificationWithPlatformFlavor.

private void runAndCheckAbsolutificationWithPlatformFlavor(Flavor platformFlavor) throws IOException, InterruptedException {
    assumeTrue(Platform.detect() == Platform.MACOS);
    ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario(this, "apple_binary_with_platform", tmp);
    workspace.setUp();
    BuildTarget target = BuildTargetFactory.newInstance("//Apps/TestApp:TestApp").withAppendedFlavors(platformFlavor);
    ProjectWorkspace.ProcessResult result = workspace.runBuckCommand("build", "--config", "cxx.cflags=-g", target.getFullyQualifiedName());
    result.assertSuccess();
    Path relativeSanitizedObjectFilePath = BuildTargets.getGenPath(filesystem, target.withFlavors(platformFlavor, InternalFlavor.of("compile-" + sanitize("main.c.o"))), "%s").resolve("main.c.o");
    Path relativeSourceFilePath = Paths.get("Apps/TestApp/main.c");
    Path sanitizedBinaryPath = workspace.getPath(BuildTargets.getGenPath(filesystem, target.withFlavors(platformFlavor), "%s"));
    Path unsanizitedBinaryPath = workspace.getPath(filesystem.getBuckPaths().getScratchDir().resolve(sanitizedBinaryPath.getFileName()));
    // this was stolen from the implementation detail of AppleCxxPlatforms
    DebugPathSanitizer sanitizer = getDebugPathSanitizer();
    String oldCompDirValue = sanitizer.getCompilationDirectory();
    String newCompDirValue = workspace.getDestPath().toString();
    result = workspace.runBuckCommand("machoutils", "absolutify_object_paths", "--binary", sanitizedBinaryPath.toString(), "--output", unsanizitedBinaryPath.toString(), "--old_compdir", oldCompDirValue, "--new_compdir", newCompDirValue);
    result.assertSuccess();
    ProcessExecutor.Result sanitizedResult = workspace.runCommand("nm", "-a", sanitizedBinaryPath.toString());
    ProcessExecutor.Result unsanitizedResult = workspace.runCommand("nm", "-a", unsanizitedBinaryPath.toString());
    String sanitizedOutput = sanitizedResult.getStdout().orElse("");
    String unsanitizedOutput = unsanitizedResult.getStdout().orElse("");
    // check that weird buck comp dir is not present anymore
    assertThat(sanitizedOutput, containsString("SO .///////////////////////////////////////////////////////////////"));
    assertThat(unsanitizedOutput, not(containsString("SO .///////////////////////////////////////////////////////////////")));
    // check that relative path to object file is not present anymore
    assertThat(sanitizedOutput, containsString("OSO ./buck-out"));
    assertThat(unsanitizedOutput, not(containsString("OSO ./buck-out")));
    // check that relative path to source file is not present anymore
    assertThat(sanitizedOutput, containsString("SOL Apps/TestApp/main.c"));
    assertThat(unsanitizedOutput, not(containsString("SOL Apps/TestApp/main.c")));
    // check that absolute path to source file is correct
    assertThat(unsanitizedOutput, containsString("SOL " + newCompDirValue + "/Apps/TestApp/main.c"));
    // check that absolute path to object file is correct
    assertThat(unsanitizedOutput, containsString("OSO " + newCompDirValue + "/buck-out/bin/" + relativeSanitizedObjectFilePath.toString()));
    assertThat(unsanitizedOutput, containsString("SO " + newCompDirValue + "/" + relativeSourceFilePath.getParent().toString()));
    assertThat(unsanitizedOutput, containsString("SOL " + newCompDirValue + "/" + relativeSourceFilePath.toString()));
}
Also used : Path(java.nio.file.Path) ProjectWorkspace(com.facebook.buck.testutil.integration.ProjectWorkspace) BuildTarget(com.facebook.buck.model.BuildTarget) MungingDebugPathSanitizer(com.facebook.buck.cxx.MungingDebugPathSanitizer) DebugPathSanitizer(com.facebook.buck.cxx.DebugPathSanitizer) Matchers.containsString(org.hamcrest.Matchers.containsString) ProcessExecutor(com.facebook.buck.util.ProcessExecutor) DefaultProcessExecutor(com.facebook.buck.util.DefaultProcessExecutor)

Aggregations

DebugPathSanitizer (com.facebook.buck.cxx.DebugPathSanitizer)4 MungingDebugPathSanitizer (com.facebook.buck.cxx.MungingDebugPathSanitizer)4 Path (java.nio.file.Path)4 BuildTarget (com.facebook.buck.model.BuildTarget)3 ProjectWorkspace (com.facebook.buck.testutil.integration.ProjectWorkspace)3 Matchers.containsString (org.hamcrest.Matchers.containsString)3 ProcessExecutor (com.facebook.buck.util.ProcessExecutor)2 NSDictionary (com.dd.plist.NSDictionary)1 NSObject (com.dd.plist.NSObject)1 PropertyListFormatException (com.dd.plist.PropertyListFormatException)1 BsdArchiver (com.facebook.buck.cxx.BsdArchiver)1 CompilerProvider (com.facebook.buck.cxx.CompilerProvider)1 CxxBuckConfig (com.facebook.buck.cxx.CxxBuckConfig)1 CxxPlatform (com.facebook.buck.cxx.CxxPlatform)1 DefaultLinkerProvider (com.facebook.buck.cxx.DefaultLinkerProvider)1 HeaderVerification (com.facebook.buck.cxx.HeaderVerification)1 PosixNmSymbolNameTool (com.facebook.buck.cxx.PosixNmSymbolNameTool)1 PrefixMapDebugPathSanitizer (com.facebook.buck.cxx.PrefixMapDebugPathSanitizer)1 PreprocessorProvider (com.facebook.buck.cxx.PreprocessorProvider)1 UserFlavor (com.facebook.buck.model.UserFlavor)1