diff --git a/.travis.yml b/.travis.yml index f763982..955c119 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,45 +1,53 @@ -dist: trusty - language: cpp -sudo: required - -env: - global: - - SUDO_MOUNT=sudo - -os: - - linux - - osx - -compiler: - - clang - - gcc - matrix: - exclude: - - os: osx + include: + - os: linux compiler: gcc + dist: trusty + sudo: false + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - attr + - fuse + - libfuse-dev + - gettext + - cmake3 + env: + - INTEGRATION=false -branches: - only: - - master - - travis + - os: linux + compiler: clang + dist: trusty + sudo: true + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-4.0 + packages: + - attr + - fuse + - libfuse-dev + - gettext + - cmake3 + - clang-4.0 + - clang-tidy-4.0 + env: + - CC=clang-4.0 CXX=clang++-4.0 CHECK=true INTEGRATION=true SUDO_MOUNT=sudo + + - os: osx + compiler: clang + osx_image: xcode8.3 + sudo: true + env: + - INTEGRATION=true SUDO_MOUNT=sudo before_script: - ./ci/setup.sh script: - - ./ci/check.sh - -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - attr - - clang - - fuse - - libfuse-dev - - gettext - - cmake3 + - ./build.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index bceacec..76e617a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,6 +93,23 @@ check_cxx_source_compiles ("#include int main() { getxattr(0,0,0,0,0,0); return 1; } " XATTR_ADD_OPT) +# If awailable on current architecture (typically embedded 32-bit), link with it explicitly; +# GCC autodetection is faulty, see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81358 and +# find_libray is no great help here since it is sometimes(!) not in standard paths. +set(CMAKE_REQUIRED_FLAGS "-latomic") +CHECK_CXX_SOURCE_COMPILES("int main() {return 0;}" COMPILER_NEEDS_LATOMIC) +if(COMPILER_NEEDS_LATOMIC) + set(ATOMIC_LIBRARY atomic) +endif() +# compensate the effect of extra linking of libatomic on platforms where intrinsics are used +set(CMAKE_REQUIRED_FLAGS "-Wl,--as-needed") +CHECK_CXX_SOURCE_COMPILES("int main() {return 0;}" LINKER_SUPPORTS_WLASNEEDED) +if(LINKER_SUPPORTS_WLASNEEDED) + list(APPEND EXTRA_LINKER_FLAGS "-Wl,--as-needed") +endif() + +set(CMAKE_REQUIRED_FLAGS) + # Check if we have some standard functions. include (CheckFuncs) check_function_exists_glibc (lchmod HAVE_LCHMOD) @@ -146,7 +163,7 @@ if (ENABLE_NLS) endif (ENABLE_NLS) if (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 3.5) # Need 3.6 or above. - find_program(CLANG_TIDY_EXE NAMES "clang-tidy" DOC "Path to clang-tidy executable") + find_program(CLANG_TIDY_EXE NAMES "clang-tidy" "clang-tidy-4.0" DOC "Path to clang-tidy executable") if(NOT CLANG_TIDY_EXE) message(STATUS "clang-tidy not found.") else() @@ -154,6 +171,8 @@ if (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 3.5) # Need 3.6 or abo set(DO_CLANG_TIDY "${CLANG_TIDY_EXE}" "-checks=*,-modernize-loop-convert,-cppcoreguidelines-pro-*,-readability-inconsistent-declaration-parameter-name,-google-readability-casting,-cert-err58-cpp,-google-runtime-int,-readability-named-parameter,-google-build-using-namespace,-misc-unused-parameters,-google-runtime-references") #set(DO_CLANG_TIDY "${CLANG_TIDY_EXE}" "-fix" "-checks=-*,google-readability-redundant-smartptr-get") endif() +else() + message(STATUS "clang-tidy check skipped, need newer cmake") endif() if (USE_INTERNAL_TINYXML) @@ -214,12 +233,14 @@ set_target_properties(encfs PROPERTIES VERSION ${ENCFS_VERSION} SOVERSION ${ENCFS_SOVERSION}) target_link_libraries(encfs + ${EXTRA_LINKER_FLAGS} ${FUSE_LIBRARIES} ${OPENSSL_LIBRARIES} ${TINYXML_LIBRARIES} ${EASYLOGGING_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Intl_LIBRARIES} + ${ATOMIC_LIBRARY} ) if (INSTALL_LIBENCFS) install (TARGETS encfs DESTINATION ${LIB_INSTALL_DIR}) diff --git a/INSTALL.md b/INSTALL.md index 662f4d0..f8f0302 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -10,7 +10,11 @@ Compiling EncFS EncFS uses the CMake toolchain to create makefiles. -Steps to build EncFS: +Quickest way to build and test EncFS : + + ./build.sh + +Or following are the detailed steps to build EncFS: mkdir build cd build @@ -29,11 +33,11 @@ encrypted filesystem and run tests on it: make integration The compilation process creates two executables, encfs and encfsctl in -the encfs directory. You can install to in a system directory via +the encfs directory. You can install to in a system directory via: make install -. If the default path (`/usr/local`) is not where you want things +If the default path (`/usr/local`) is not where you want things installed, then set the CMAKE_INSTALL_PREFIX option when running cmake. Eg: cmake .. -DCMAKE_INSTALL_PREFIX=/opt/local diff --git a/README.md b/README.md index cf19cce..26285d6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # EncFS - an Encrypted Filesystem _Build Status_ - - Circle: [![Circle CI](https://circleci.com/gh/vgough/encfs.svg?style=svg)](https://circleci.com/gh/vgough/encfs) - Travis: [![Travis CI](https://travis-ci.org/vgough/encfs.svg?branch=master)](https://travis-ci.org/vgough/encfs) ## About diff --git a/build.sh b/build.sh index 87985de..af1b323 100755 --- a/build.sh +++ b/build.sh @@ -1,15 +1,33 @@ #!/bin/bash -eu -# Make sure we are in the directory this script is in. -cd "$(dirname "$0")" +: ${CHECK:=false} +: ${INTEGRATION:=true} + +cmake --version + +CFG=$* +if [[ "$CHECK" == "true" ]]; then + CFG="-DLINT=ON $CFG" +fi + +if uname -s | grep -q Darwin; then + CFG="-DENABLE_NLS=OFF -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl $CFG" +fi if [[ ! -d build ]] then - mkdir build - cd build - cmake .. $* - cd .. + mkdir build fi -make -j2 -C build +cd build +cmake .. ${CFG} +make -j2 +make test +if [[ "$INTEGRATION" == "true" ]]; then + make integration +fi +cd .. + +echo +echo 'Everything looks good, you can install via "make install -C build".' diff --git a/ci/check.sh b/ci/check.sh deleted file mode 100755 index 5d5e9ca..0000000 --- a/ci/check.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -eu - -cmake --version - -CFG="" -if [ "$TRAVIS_OS_NAME" = "osx" ]; then - CFG="-DENABLE_NLS=OFF -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl" -fi - -if [[ ! -d build ]] -then - mkdir build -fi - -cd build -cmake .. ${CFG} -make -j2 -make test - -cd .. - diff --git a/ci/config.sh b/ci/config.sh deleted file mode 100755 index 96c4ee3..0000000 --- a/ci/config.sh +++ /dev/null @@ -1,5 +0,0 @@ -set -x -set -e -mkdir build -cd build -cmake -DCMAKE_INSTALL_PREFIX:PATH=/tmp/encfs -DCMAKE_BUILD_TYPE=Debug .. diff --git a/ci/install-gcc.sh b/ci/install-gcc.sh deleted file mode 100755 index c147819..0000000 --- a/ci/install-gcc.sh +++ /dev/null @@ -1,5 +0,0 @@ -set -x -set -e -sudo apt-get install -y gcc-4.8 g++-4.8 -sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100 -sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 100 diff --git a/ci/setup.sh b/ci/setup.sh index 1482194..81bc0ce 100755 --- a/ci/setup.sh +++ b/ci/setup.sh @@ -1,10 +1,23 @@ #!/bin/bash -eu -if [ "$TRAVIS_OS_NAME" == "linux" ]; then - sudo modprobe fuse +: ${INTEGRATION:=false} +: ${CHECK:=false} + +if [[ "$INTEGRATION" == "true" ]]; then + if uname -s | grep -q Linux; then + sudo modprobe fuse + elif uname -s | grep -q Darwin; then + brew cask install osxfuse + fi fi -if [ "$TRAVIS_OS_NAME" == "osx" ]; then - brew cask install osxfuse +if [[ "$CHECK" == "true" ]]; then + if uname -s | grep -q Linux; then + wget https://cmake.org/files/v3.9/cmake-3.9.1-Linux-x86_64.tar.gz -O /tmp/cmake.tar.gz + tar -C /tmp/ -xf /tmp/cmake.tar.gz + sudo rm -f $(which cmake) + sudo ln -s $(ls -1 /tmp/cmake*/bin/cmake) /bin/ + fi fi + diff --git a/circle.yml b/circle.yml deleted file mode 100644 index c570296..0000000 --- a/circle.yml +++ /dev/null @@ -1,14 +0,0 @@ -machine: - timezone: - America/Los_Angeles - -dependencies: - pre: - - sudo apt-get install cmake libfuse-dev libgettextpo-dev - - bash ./ci/install-gcc.sh - -test: - override: - - bash ./ci/config.sh - - cd build && make && make test && make install - - /tmp/encfs/bin/encfsctl --version diff --git a/devmode b/devmode index f77a73a..33df3a2 100755 --- a/devmode +++ b/devmode @@ -2,4 +2,4 @@ # After running, chdir to the build subdir ane run "make" mkdir build cd build && cmake .. -DCMAKE_BUILD_TYPE=Debug -DLINT=ON \ - -DCMAKE_CXX_FLAGS="-O1 -fsanitize=address -fno-omit-frame-pointer" $@ + -DCMAKE_CXX_FLAGS="-O0 -g -fsanitize=address -fno-omit-frame-pointer" $@ diff --git a/integration.sh b/integration.sh index 032adcc..d76c345 100755 --- a/integration.sh +++ b/integration.sh @@ -3,4 +3,4 @@ # Make sure we are in the directory this script is in. cd "$(dirname "$0")" -perl -MTest::Harness -e '$$Test::Harness::debug=1; runtests @ARGV;' integration/*.t.pl +perl -I. -MTest::Harness -e '$$Test::Harness::debug=1; runtests @ARGV;' integration/*.t.pl