From cb0f2e7e6ac936c6be3cee37ea41db9c03f33e3a Mon Sep 17 00:00:00 2001 From: Kai Nacke Date: Sun, 15 May 2016 01:47:14 +0200 Subject: [PATCH] Fix space handling for different paths. E.g. on my machine LLVM is installed in folder C:\My Program Files\LLVM. Fixes part of issue #1465. (PR 1466 is required for complete fix.) --- CMakeLists.txt | 28 +++++++++++++--------------- cmake/Modules/FindLLVM.cmake | 2 +- driver/configfile.cpp | 8 ++++++-- utils/gen_gccbuiltins.cpp | 8 ++++++-- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8797e4d8ed..6cfff40e20 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -235,9 +235,8 @@ string(REPLACE "-Werror " "" LLVM_CXXFLAGS ${LLVM_CXXFLAGS}) if (UNIX AND NOT "${LLVM_LDFLAGS}" STREQUAL "") # LLVM_LDFLAGS may contain -l-lld which is a wrong library reference (AIX) string(REPLACE "-l-lld " "-lld " LLVM_LDFLAGS ${LLVM_LDFLAGS}) - # LLVM_LDFLAGS may have a space at the end - string(REGEX REPLACE " $" "" LLVM_LDFLAGS ${LLVM_LDFLAGS}) endif() +separate_arguments(LLVM_LDFLAGS) # LLVM_CXXFLAGS may contain -Wcovered-switch-default and -fcolor-diagnostics # which are clang-only options if(CMAKE_COMPILER_IS_GNUCXX) @@ -461,7 +460,7 @@ endif() append("-version=IN_LLVM" DDMD_DFLAGS) append("-DIN_LLVM" CMAKE_CXX_FLAGS) append("-DOPAQUE_VTBLS" CMAKE_CXX_FLAGS) -append("-DLDC_INSTALL_PREFIX=\\\"${CMAKE_INSTALL_PREFIX}\\\"" CMAKE_CXX_FLAGS) +append("-DLDC_INSTALL_PREFIX=\"${CMAKE_INSTALL_PREFIX}\"" CMAKE_CXX_FLAGS) append("-DLDC_LLVM_VER=${LDC_LLVM_VER}" CMAKE_CXX_FLAGS) if(GENERATE_OFFTI) @@ -527,7 +526,7 @@ set(TEST_COVERAGE OFF CACHE BOOL "instrument compiler for code coverage analysis if(TEST_COVERAGE) if(CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")) append("-O0 -g -fprofile-arcs -ftest-coverage" EXTRA_CXXFLAGS) - append("-lgcov" LLVM_LDFLAGS) + list(APPEND LLVM_LDFLAGS "-lgcov") else() message(WARNING "Coverage testing is not available.") endif() @@ -556,7 +555,7 @@ set_target_properties( LINK_FLAGS "${SANITIZE_LDFLAGS}" ) # LDFLAGS should actually be in target property LINK_FLAGS, but this works, and gets around linking problems -target_link_libraries(${LDC_LIB} ${LLVM_LIBRARIES} ${PTHREAD_LIBS} ${TERMINFO_LIBS} "${LLVM_LDFLAGS}") +target_link_libraries(${LDC_LIB} ${LLVM_LIBRARIES} ${PTHREAD_LIBS} ${TERMINFO_LIBS} ${LLVM_LDFLAGS}) if(WIN32) target_link_libraries(${LDC_LIB} imagehlp psapi) elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") @@ -570,13 +569,12 @@ set(LDC_EXE_FULL ${PROJECT_BINARY_DIR}/bin/${LDC_EXE_NAME}${EXECUTABLE_EXTENSION set(LDMD_EXE_FULL ${PROJECT_BINARY_DIR}/bin/${LDMD_EXE_NAME}${EXECUTABLE_EXTENSION}) add_custom_target(${LDC_EXE} ALL DEPENDS ${LDC_EXE_FULL}) add_custom_target(${LDMD_EXE} ALL DEPENDS ${LDMD_EXE_FULL}) -string (REPLACE ";" " " LDC_LINKERFLAG_LIST "${SANITIZE_LDFLAGS} ${WINDOWS_STACK_SIZE} ${LIBCONFIG_LIBRARY} ${LLVM_LIBRARIES} ${LLVM_LDFLAGS}") -string (REPLACE "-Wl," "" LDC_LINKERFLAG_LIST ${LDC_LINKERFLAG_LIST}) -separate_arguments(LDC_LINKERFLAG_LIST WINDOWS_COMMAND ${LDC_LINKERFLAG_LIST}) +set(LDC_LINKERFLAG_LIST "${SANITIZE_LDFLAGS};${WINDOWS_STACK_SIZE};${LIBCONFIG_LIBRARY};${LLVM_LIBRARIES};${LLVM_LDFLAGS}") set(tempVar "") -FOREACH(f ${LDC_LINKERFLAG_LIST}) - append("-L${f}" tempVar) -ENDFOREACH(f) +foreach(f ${LDC_LINKERFLAG_LIST}) + string (REPLACE "-Wl," "" f ${f}) + append("-L\"${f}\"" tempVar) +endforeach(f) if(MSVC) # Issue 1297 # The default system-allocated stack size is 8MB on Linux and Mac, but only 1MB on Windows @@ -639,7 +637,7 @@ else() string(REGEX REPLACE "/llvm(/IR)?$" "" LLVM_INTRINSIC_TD_PATH ${LLVM_INTRINSIC_TD_PATH}) message(STATUS "Using path for Intrinsics.td: ${LLVM_INTRINSIC_TD_PATH}") endif() -append("-DLLVM_INTRINSIC_TD_PATH=\\\"${LLVM_INTRINSIC_TD_PATH}\\\"" CMAKE_CXX_FLAGS) +append("-DLLVM_INTRINSIC_TD_PATH=\"${LLVM_INTRINSIC_TD_PATH}\"" CMAKE_CXX_FLAGS ) add_executable(gen_gccbuiltins utils/gen_gccbuiltins.cpp) @@ -649,7 +647,7 @@ set_target_properties( COMPILE_FLAGS "${LLVM_CXXFLAGS} ${LDC_CXXFLAGS}" LINK_FLAGS "${SANITIZE_LDFLAGS}" ) -target_link_libraries(gen_gccbuiltins ${LLVM_TABLEGEN_LIBRARY} ${LLVM_LIBRARIES} ${PTHREAD_LIBS} ${TERMINFO_LIBS} ${CMAKE_DL_LIBS} "${LLVM_LDFLAGS}") +target_link_libraries(gen_gccbuiltins ${LLVM_TABLEGEN_LIBRARY} ${LLVM_LIBRARIES} ${PTHREAD_LIBS} ${TERMINFO_LIBS} ${CMAKE_DL_LIBS} ${LLVM_LDFLAGS}) if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") target_link_libraries(gen_gccbuiltins dl) endif() @@ -665,7 +663,7 @@ if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${FILECHECK_SRC}) COMPILE_FLAGS "${LLVM_CXXFLAGS} ${LDC_CXXFLAGS}" LINK_FLAGS "${SANITIZE_LDFLAGS}" ) - target_link_libraries(FileCheck ${LLVM_LIBRARIES} ${TERMINFO_LIBS} ${CMAKE_DL_LIBS} "${LLVM_LDFLAGS}") + target_link_libraries(FileCheck ${LLVM_LIBRARIES} ${TERMINFO_LIBS} ${CMAKE_DL_LIBS} ${LLVM_LDFLAGS}) else() message(STATUS "Skip building FileCheck, assuming it can be found in LLVM bin directory") endif() @@ -678,7 +676,7 @@ set_target_properties( COMPILE_FLAGS "${LLVM_CXXFLAGS} ${LDC_CXXFLAGS}" LINK_FLAGS "${SANITIZE_LDFLAGS}" ) -target_link_libraries(not ${LLVM_LIBRARIES} ${TERMINFO_LIBS} ${CMAKE_DL_LIBS} "${LLVM_LDFLAGS}") +target_link_libraries(not ${LLVM_LIBRARIES} ${TERMINFO_LIBS} ${CMAKE_DL_LIBS} ${LLVM_LDFLAGS}) # # LDMD diff --git a/cmake/Modules/FindLLVM.cmake b/cmake/Modules/FindLLVM.cmake index 8fedce712a..abc732d790 100644 --- a/cmake/Modules/FindLLVM.cmake +++ b/cmake/Modules/FindLLVM.cmake @@ -178,7 +178,7 @@ else() # but code for it is not in shared library if("${LLVM_FIND_COMPONENTS}" MATCHES "tablegen") if (NOT "${LLVM_LIBRARIES}" MATCHES "LLVMTableGen") - set(LLVM_LIBRARIES "${LLVM_LIBRARIES} -lLLVMTableGen") + set(LLVM_LIBRARIES "${LLVM_LIBRARIES};-lLLVMTableGen") endif() endif() llvm_set(TARGETS_TO_BUILD targets-built) diff --git a/driver/configfile.cpp b/driver/configfile.cpp index 2418e91bfd..e7b21bfdce 100644 --- a/driver/configfile.cpp +++ b/driver/configfile.cpp @@ -131,16 +131,20 @@ bool ConfigFile::locate() { APPEND_FILENAME_AND_RETURN_IF_EXISTS } #else +#define STR(x) #x +#define XSTR(x) STR(x) // try the install-prefix/etc - p = LDC_INSTALL_PREFIX; + p = XSTR(LDC_INSTALL_PREFIX); sys::path::append(p, "etc"); APPEND_FILENAME_AND_RETURN_IF_EXISTS // try the install-prefix/etc/ldc - p = LDC_INSTALL_PREFIX; + p = XSTR(LDC_INSTALL_PREFIX); sys::path::append(p, "etc"); sys::path::append(p, "ldc"); APPEND_FILENAME_AND_RETURN_IF_EXISTS +#undef XSTR +#undef STR // try /etc (absolute path) p = "/etc"; diff --git a/utils/gen_gccbuiltins.cpp b/utils/gen_gccbuiltins.cpp index 29a0baeb47..56f54f8a93 100644 --- a/utils/gen_gccbuiltins.cpp +++ b/utils/gen_gccbuiltins.cpp @@ -201,13 +201,17 @@ int main(int argc, char** argv) return 1; } - llvm::SmallString<128> file(LLVM_INTRINSIC_TD_PATH); +#define STR(x) #x +#define XSTR(x) STR(x) + llvm::SmallString<128> file(XSTR(LLVM_INTRINSIC_TD_PATH)); sys::path::append(file, "llvm"); sys::path::append(file, "IR"); sys::path::append(file, "Intrinsics.td"); - string iStr = string("-I=") + string(LLVM_INTRINSIC_TD_PATH); + string iStr = string("-I=") + string(XSTR(LLVM_INTRINSIC_TD_PATH)); string oStr = string("-o=") + argv[1]; +#undef XSTR +#undef STR vector args2(argv, argv + 1); args2.push_back(const_cast(file.c_str()));