From 61890382eb65193c98a4f0312548ecceb82dad3b Mon Sep 17 00:00:00 2001 From: b-r-o-c-k Date: Sun, 10 Jun 2018 09:57:12 -0500 Subject: deps: Build bundled dependencies automatically for IDEs Environment variables are used to detect when the project is being built from within Clion or Visual Studio, so that the build process can be simplified by automatically building the bundled dependencies for them. --- CMakeLists.txt | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2100c53ad2..70d663a89c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,34 @@ if(DEFINED ENV{DEPS_BUILD_DIR}) set(DEPS_PREFIX "$ENV{DEPS_BUILD_DIR}/usr" CACHE PATH "Path prefix for finding dependencies") else() set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/usr" CACHE PATH "Path prefix for finding dependencies") + # When running from within CLion or Visual Studio, + # build bundled dependencies automatically. + if(NOT EXISTS ${DEPS_PREFIX} + AND (DEFINED ENV{CLION_IDE} + OR DEFINED ENV{VisualStudioEdition})) + message(STATUS "Building dependencies...") + set(DEPS_BUILD_DIR ${PROJECT_BINARY_DIR}/.deps) + file(MAKE_DIRECTORY ${DEPS_BUILD_DIR}) + execute_process( + COMMAND ${CMAKE_COMMAND} -G ${CMAKE_GENERATOR} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG} + -DCMAKE_C_FLAGS_MINSIZEREL=${CMAKE_C_FLAGS_MINSIZEREL} + -DCMAKE_C_FLAGS_RELWITHDEBINFO=${CMAKE_C_FLAGS_RELWITHDEBINFO} + -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE} + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} + ${PROJECT_SOURCE_DIR}/third-party + WORKING_DIRECTORY ${DEPS_BUILD_DIR}) + execute_process( + COMMAND ${CMAKE_COMMAND} --build ${DEPS_BUILD_DIR} + --config ${CMAKE_BUILD_TYPE}) + set(DEPS_PREFIX ${DEPS_BUILD_DIR}/usr) + endif() endif() + if(CMAKE_CROSSCOMPILING AND NOT UNIX) list(INSERT CMAKE_FIND_ROOT_PATH 0 ${DEPS_PREFIX}) list(INSERT CMAKE_PREFIX_PATH 0 ${DEPS_PREFIX}/../host/bin) -- cgit From 40a257e11fc587b07b66f465033681f124779c0d Mon Sep 17 00:00:00 2001 From: b-r-o-c-k Date: Tue, 12 Jun 2018 08:47:16 -0500 Subject: Revert "makedeps.bat" --- makedeps.bat | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 makedeps.bat diff --git a/makedeps.bat b/makedeps.bat deleted file mode 100644 index a614885568..0000000000 --- a/makedeps.bat +++ /dev/null @@ -1,18 +0,0 @@ -echo off - -if not defined VS150COMNTOOLS ( - echo error: missing VS150COMNTOOLS environment variable. - echo Run this script from the 'Developer Command Prompt'. - exit /b 1 -) - -echo on - -set CMAKE=%VS150COMNTOOLS%\..\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe - -mkdir .deps -cd .deps -"%CMAKE%" -G "Visual Studio 15 2017" "-DCMAKE_BUILD_TYPE=RelWithDebInfo" ..\third-party\ -"%CMAKE%" --build . --config RelWithDebInfo -- "/verbosity:normal" -cd .. - -- cgit From f39a0f5dd075e19ab693438e0af91f9ccf3bfa4f Mon Sep 17 00:00:00 2001 From: b-r-o-c-k Date: Thu, 14 Jun 2018 09:34:18 -0500 Subject: build/win: Add workaround for Windows command length limit When building with the Ninja generator on Windows, it was possible for the external_blobs target to fail when the generated command exceeds the command length limit (8191 characters). To workaround the problem, a CMake script is used to copy the files instead of a shell command. Visual Studio bug report: https://developercommunity.visualstudio.com/content/problem/212207/file-open-cmake-the-command-line-is-too-long.html --- src/nvim/CMakeLists.txt | 67 ++++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index bdedce8076..b75e4ce1f3 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -430,35 +430,46 @@ if(WIN32) -P ${PROJECT_SOURCE_DIR}/cmake/WindowsDllCopy.cmake) add_dependencies(nvim_runtime_deps nvim_dll_deps) + # A CMake script is used for copying the files to avoid the + # "command line is too long" error that occurs when Ninja tries running + # a command that exceeds the length limit (8191 characters) on Windows. + # See https://developercommunity.visualstudio.com/content/problem/212207/file-open-cmake-the-command-line-is-too-long.html + set(EXTERNAL_BLOBS_SCRIPT + "file(MAKE_DIRECTORY \"${PROJECT_BINARY_DIR}/windows_runtime_deps/platforms\")") + foreach(DEP_FILE IN ITEMS + ca-bundle.crt + cat.exe + curl.exe + diff.exe + tee.exe + tidy.exe + win32yank.exe + winpty-agent.exe + xxd.exe + + D3Dcompiler_47.dll + libEGL.dll + libgcc_s_dw2-1.dll + libGLESV2.dll + libstdc++-6.dll + libwinpthread-1.dll + nvim-qt.exe + Qt5Core.dll + Qt5Gui.dll + Qt5Network.dll + Qt5Svg.dll + Qt5Widgets.dll + winpty.dll + + platforms/qwindows.dll + ) + set(EXTERNAL_BLOBS_SCRIPT "${EXTERNAL_BLOBS_SCRIPT}\n" + "file(COPY \"${DEPS_PREFIX}/bin/${DEP_FILE}\" + DESTINATION \"${PROJECT_BINARY_DIR}/windows_runtime_deps/\")") + endforeach() + file(WRITE ${PROJECT_BINARY_DIR}/external_blobs.cmake ${EXTERNAL_BLOBS_SCRIPT}) add_custom_target(external_blobs - COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/windows_runtime_deps/platforms - - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/ca-bundle.crt" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/cat.exe" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/curl.exe" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/diff.exe" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/tee.exe" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/tidy.exe" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/win32yank.exe" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/winpty-agent.exe" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/xxd.exe" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/D3Dcompiler_47.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/libEGL.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/libgcc_s_dw2-1.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/libGLESV2.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/libstdc++-6.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/libwinpthread-1.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/nvim-qt.exe" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/Qt5Core.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/Qt5Gui.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/Qt5Network.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/Qt5Svg.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/Qt5Widgets.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/winpty.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/ - - COMMAND ${CMAKE_COMMAND} -E copy "${DEPS_PREFIX}/bin/platforms/qwindows.dll" ${PROJECT_BINARY_DIR}/windows_runtime_deps/platforms/ - ) + COMMAND ${CMAKE_COMMAND} -P ${PROJECT_BINARY_DIR}/external_blobs.cmake) add_dependencies(nvim_runtime_deps external_blobs) else() add_custom_target(nvim_runtime_deps) # Stub target to avoid CMP0046. -- cgit From 7097aba6be0a1eeaa9fd6ad8bfef556d7d884fd2 Mon Sep 17 00:00:00 2001 From: b-r-o-c-k Date: Sun, 17 Jun 2018 07:54:39 -0500 Subject: cmake: Organize targets into folders Enabling CMake's USE_FOLDERS option and adding the FOLDER property to targets allows some IDEs to list the targets in an organized hierarchy of folders. --- CMakeLists.txt | 8 ++++++++ src/nvim/CMakeLists.txt | 3 +++ src/nvim/po/CMakeLists.txt | 4 ++++ test/includes/CMakeLists.txt | 1 + 4 files changed, 16 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 70d663a89c..907339fea1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,8 @@ list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") # We don't support building in-tree. include(PreventInTreeBuilds) +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + # Prefer our bundled versions of dependencies. if(DEFINED ENV{DEPS_BUILD_DIR}) set(DEPS_PREFIX "$ENV{DEPS_BUILD_DIR}/usr" CACHE PATH "Path prefix for finding dependencies") @@ -574,6 +576,7 @@ if(BUSTED_PRG) # Useful for automated build systems, if they want to manually run the tests. add_custom_target(unittest-prereqs DEPENDS ${UNITTEST_PREREQS}) + set_target_properties(unittest-prereqs PROPERTIES FOLDER test) add_custom_target(functionaltest-prereqs DEPENDS ${FUNCTIONALTEST_PREREQS}) @@ -596,6 +599,7 @@ if(BUSTED_PRG) -P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake DEPENDS ${UNITTEST_PREREQS} ${TEST_TARGET_ARGS}) + set_target_properties(unittest PROPERTIES FOLDER test) else() message(WARNING "disabling unit tests: no Luajit FFI in ${LUA_PRG}") endif() @@ -640,6 +644,8 @@ if(BUSTED_PRG) -P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake DEPENDS ${FUNCTIONALTEST_PREREQS} ${TEST_TARGET_ARGS}) + set_target_properties(functionaltest functionaltest-prereqs + PROPERTIES FOLDER test) add_custom_target(benchmark COMMAND ${CMAKE_COMMAND} @@ -655,6 +661,7 @@ if(BUSTED_PRG) -P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake DEPENDS ${BENCHMARK_PREREQS} ${TEST_TARGET_ARGS}) + set_target_properties(benchmark benchmark-prereqs PROPERTIES FOLDER test) endif() if(BUSTED_LUA_PRG) @@ -672,6 +679,7 @@ if(BUSTED_LUA_PRG) -P ${PROJECT_SOURCE_DIR}/cmake/RunTests.cmake DEPENDS ${FUNCTIONALTEST_PREREQS} ${TEST_TARGET_ARGS}) + set_target_properties(functionaltest-lua PROPERTIES FOLDER test) endif() if(LUACHECK_PRG) diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index b75e4ce1f3..2e44f2a030 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -470,10 +470,12 @@ if(WIN32) file(WRITE ${PROJECT_BINARY_DIR}/external_blobs.cmake ${EXTERNAL_BLOBS_SCRIPT}) add_custom_target(external_blobs COMMAND ${CMAKE_COMMAND} -P ${PROJECT_BINARY_DIR}/external_blobs.cmake) + set_target_properties(external_blobs PROPERTIES FOLDER deps) add_dependencies(nvim_runtime_deps external_blobs) else() add_custom_target(nvim_runtime_deps) # Stub target to avoid CMP0046. endif() +set_target_properties(nvim_runtime_deps PROPERTIES FOLDER deps) add_library( libnvim @@ -585,6 +587,7 @@ foreach(hfile ${NVIM_HEADERS}) TARGET ${texe} APPEND PROPERTY INCLUDE_DIRECTORIES ${LUA_PREFERRED_INCLUDE_DIRS} ) + set_target_properties(${texe} PROPERTIES FOLDER test) list(FIND NO_SINGLE_CHECK_HEADERS "${relative_path}" hfile_exclude_idx) if(${hfile_exclude_idx} EQUAL -1) diff --git a/src/nvim/po/CMakeLists.txt b/src/nvim/po/CMakeLists.txt index a7b910f0eb..6811f99add 100644 --- a/src/nvim/po/CMakeLists.txt +++ b/src/nvim/po/CMakeLists.txt @@ -55,6 +55,7 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG) DEPENDS ${NVIM_SOURCES}) add_custom_target(potfile DEPENDS ${NVIM_POT}) + set_target_properties(potfile PROPERTIES FOLDER po) set(LANGUAGE_MO_FILES) set(UPDATE_PO_TARGETS) @@ -91,6 +92,7 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG) COMMENT "Checking ${name}.po" VERBATIM DEPENDS ${poFile}) + set_target_properties(check-po-${name} PROPERTIES FOLDER po/check) endmacro() macro(BuildPoIconvGenericWithCharset @@ -182,7 +184,9 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG) BuildMo(${LANGUAGE}) endforeach() + set_target_properties(${UPDATE_PO_TARGETS} PROPERTIES FOLDER po/update) add_custom_target(translations ALL DEPENDS ${LANGUAGE_MO_FILES}) add_custom_target(update-po DEPENDS ${UPDATE_PO_TARGETS}) + set_target_properties(translations update-po PROPERTIES FOLDER po) endif() diff --git a/test/includes/CMakeLists.txt b/test/includes/CMakeLists.txt index 305d3369b7..2846df0e37 100644 --- a/test/includes/CMakeLists.txt +++ b/test/includes/CMakeLists.txt @@ -22,3 +22,4 @@ foreach(hfile ${PRE_HEADERS}) endforeach() add_custom_target(unittest-headers DEPENDS ${POST_HEADERS}) +set_target_properties(unittest-headers PROPERTIES FOLDER test) -- cgit