OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "tools/gn/filesystem_utils.h" | 5 #include "tools/gn/filesystem_utils.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 return SourceDir(SourceDir::SWAP_IN, &result); | 679 return SourceDir(SourceDir::SWAP_IN, &result); |
680 } | 680 } |
681 | 681 |
682 SourceDir GetOutputDirForSourceDir(const Settings* settings, | 682 SourceDir GetOutputDirForSourceDir(const Settings* settings, |
683 const SourceDir& source_dir) { | 683 const SourceDir& source_dir) { |
684 return GetOutputDirForSourceDir( | 684 return GetOutputDirForSourceDir( |
685 settings->build_settings(), source_dir, | 685 settings->build_settings(), source_dir, |
686 settings->toolchain_label(), settings->is_default()); | 686 settings->toolchain_label(), settings->is_default()); |
687 } | 687 } |
688 | 688 |
| 689 void AppendFixedAbsolutePathSuffix(const BuildSettings* build_settings, |
| 690 const SourceDir& source_dir, |
| 691 OutputFile* result) { |
| 692 const std::string& build_dir = build_settings->build_dir().value(); |
| 693 |
| 694 if (base::StartsWith(source_dir.value(), build_dir, |
| 695 base::CompareCase::SENSITIVE)) { |
| 696 size_t build_dir_size = build_dir.size(); |
| 697 result->value().append(&source_dir.value()[build_dir_size], |
| 698 source_dir.value().size() - build_dir_size); |
| 699 } else { |
| 700 result->value().append("ABS_PATH"); |
| 701 #if defined(OS_WIN) |
| 702 // Windows absolute path contains ':' after drive letter. Remove it to |
| 703 // avoid inserting ':' in the middle of path (eg. "ABS_PATH/C:/"). |
| 704 std::string src_dir_value = source_dir.value(); |
| 705 const auto colon_pos = src_dir_value.find(':'); |
| 706 if (colon_pos != std::string::npos) |
| 707 src_dir_value.erase(src_dir_value.begin() + colon_pos); |
| 708 #else |
| 709 const std::string& src_dir_value = source_dir.value(); |
| 710 #endif |
| 711 result->value().append(src_dir_value); |
| 712 } |
| 713 } |
| 714 |
689 SourceDir GetOutputDirForSourceDir( | 715 SourceDir GetOutputDirForSourceDir( |
690 const BuildSettings* build_settings, | 716 const BuildSettings* build_settings, |
691 const SourceDir& source_dir, | 717 const SourceDir& source_dir, |
692 const Label& toolchain_label, | 718 const Label& toolchain_label, |
693 bool is_default_toolchain) { | 719 bool is_default_toolchain) { |
694 return GetOutputDirForSourceDirAsOutputFile( | 720 return GetOutputDirForSourceDirAsOutputFile( |
695 build_settings, source_dir, toolchain_label, is_default_toolchain) | 721 build_settings, source_dir, toolchain_label, is_default_toolchain) |
696 .AsSourceDir(build_settings); | 722 .AsSourceDir(build_settings); |
697 } | 723 } |
698 | 724 |
699 OutputFile GetOutputDirForSourceDirAsOutputFile( | 725 OutputFile GetOutputDirForSourceDirAsOutputFile( |
700 const BuildSettings* build_settings, | 726 const BuildSettings* build_settings, |
701 const SourceDir& source_dir, | 727 const SourceDir& source_dir, |
702 const Label& toolchain_label, | 728 const Label& toolchain_label, |
703 bool is_default_toolchain) { | 729 bool is_default_toolchain) { |
704 OutputFile result(GetOutputSubdirName(toolchain_label, is_default_toolchain)); | 730 OutputFile result(GetOutputSubdirName(toolchain_label, is_default_toolchain)); |
705 result.value().append("obj/"); | 731 result.value().append("obj/"); |
706 | 732 |
707 if (source_dir.is_source_absolute()) { | 733 if (source_dir.is_source_absolute()) { |
708 // The source dir is source-absolute, so we trim off the two leading | 734 // The source dir is source-absolute, so we trim off the two leading |
709 // slashes to append to the toolchain object directory. | 735 // slashes to append to the toolchain object directory. |
710 result.value().append(&source_dir.value()[2], | 736 result.value().append(&source_dir.value()[2], |
711 source_dir.value().size() - 2); | 737 source_dir.value().size() - 2); |
712 } else { | 738 } else { |
713 // System-absolute. | 739 // System-absolute. |
714 const std::string& build_dir = build_settings->build_dir().value(); | 740 AppendFixedAbsolutePathSuffix(build_settings, source_dir, &result); |
715 | |
716 if (base::StartsWith(source_dir.value(), build_dir, | |
717 base::CompareCase::SENSITIVE)) { | |
718 size_t build_dir_size = build_dir.size(); | |
719 result.value().append(&source_dir.value()[build_dir_size], | |
720 source_dir.value().size() - build_dir_size); | |
721 } else { | |
722 result.value().append("ABS_PATH"); | |
723 #if defined(OS_WIN) | |
724 // Windows absolute path contains ':' after drive letter. Remove it to | |
725 // avoid inserting ':' in the middle of path (eg. "ABS_PATH/C:/"). | |
726 std::string src_dir_value = source_dir.value(); | |
727 const auto colon_pos = src_dir_value.find(':'); | |
728 if (colon_pos != std::string::npos) | |
729 src_dir_value.erase(src_dir_value.begin() + colon_pos); | |
730 #else | |
731 const std::string& src_dir_value = source_dir.value(); | |
732 #endif | |
733 result.value().append(src_dir_value); | |
734 } | |
735 } | 741 } |
736 return result; | 742 return result; |
737 } | 743 } |
738 | 744 |
739 OutputFile GetOutputDirForSourceDirAsOutputFile(const Settings* settings, | 745 OutputFile GetOutputDirForSourceDirAsOutputFile(const Settings* settings, |
740 const SourceDir& source_dir) { | 746 const SourceDir& source_dir) { |
741 return GetOutputDirForSourceDirAsOutputFile( | 747 return GetOutputDirForSourceDirAsOutputFile( |
742 settings->build_settings(), source_dir, | 748 settings->build_settings(), source_dir, |
743 settings->toolchain_label(), settings->is_default()); | 749 settings->toolchain_label(), settings->is_default()); |
744 } | 750 } |
745 | 751 |
746 SourceDir GetGenDirForSourceDir(const Settings* settings, | 752 SourceDir GetGenDirForSourceDir(const Settings* settings, |
747 const SourceDir& source_dir) { | 753 const SourceDir& source_dir) { |
748 return GetGenDirForSourceDirAsOutputFile(settings, source_dir).AsSourceDir( | 754 return GetGenDirForSourceDirAsOutputFile(settings, source_dir).AsSourceDir( |
749 settings->build_settings()); | 755 settings->build_settings()); |
750 } | 756 } |
751 | 757 |
752 OutputFile GetGenDirForSourceDirAsOutputFile(const Settings* settings, | 758 OutputFile GetGenDirForSourceDirAsOutputFile(const Settings* settings, |
753 const SourceDir& source_dir) { | 759 const SourceDir& source_dir) { |
754 OutputFile result = GetToolchainGenDirAsOutputFile(settings); | 760 OutputFile result = GetToolchainGenDirAsOutputFile(settings); |
755 | 761 |
756 if (source_dir.is_source_absolute()) { | 762 if (source_dir.is_source_absolute()) { |
757 // The source dir should be source-absolute, so we trim off the two leading | 763 // The source dir should be source-absolute, so we trim off the two leading |
758 // slashes to append to the toolchain object directory. | 764 // slashes to append to the toolchain object directory. |
759 DCHECK(source_dir.is_source_absolute()); | 765 DCHECK(source_dir.is_source_absolute()); |
760 result.value().append(&source_dir.value()[2], | 766 result.value().append(&source_dir.value()[2], |
761 source_dir.value().size() - 2); | 767 source_dir.value().size() - 2); |
| 768 } else { |
| 769 // System-absolute. |
| 770 AppendFixedAbsolutePathSuffix(settings->build_settings(), source_dir, |
| 771 &result); |
762 } | 772 } |
763 return result; | 773 return result; |
764 } | 774 } |
765 | 775 |
766 SourceDir GetTargetOutputDir(const Target* target) { | 776 SourceDir GetTargetOutputDir(const Target* target) { |
767 return GetOutputDirForSourceDirAsOutputFile( | 777 return GetOutputDirForSourceDirAsOutputFile( |
768 target->settings(), target->label().dir()).AsSourceDir( | 778 target->settings(), target->label().dir()).AsSourceDir( |
769 target->settings()->build_settings()); | 779 target->settings()->build_settings()); |
770 } | 780 } |
771 | 781 |
(...skipping 14 matching lines...) Expand all Loading... |
786 | 796 |
787 SourceDir GetCurrentOutputDir(const Scope* scope) { | 797 SourceDir GetCurrentOutputDir(const Scope* scope) { |
788 return GetOutputDirForSourceDirAsOutputFile( | 798 return GetOutputDirForSourceDirAsOutputFile( |
789 scope->settings(), scope->GetSourceDir()).AsSourceDir( | 799 scope->settings(), scope->GetSourceDir()).AsSourceDir( |
790 scope->settings()->build_settings()); | 800 scope->settings()->build_settings()); |
791 } | 801 } |
792 | 802 |
793 SourceDir GetCurrentGenDir(const Scope* scope) { | 803 SourceDir GetCurrentGenDir(const Scope* scope) { |
794 return GetGenDirForSourceDir(scope->settings(), scope->GetSourceDir()); | 804 return GetGenDirForSourceDir(scope->settings(), scope->GetSourceDir()); |
795 } | 805 } |
OLD | NEW |