Skip to content

Commit

Permalink
GSOC post-credits scene (#30)
Browse files Browse the repository at this point in the history
* [DOCS]: ReadMe update

* [Windows]: Fixing [Windows build failer](#25)

* [DOCS]: README.md bugfix

* [WINDOWS]: fixing 'long long' Warning!!! "Acceleration is not possible" errors (gone from 50% unit test sucsess to 79%)
The following tests FAILED:
          4 - testFullRing (Failed)
          6 - testInducedVoltage (Failed)
          7 - testInducedVoltageFreq (Failed)
          9 - testLHCFlatSpectrum (Failed)
         23 - testTC5_Wake_impedance (Failed)

* [Project]: Added cmake options for setting paths of data files for test and demo.
Required for CLion IDE compilation from randomly named folders.
Default "../demos/input_files" and "../unit-tests/references"

* [Configuration]: debug options printer added

* [MERGE]: tests fix

* [Merge]: Code cleanup

* [Merge]: update TEST_FILES use.

* [Configuration]: added support for embedding demo and test reference data path's

* [Merge]: minor bug fix

* [Windows]: MinGW, OpenCL, boost.compute support
Started documentation

* [Documentation]: created benchmarks browser (html/js, 2d and 3d),
 described build and configuration process on Windows

* [Windows]: Random number generator made similar to linux default

* [Merge]: added changes from main brunch
added pre optimization benchmarks showcasing OpenCL use

* [CI]: OpenCL install

* [CI]: Linux users now can provide sdk paths alike -DOPENCL_SDK_PATH=/usr/lib/x86_64-linux-gnu/

* [CI]: Minor bug fix

* [CI]: minor fix

* [CI]: minor fix

* [Speed]: omega_RF indexes
Added hybrilit pre-optemization release benchmarks

* [Speed]: voltageVec and RfP->voltage transposition merge

* [Speed]: dphiVec and  RfP->phi_RF transposition merger

* [Speed]: Updated benchmark data

* [Benchmarks]: sinus result holder moved into iteration,
specified arguments of TC1 benchmark

* [Docs]: created stubs for planned content

* [Speed]: Atomic histogram

* [Speed] speed for TC1 on cpu final. x2.2 on i7.

* [CI]: travis bug fix
speed up HDD reads

* [CI] minor CI boost compilation fix

* [CI]: Travis OpenCL fixes

* [Speed]: final CPU optimisation for TC1

* [Docs]: updated benchmark visualization

* [Docs]: Benchmark visualization code and samples

* [Docs]: added FAQ

* [CI]: Fixing travis

* [CI]: Fixing Travis

* [CI]: Fixing TravisCI

* [CI]: fixing AppVeyor

* [Architecture]: Revert copy in kick

* [CI]: fixing last unit-test

* [CI]: fixing benchmarks build

* [Benchmarks]: CPU and GPU examples added

* [CI]: fixing appveyor

* [CI]: appveyor.yml fix

* [CI]: fixing appveyor OpenCl

* [OpenCL]: made benchmark the only thing dependant on it

* [CI]: fixed ifdefs
  • Loading branch information
OlegJakushkin authored and kiliakis committed Aug 29, 2016
1 parent 8984186 commit 86ed265
Show file tree
Hide file tree
Showing 56 changed files with 6,223 additions and 852 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
*~
*report
*documentation
build/*
build*
external/install/*
external/build/*
.idea*
27 changes: 22 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
sudo: false
#note: OpenCL instructions taken from https://github.com/peastman/openmm/blob/a7ce5784bc1d728ef7088c10308fa61b9c87e1a9/.travis.yml
sudo: required
dist: trusty
language: cpp

os:
Expand All @@ -12,20 +14,23 @@ env:
- BUILD_TYPE=Release
global:
- secure: inwXVLS3LG1+J8XHpN92Si87FLs8tT/SEWcg71us65o2AYDVCqqbXhFRpTqRY+K6ciT6IHd41LnmOaK1lID86YMcGUsQxvMJHbwMBCDPs+Qjup/g8xSjOZo11gnt9b2Jp5O/vEXOKdVoyBBXtR+J0JQ4ogS6VxvQyP2WDYH7FFFxsYZ83i93qCDUs7XnOwtN/f/wJMkMRQP+49Lp7EKWJEWXK87YM83fshQcLl2uOZfzdS9esN0QPXAW5W+jvB2EkvtjTy2EyDpdF1FMLLH50Uj4wP4A7FutnqfG4pRbhtdkDXqL429R9COyzXLdEiyTEoX7rbGLYqwfDpPC8huqUsp3NxdiSlx+ZdeBGySRkzcUmwKGzwapEgWEHu6Sujto1vLtU3tv0/Ywlf1nHsQ4jngnswtlVWi+pWPBVO5yyG3feKsj3fdvNdceszhU2Dj2e4zW6o9Ys7mJ41fbj1QsTSepVjcR/r9PU11948R+dyA37wF3lLdCApTbdI2PrVFUrQuHPr59s43ZGb52R24fdCi8Ao6Fd4oyJw9zLnhJDCehWDWYM5UcrC/mllzo8K1v4BqrEVlCeIBPx7SIsWUXjQ/gNv/JFp5+jYU1ibqz7VeS6ZhHd6tj6mUKkQ5Cqb9bkDkFBA48X0tet2qFQzuCoXUHqds/08odhMgVf0741Jc=

- OPENCL=true
- CUDA=false
- CMAKE_FLAGS="
-DOPENCL_INCLUDE_DIR=$HOME/AMDAPPSDK/include
-DOPENCL_LIBRARY=$HOME/AMDAPPSDK/lib/x86_64/libOpenCL.so"
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- george-edison55-precise-backports
- libreoffice/libreoffice-4-2
packages:
- cmake
- cmake-data
- gcc-4.8
- g++-4.8
- opencl-headers
- valgrind
- gcov-4.8
- lcov
- doxygen
- graphviz
Expand All @@ -40,11 +45,23 @@ cache:
before_install:
- export CC=/usr/bin/gcc-4.8
- export CXX=/usr/bin/g++-4.8
- if [[ "$OPENCL" == "true" ]]; then
wget https://jenkins.choderalab.org/userContent/AMD-APP-SDKInstaller-v3.0.130.135-GA-linux64.tar.bz2;
tar -xjf AMD-APP-SDK*.tar.bz2;
AMDAPPSDK=${HOME}/AMDAPPSDK;
export OPENCL_VENDOR_PATH=${AMDAPPSDK}/etc/OpenCL/vendors;
mkdir -p ${OPENCL_VENDOR_PATH};
sh AMD-APP-SDK*.sh --tar -xf -C ${AMDAPPSDK};
echo libamdocl64.so > ${OPENCL_VENDOR_PATH}/amdocl64.icd;
export LD_LIBRARY_PATH=${AMDAPPSDK}/lib/x86_64:${LD_LIBRARY_PATH};
chmod +x ${AMDAPPSDK}/bin/x86_64/clinfo;
${AMDAPPSDK}/bin/x86_64/clinfo;
fi

before_script:
- mkdir build
- cd build
- cmake -DWITH_FFTW=True -DWITH_GOOGLETEST=True -DWITH_BENCHMARK=True -DCMAKE_BUILD_TYPE=$BUILD_TYPE ..
- cmake -DWITH_FFTW=True -DWITH_GOOGLETEST=True -DWITH_BENCHMARK=True -DBUILD_EXTERNALS=True -DOPENCL_SDK_PATH=$HOME/AMDAPPSDK -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DARCHITECTURE="x64" ..

script:
- cmake --build . -- -j2 VERBOSE=1
Expand Down
171 changes: 99 additions & 72 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ include(ExternalProject)
include(ProcessorCount)
include(CTest)


# Code editors usabilety feature
set_property(GLOBAL PROPERTY USE_FOLDERS On)
set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "We have optemized configuration for Debug and Release configurations")
Expand All @@ -21,14 +22,27 @@ set(SHARED_LIBRARY_ENABLED "True")
set(EXTERNAL_INSTALL_DIR ${PROJECT_SOURCE_DIR}/external/install)
set(TEST_ENABLED "True" CACHE STRING "Cerate unit-test projects")
set(BENCHMARK_ENABLED "True" CACHE STRING "Cerate benchmark projects")
set(ARCHITECTURE "x64" CACHE STRING "Set architecture 'x86' or 'x32'") # todo: find usages and fix comment
if(NOT ABSOLUTE_DATA_PATHS)
set(DATAFILES_DIR_DEMOS "../demos/input_files" CACHE STRING "Set demos input files path")
set(DATAFILES_DIR_TESTS "../unit-tests/references" CACHE STRING "Set unit-tests input files path")

if (NOT DEFINED ARCHITECTURE)
set(ARCHITECTURE "Default" CACHE STRING "Set architecture 'x86' or 'x64'") # todo: find usages and fix comment
# Project architecture
if ((${CMAKE_GENERATOR} MATCHES ".*(64).*") OR (${CMAKE_SIZEOF_VOID_P} MATCHES ".*(64).*"))
set(ARCHITECTURE "x64")
message(STATUS "architecture: ${ARCHITECTURE} detected from (${CMAKE_GENERATOR} and ${CMAKE_SIZEOF_VOID_P}) ")
endif ()
endif ()


set(WITH_COMPUTE "False" CACHE STRING "Should Build Boost.Compute library from source")
set(BOOST_ROOT ${PROJECT_SOURCE_DIR}/external/build/boost CACHE STRING "Boost Library root")

if (NOT ABSOLUTE_DATA_PATHS)
set(DATAFILES_DIR_DEMOS "../demos/input_files" CACHE STRING "Set demos input files path")
set(DATAFILES_DIR_TESTS "../unit-tests/references" CACHE STRING "Set unit-tests input files path")
else ()
set(DATAFILES_DIR_DEMOS "${CMAKE_CURRENT_LIST_DIR}/demos/input_files" CACHE STRING "Set demos input files path")
set(DATAFILES_DIR_TESTS "${CMAKE_CURRENT_LIST_DIR}/unit-tests/references" CACHE STRING "Set unit-tests input files path")
endif()
set(DATAFILES_DIR_DEMOS "${CMAKE_CURRENT_LIST_DIR}/demos/input_files" CACHE STRING "Set demos input files path")
set(DATAFILES_DIR_TESTS "${CMAKE_CURRENT_LIST_DIR}/unit-tests/references" CACHE STRING "Set unit-tests input files path")
endif ()

# Packages
set(EXTERNAL_INSTALL_DIR ${PROJECT_SOURCE_DIR}/external/install CACHE STRING "External libraries installation folder (with subfolders lib and include)")
Expand All @@ -50,7 +64,6 @@ if (NOT DEFINED WITH_GOOGLETEST)
endif ()
endif ()

set(GOOGLETEST_ROOT ${PROJECT_SOURCE_DIR}/external/googletest/ CACHE STRING "Google Test source root")

if (NOT DEFINED WITH_BENCHMARK)
if (MSVC)
Expand All @@ -60,7 +73,9 @@ if (NOT DEFINED WITH_BENCHMARK)
endif ()
endif ()

set(BENCHMARK_ROOT ${PROJECT_SOURCE_DIR}/external/benchmark CACHE STRING "Google Benchmark Library root")
set(GOOGLETEST_ROOT ${PROJECT_SOURCE_DIR}/external/build/googletest/ CACHE STRING "Google Test source root")
set(BENCHMARK_ROOT ${PROJECT_SOURCE_DIR}/external/build/benchmark CACHE STRING "Google Benchmark Library root")


set(WITH_FORMAT "False" CACHE STRING "Clang-Format all project files on build (requires clang-format)")

Expand All @@ -74,18 +89,12 @@ if (NOT N EQUAL 0)
set(ctest_test_args ${ctest_test_args} PARALLEL_LEVEL ${N})
endif ()

# Project architecture
set(ARCHITECTURE "Default" CACHE STRING "Two architectures avaliable 'Dafault' and 'x64', it is impartant for external libraries")
if ((${CMAKE_GENERATOR} MATCHES ".*(64).*") OR (${CMAKE_SIZEOF_VOID_P} MATCHES ".*(64).*"))
set(ARCHITECTURE "x64")
message(STATUS "architecture: ${ARCHITECTURE} detected from (${CMAKE_GENERATOR} and ${CMAKE_SIZEOF_VOID_P}) ")
endif ()

#Compiler, Linker options
#Compiler settings
#MSVC vs Other

add_definitions(-D_USE_MATH_DEFINES) #needed for VDT
if (MSVC)
add_definitions(-D_USE_MATH_DEFINES) #needed for VDT
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj -Zm500 /MP${N} /openmp /fp:precise ")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GR-")
else ()
Expand All @@ -96,18 +105,19 @@ else ()
endif ()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++11 -fopenmp -Wall -pedantic -fno-rtti -Wunused -ffast-math")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g3") #-fsanitize=address -fno-omit-frame-pointer ")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g3 -O0 -fno-omit-frame-pointer -fprofile-arcs -ftest-coverage") # -fsanitize=address
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -march=native")

if (TEST_ENABLED STREQUAL "True")
LIST(APPEND LIBRARIES gcov)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage")
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} --coverage")
else ()
message(STATUS "code test coveredge is enabeled only in Debug mode")
endif ()

if (USE_FFTW_OMP)
set(LIBRARIES ${LIBRARIES} fftw3_omp)
LIST(APPEND LIBRARIES fftw3_omp)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_FFTW_OMP")
endif ()
endif ()
Expand Down Expand Up @@ -160,54 +170,60 @@ if ((NOT WITH_BENCHMARK) AND BENCHMARK_ENABLED)
find_library(BENCHMARK_LIB NAME benchmark REQUIRED)
endif ()

if (NOT (EXISTS ${PROJECT_SOURCE_DIR}/external/build))
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_SOURCE_DIR}/external/build)
else ()
execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_SOURCE_DIR}/external/build/)
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_SOURCE_DIR}/external/build)
endif ()
if (BUILD_EXTERNALS)
if (NOT (EXISTS ${PROJECT_SOURCE_DIR}/external/build))
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_SOURCE_DIR}/external/build)
else ()
execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${PROJECT_SOURCE_DIR}/external/build/)
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_SOURCE_DIR}/external/build)
endif ()

message(STATUS "Building required started...")

execute_process(
COMMAND ${CMAKE_COMMAND}
#options
-DWITH_FFTW=${WITH_FFTW}
-DWITH_BENCHMARK=${WITH_BENCHMARK}
-DWITH_GOOGLETEST=${WITH_GOOGLETEST}
-DWITH_COMPUTE=${WITH_COMPUTE}
#destinations
-DINSTALL_DIR=${EXTERNAL_INSTALL_DIR}
-DCOMPILE_FLAGS=${COMPILE_FLAGS}
-DGOOGLETEST_ROOT=${GOOGLETEST_ROOT}
-DBENCHMARK_ROOT=${BENCHMARK_ROOT}
-DGOOGLETEST_ROOT=${GOOGLETEST_ROOT}
-DBOOST_ROOT=${BOOST_ROOT}
#forward all collected compilation arguments
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} # relevant only for Make-like build files
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
-DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}
-DCMAKE_EXE_LINKER_FLAGS_RELEASE=${CMAKE_EXE_LINKER_FLAGS_RELEASE}
-DCMAKE_EXE_LINKER_FLAGS_DEBUG=${CMAKE_EXE_LINKER_FLAGS_DEBUG}
-v
-G "${CMAKE_GENERATOR}"
${PROJECT_SOURCE_DIR}/external/
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/external/build
)

message(STATUS "Building required started...")

execute_process(
COMMAND ${CMAKE_COMMAND}
#options
-DWITH_FFTW=${WITH_FFTW}
-DWITH_BENCHMARK=${WITH_BENCHMARK}
-DWITH_GOOGLETEST=${WITH_GOOGLETEST}
#destinations
-DINSTALL_DIR=${EXTERNAL_INSTALL_DIR}
-DCOMPILE_FLAGS=${COMPILE_FLAGS}
-DGOOGLETEST_ROOT=${GOOGLETEST_ROOT}
-DBENCHMARK_ROOT=${BENCHMARK_ROOT}
-DGOOGLETEST_ROOT=${GOOGLETEST_ROOT}
#forward all collected compilation arguments
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} # relevant only for Make-like build files
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
-DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}
-DCMAKE_EXE_LINKER_FLAGS_RELEASE=${CMAKE_EXE_LINKER_FLAGS_RELEASE}
-DCMAKE_EXE_LINKER_FLAGS_DEBUG=${CMAKE_EXE_LINKER_FLAGS_DEBUG}
-v
-G "${CMAKE_GENERATOR}"
${PROJECT_SOURCE_DIR}/external/
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/external/build
)

message(STATUS "building external projects begins")
execute_process(
COMMAND cmake --build . --config Release
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/external/build
)
if (WIN32 AND NOT MINGW)
message(STATUS "building external projects begins")
execute_process(
COMMAND cmake --build . --config Debug
COMMAND cmake --build . --config Release
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/external/build
)

if (WIN32 AND NOT MINGW)
execute_process(
COMMAND cmake --build . --config Debug
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/external/build
)
endif ()
message(STATUS "building external projects ended")

endif ()
message(STATUS "building external projects ended")

message(STATUS "Building required libraries complete")
message(STATUS "Building required librasries complete")
# path to external libraries and headers
include_directories(${EXTERNAL_INSTALL_DIR}/include)
link_directories(${EXTERNAL_INSTALL_DIR}/lib)
Expand All @@ -228,10 +244,6 @@ if (WITH_FFTW)
NO_DEFAULT_PATH
)
endif ()

add_custom_command(TARGET ALL PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${EXTERNAL_INSTALL_DIR}/bin/" $<TARGET_FILE_DIR>)
endif ()


Expand All @@ -252,7 +264,7 @@ endfunction(assign_source_group)

# main library
include_directories(include)
SET(LIBRARIES
LIST(APPEND LIBRARIES
${FFTW_LIB}
)

Expand All @@ -277,6 +289,18 @@ else ()
endif ()
target_link_libraries(blond ${LIBRARIES})

if (WITH_FFTW)
if (MSVC)
add_custom_command(TARGET blond PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${EXTERNAL_INSTALL_DIR}/bin/fftw/$(Configuration)" $<TARGET_FILE_DIR:blond>)
else ()
add_custom_command(TARGET blond PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${EXTERNAL_INSTALL_DIR}/bin/" $<TARGET_FILE_DIR:blond>)
endif ()
endif ()

#SET_TARGET_PROPERTIES(blond PROPERTIES LINKER_LANGUAGE CXX)

# demo executables
Expand All @@ -286,7 +310,6 @@ file(GLOB EXECUTABLE_SOURCES "demos/*.cpp")
set(EXECUTABLE_FILES ${EXECUTABLE_SOURCES})



# demo dependencies

foreach (src ${EXECUTABLE_FILES})
Expand Down Expand Up @@ -362,7 +385,7 @@ endif ()
if (BENCHMARK_ENABLED)
if (WITH_BENCHMARK)
if (WIN32 AND NOT MINGW)
link_directories(${EXTERNAL_INSTALL_DIR}/lib/fftw/$(Configuration)/)
link_directories(${EXTERNAL_INSTALL_DIR}/lib/benchmark/$(Configuration)/)
find_library(BENCHMARK_LIB
NAMES benchmark libbenchmark
PATHS "${EXTERNAL_INSTALL_DIR}/lib/benchmark/Debug"
Expand All @@ -381,22 +404,26 @@ if (BENCHMARK_ENABLED)
message(STATUS "generating benchmark executables")
LIST(APPEND LIBRARIES ${BENCHMARK_LIB})

if (MSVC)
LIST(APPEND LIBRARIES Shlwapi)
if (MSVC OR MINGW)
LIST(APPEND LIBRARIES shlwapi)
else ()
LIST(APPEND LIBRARIES pthread)
endif ()

file(GLOB BENCHMARK_SOURCES "./benchmarks/*.cpp")
file(GLOB_RECURSE BENCHMARK_PROTOTYPES "./benchmarks/prototypes/*.h")
include_directories(benchmarks/prototypes/)
set(BENCHMARK_FILES ${BENCHMARK_SOURCES})

file(GLOB BENCHMARK_CONFIGURATIONS "./benchmarks/*.cmake")
include(${BENCHMARK_CONFIGURATIONS})

foreach (src ${BENCHMARK_FILES})
file(RELATIVE_PATH testfile ${CMAKE_CURRENT_SOURCE_DIR} ${src})
string(REPLACE ".cpp" "" testname ${testfile})
string(REPLACE "benchmarks/" "" testname ${testname})
add_executable(${testname} ${src})
add_executable(${testname} ${src} ${BENCHMARK_PROTOTYPES})
target_link_libraries(${testname} ${LIBRARIES})
add_test(${testname} ${testname})
endforeach ()

enable_testing()
Expand Down
7 changes: 6 additions & 1 deletion Doxyfile
Original file line number Diff line number Diff line change
Expand Up @@ -751,6 +751,10 @@ WARN_LOGFILE =

INPUT = ./src/ \
./include/ \
./docs/ \
./unit-tests/ \
./demos/ \
./benchmarks/

# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
Expand Down Expand Up @@ -786,7 +790,8 @@ FILE_PATTERNS = *.c \
*.hxx \
*.hpp \
*.h++ \
*.py
*.py \
*.md

# The RECURSIVE tag can be used to specify whether or not subdirectories should
# be searched for input files as well.
Expand Down
Loading

0 comments on commit 86ed265

Please sign in to comment.