Robotics StackExchange | Archived questions

How do you exclude folders with colcon test?

The Problem (TL;DR)

I'm trying to run a series of tests and linters with colcon test. But for some reason, colcon or CMake (not sure which) seems to test a bunch of build files, which are auto-generated and generate a ton of errors that have nothing to do with my source code, but clutter the test output, making it very difficult to actually figure out if the source code needs to be fixed.

How do I explicitly tell colcon test what folders to test (or not)?


The Problem (full explanation)

I'm running colcon tests with:

$ colcon build --cmake-args -DBUILD_TESTING=ON --packages-up-to my_package
$ colcon test --packages-select my_package --event-handlers=console_cohesion+

In my CMakeList file, I have set up the following tests with this code:

if(BUILD_TESTING)
  find_package(ament_cmake_clang_tidy REQUIRED)

  find_package(ament_cmake_xmllint REQUIRED)
  ament_xmllint()

  find_package(ament_cmake_clang_format REQUIRED)
  ament_clang_format(CONFIG_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../../../.clang-format)

  find_package(ament_cmake_lint_cmake REQUIRED)
  ament_lint_cmake()

  find_package(ros_testing REQUIRED)
  add_ros_test(
    test/test_talker.py
    TIMEOUT "30"
  )

  find_package(ament_cmake_gtest REQUIRED)
  find_package(ament_cmake_gmock REQUIRED)
  set(TEST_SOURCES test/test_listener.cpp)
  set(TEST_RST_EXE test_listener)
  ament_add_gtest(${TEST_RST_EXE} ${TEST_SOURCES})
  target_link_libraries(${TEST_RST_EXE} ${TEMPLATE_LISTENER_NODE}_lib)
endif()

But several of these tests fail, and they fail with lines like this:

2: [build/my_package/CMakeFiles/3.24.0/CompilerIdCXX/CMakeCXXCompilerId.cpp:790:53]: Replace [ ] with [\n                                               ]
2: - const char* info_language_extensions_default = "INFO" ":" "extensions_default["
2: + const char* info_language_extensions_default = "INFO"
2: + 

or

3: build/my_package/ament_cmake_package_templates/templates.cmake:14: Lines should be <= 140 characters long [linelength]

... There are lines and lines of this junk, testing not my source code but build and install files that are auto-generated, and so shouldn't best tested in the first place. How do I change either the colcon test commands, or the code in the CMakeList file to exclude the build and install folders?

Asked by M@t on 2023-01-03 20:09:06 UTC

Comments

Answers

So after reading a ton of source code and docs, it turns out that only some of the linters provided in the ament_lint repo support any kind of "exclude" feature. They are:

Everything else doesn't seem to have any exclude feature implemented (although don't let me stop you from implementing this feature if you have the time).

As for actually implementing these exclusions, you have two methods:

  1. Set AMENT_LINT_AUTO_FILE_EXCLUDE if you're using ament_lint_auto - see the readme for implementation details
  2. Setting the exclude paths explicitly, when you manually call the linter in your CMakeLists file e.g:

    file(GLOB_RECURSE EXCLUDE_FILES
        build/*
        install/*
    )
    ament_cmake_cpplint(EXCLUDE ${EXCLUDE_FILES})
    

For further reading, here are some relevant issues from the repo:

Asked by M@t on 2023-01-04 21:30:45 UTC

Comments

I see one problem. It looks like your build directory is in the same folder as your CMakeLists.txt. The linters lint any files in that directory. Building inside the package is considered in-tree and is not recommended by ROS; that's why in the tutorials they make you create a "workspace" and put a src/ directory inside of it. Then, the build folder does not get linted by any of the packages.

That said, ament_cmake_flake8 was an issue I fixed, and it's merged into (rolling), but not humble or galactic.

Asked by ryanf55 on 2023-01-18 11:11:28 UTC

Comments

I do have an out-of-source build. so my directory structure looks like:

package_name/
    src/
    install/
    build/

Does that mean something is configured incorrectly in my CMakelist?

Asked by M@t on 2023-01-24 19:56:52 UTC