зеркало из https://github.com/microsoft/clang.git
Eliminate CIndexer::getClangPath(), since libclang no longer depends
on the presence of a 'clang' executable. Simplify CIndexer::getClangResourcesPath() a bit. Patch up the CMake makefiles to install headers into two locations in the build tree, for those silly cases where 'clang' will end up looking into the wrong build directory for headers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116260 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
535a55b244
Коммит
d1e6fdb4c5
|
@ -18,21 +18,20 @@ set(files
|
||||||
tmmintrin.h
|
tmmintrin.h
|
||||||
xmmintrin.h)
|
xmmintrin.h)
|
||||||
|
|
||||||
if (MSVC_IDE OR XCODE)
|
set(output_dir ${LLVM_BINARY_DIR}/lib/${CMAKE_CFG_INTDIR}/clang/${CLANG_VERSION}/include)
|
||||||
set(output_dir ${LLVM_BINARY_DIR}/bin/lib/clang/${CLANG_VERSION}/include)
|
|
||||||
else ()
|
# If we are in an IDE that has a configuration directory, we need to
|
||||||
set(output_dir ${LLVM_BINARY_DIR}/lib/clang/${CLANG_VERSION}/include)
|
# create a second copy of the headers so that 'clang' can find them if
|
||||||
endif ()
|
# it's run from the build directory.
|
||||||
|
if(MSVC_IDE OR XCODE)
|
||||||
|
set(other_output_dir ${LLVM_BINARY_DIR}/bin/lib/clang/${CLANG_VERSION}/include)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Generate arm_neon.h
|
# Generate arm_neon.h
|
||||||
set(LLVM_TARGET_DEFINITIONS ${CLANG_SOURCE_DIR}/include/clang/Basic/arm_neon.td)
|
set(LLVM_TARGET_DEFINITIONS ${CLANG_SOURCE_DIR}/include/clang/Basic/arm_neon.td)
|
||||||
tablegen(arm_neon.h.inc -gen-arm-neon)
|
tablegen(arm_neon.h.inc -gen-arm-neon)
|
||||||
|
|
||||||
add_custom_command(OUTPUT ${output_dir}/arm_neon.h
|
set(out_files)
|
||||||
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h.inc
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h.inc ${output_dir}/arm_neon.h
|
|
||||||
COMMENT "Copying clang's arm_neon.h...")
|
|
||||||
|
|
||||||
foreach( f ${files} )
|
foreach( f ${files} )
|
||||||
set( src ${CMAKE_CURRENT_SOURCE_DIR}/${f} )
|
set( src ${CMAKE_CURRENT_SOURCE_DIR}/${f} )
|
||||||
set( dst ${output_dir}/${f} )
|
set( dst ${output_dir}/${f} )
|
||||||
|
@ -40,10 +39,34 @@ foreach( f ${files} )
|
||||||
DEPENDS ${src}
|
DEPENDS ${src}
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
|
||||||
COMMENT "Copying clang's ${f}...")
|
COMMENT "Copying clang's ${f}...")
|
||||||
|
list(APPEND out_files ${dst})
|
||||||
|
|
||||||
|
if(other_output_dir)
|
||||||
|
set(other_dst ${other_output_dir}/${f})
|
||||||
|
add_custom_command(OUTPUT ${other_dst}
|
||||||
|
DEPENDS ${src}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${other_dst}
|
||||||
|
COMMENT "Copying clang's ${f}...")
|
||||||
|
list(APPEND out_files ${other_dst})
|
||||||
|
endif()
|
||||||
endforeach( f )
|
endforeach( f )
|
||||||
|
|
||||||
add_custom_target(clang-headers ALL
|
add_custom_command(OUTPUT ${output_dir}/arm_neon.h
|
||||||
DEPENDS ${files} ${output_dir}/arm_neon.h)
|
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h.inc
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h.inc ${output_dir}/arm_neon.h
|
||||||
|
COMMENT "Copying clang's arm_neon.h...")
|
||||||
|
list(APPEND out_files ${output_dir}/arm_neon.h)
|
||||||
|
|
||||||
|
if (other_output_dir)
|
||||||
|
set(other_dst ${other_output_dir}/arm_neon.h)
|
||||||
|
add_custom_command(OUTPUT ${other_dst}
|
||||||
|
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h.inc
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h.inc ${other_dst}
|
||||||
|
COMMENT "Copying clang's arm_neon.h...")
|
||||||
|
list(APPEND out_files ${other_dst})
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
add_custom_target(clang-headers ALL DEPENDS ${out_files})
|
||||||
|
|
||||||
install(FILES ${files} ${output_dir}/arm_neon.h
|
install(FILES ${files} ${output_dir}/arm_neon.h
|
||||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||||
|
|
|
@ -39,12 +39,12 @@
|
||||||
|
|
||||||
using namespace clang;
|
using namespace clang;
|
||||||
|
|
||||||
const llvm::sys::Path& CIndexer::getClangPath() {
|
std::string CIndexer::getClangResourcesPath() {
|
||||||
// Did we already compute the path?
|
// Did we already compute the path?
|
||||||
if (!ClangPath.empty())
|
if (!ResourcesPath.empty())
|
||||||
return ClangPath;
|
return ResourcesPath.str();
|
||||||
|
|
||||||
// Find the location where this library lives (libCIndex.dylib).
|
// Find the location where this library lives (libclang.dylib).
|
||||||
#ifdef LLVM_ON_WIN32
|
#ifdef LLVM_ON_WIN32
|
||||||
MEMORY_BASIC_INFORMATION mbi;
|
MEMORY_BASIC_INFORMATION mbi;
|
||||||
char path[MAX_PATH];
|
char path[MAX_PATH];
|
||||||
|
@ -52,46 +52,26 @@ const llvm::sys::Path& CIndexer::getClangPath() {
|
||||||
sizeof(mbi));
|
sizeof(mbi));
|
||||||
GetModuleFileNameA((HINSTANCE)mbi.AllocationBase, path, MAX_PATH);
|
GetModuleFileNameA((HINSTANCE)mbi.AllocationBase, path, MAX_PATH);
|
||||||
|
|
||||||
llvm::sys::Path CIndexPath(path);
|
llvm::sys::Path LibClangPath(path);
|
||||||
|
LibClangPath.eraseComponent();
|
||||||
CIndexPath.eraseComponent();
|
|
||||||
CIndexPath.appendComponent("clang");
|
|
||||||
CIndexPath.appendSuffix("exe");
|
|
||||||
CIndexPath.makeAbsolute();
|
|
||||||
#else
|
#else
|
||||||
// This silly cast below avoids a C++ warning.
|
// This silly cast below avoids a C++ warning.
|
||||||
Dl_info info;
|
Dl_info info;
|
||||||
if (dladdr((void *)(uintptr_t)clang_createTranslationUnit, &info) == 0)
|
if (dladdr((void *)(uintptr_t)clang_createTranslationUnit, &info) == 0)
|
||||||
assert(0 && "Call to dladdr() failed");
|
assert(0 && "Call to dladdr() failed");
|
||||||
|
|
||||||
llvm::sys::Path CIndexPath(info.dli_fname);
|
llvm::sys::Path LibClangPath(info.dli_fname);
|
||||||
|
|
||||||
// We now have the CIndex directory, locate clang relative to it.
|
// We now have the CIndex directory, locate clang relative to it.
|
||||||
CIndexPath.eraseComponent();
|
LibClangPath.eraseComponent();
|
||||||
CIndexPath.appendComponent("..");
|
|
||||||
CIndexPath.appendComponent("bin");
|
|
||||||
CIndexPath.appendComponent("clang");
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
LibClangPath.appendComponent("clang");
|
||||||
|
LibClangPath.appendComponent(CLANG_VERSION_STRING);
|
||||||
|
|
||||||
// Cache our result.
|
// Cache our result.
|
||||||
ClangPath = CIndexPath;
|
ResourcesPath = LibClangPath;
|
||||||
return ClangPath;
|
return LibClangPath.str();
|
||||||
}
|
|
||||||
|
|
||||||
std::string CIndexer::getClangResourcesPath() {
|
|
||||||
llvm::sys::Path P = getClangPath();
|
|
||||||
|
|
||||||
if (!P.empty()) {
|
|
||||||
P.eraseComponent(); // Remove /clang from foo/bin/clang
|
|
||||||
P.eraseComponent(); // Remove /bin from foo/bin
|
|
||||||
|
|
||||||
// Get foo/lib/clang/<version>/include
|
|
||||||
P.appendComponent("lib");
|
|
||||||
P.appendComponent("clang");
|
|
||||||
P.appendComponent(CLANG_VERSION_STRING);
|
|
||||||
}
|
|
||||||
|
|
||||||
return P.str();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static llvm::sys::Path GetTemporaryPath() {
|
static llvm::sys::Path GetTemporaryPath() {
|
||||||
|
|
|
@ -31,7 +31,7 @@ class CIndexer {
|
||||||
bool OnlyLocalDecls;
|
bool OnlyLocalDecls;
|
||||||
bool DisplayDiagnostics;
|
bool DisplayDiagnostics;
|
||||||
|
|
||||||
llvm::sys::Path ClangPath;
|
llvm::sys::Path ResourcesPath;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CIndexer() : OnlyLocalDecls(false), DisplayDiagnostics(false) { }
|
CIndexer() : OnlyLocalDecls(false), DisplayDiagnostics(false) { }
|
||||||
|
@ -47,9 +47,6 @@ public:
|
||||||
DisplayDiagnostics = Display;
|
DisplayDiagnostics = Display;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \brief Get the path of the clang binary.
|
|
||||||
const llvm::sys::Path& getClangPath();
|
|
||||||
|
|
||||||
/// \brief Get the path of the clang resource files.
|
/// \brief Get the path of the clang resource files.
|
||||||
std::string getClangResourcesPath();
|
std::string getClangResourcesPath();
|
||||||
};
|
};
|
||||||
|
|
Загрузка…
Ссылка в новой задаче