Skip to content

Commit

Permalink
Merge pull request #20 from boxbackup/windows_binary_packages
Browse files Browse the repository at this point in the history
Build Win32/64 binary packages automatically
  • Loading branch information
qris authored Nov 30, 2017
2 parents 24aca3f + ed55e2b commit a0fa0c4
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 40 deletions.
76 changes: 60 additions & 16 deletions appveyor.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version: 1.0.{build}-{branch}
version: 0.12.{branch}.appveyor_{build}

clone_depth: 1

Expand All @@ -8,53 +8,75 @@ skip_tags: true
os: Windows Server 2012

platform:
# - x86
# - x64
- Win32
- Win32 # CMake sucks
- x64

configuration:
- Debug
- Release

environment:
VisualStudioVersion: 10.0
Generator: Visual Studio 10
VisualStudioVersion: 11.0
Generator_Base: Visual Studio 11 2012
OPENSSL_VERSION: 1.0.2f
PCRE_VERSION: 8.38
CMAKE_UNIBUILD_DIR: '%APPVEYOR_BUILD_FOLDER%\..\cmake'
BOXBACKUP_VERSION_BASE: 0.12

init:
# Uncomment the following two lines to enable RDP access to the virtual machine for debugging.
# - reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0 /f
# - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
- ps: $env:date_string = Get-Date -Format "yyMMdd"
- ps: $env:sane_platform = $($env:PLATFORM.replace("Win32", "x86"))
# http://help.appveyor.com/discussions/problems/2874-how-can-i-add-commit-id-to-build-version
- ps: $env:boxbackup_version_full="$env:BOXBACKUP_VERSION_BASE.$env:APPVEYOR_REPO_BRANCH.$env:date_string.$($env:APPVEYOR_REPO_COMMIT.substring(0,7))"
- ps: Update-AppveyorBuild -Version "$env:boxbackup_version_full"
- ps: $env:compiled_version="$($env:boxbackup_version_full)_Win_$($env:sane_platform)_$($env:CONFIGURATION)"
# The only way to switch between 32-bit and 64-bit compilers appears to be to append " Win64"
# to the generator name if you want a 64-bit build (x64 platform):
- ps: $env:generator_name="$($env:Generator_Base)$(if ($env:PLATFORM.equals('x64')) {' Win64'})"

build:
parallel: true
project: ..\cmake\BoxBackup_Windows.sln
verbosity: minimal

# scripts that run after cloning repository (before the build step, not after!)
install:
# test_bbackupd needs 7zip (or cmake -E tar) to extract tar archives on Windows:
- cinst -y --limit-output 7zip.commandline
# Install cmake.portable instead of cmake, to get it on the path again:
# http://disq.us/p/xdknrt
- cinst -y --limit-output 7zip.commandline nsis.portable
- dir "c:\Program Files"
- dir "c:\Program Files (x86)"
# We don't need strawberryperl on AppVeyor because there is already a Perl in c:\Perl.
# If you are doing this on a fresh box for development, you would probably want to
# install Chocolatey and then run:
# cinst -y cmake strawberryperl git vim visualstudio2012wdx
# cinst -y cmake.portable strawberryperl git vim visualstudio2012wdx
# We install cmake.portable instead of cmake, to get it on the path again
# <http://disq.us/p/xdknrt>.

- '"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x86'
- if not exist %CMAKE_UNIBUILD_DIR% md %CMAKE_UNIBUILD_DIR%
- cd %CMAKE_UNIBUILD_DIR%
# We need to specify the generator here, in case the user has more than one installed.
# CMake always seems to default to the latest version of Visual Studio, not the one on
# the current PATH.
- cmake -G "%Generator%" -A %PLATFORM% %APPVEYOR_BUILD_FOLDER%\infrastructure\cmake\windows
- echo cmake -G "%generator_name%"
-DBOXBACKUP_VERSION=%compiled_version%
-DSUB_CMAKE_EXTRA_ARGS="-- /verbosity:minimal"
%APPVEYOR_BUILD_FOLDER%\infrastructure\cmake\windows
- cmake -G "%generator_name%"
-DBOXBACKUP_VERSION=%compiled_version%
-DSUB_CMAKE_EXTRA_ARGS="-- /verbosity:minimal"
%APPVEYOR_BUILD_FOLDER%\infrastructure\cmake\windows

# Leave the current directory in the correct place to find the solution file using its relative path above.

# Remove Xamarin to remove 500 lines of junk from build logs
# http://help.appveyor.com/discussions/problems/4569-the-target-_convertpdbfiles-listed-in-a-beforetargets-attribute-at-c-does-not-exist-in-the-project-and-will-be-ignored
before_build:
- del "C:\Program Files (x86)\MSBuild\4.0\Microsoft.Common.Targets\ImportAfter\Xamarin.Common.targets"

build:
parallel: true
project: ..\cmake\BoxBackup_Windows.sln
verbosity: minimal

test_script:
- cd %CMAKE_UNIBUILD_DIR%\Build\boxbackup
# - dir
Expand All @@ -63,3 +85,25 @@ test_script:
# - dir %PLATFORM%\%CONFIGURATION%
- ctest -C %CONFIGURATION% -V --interactive-debug-mode 0

# After running tests successfully, build the artifacts that we want to upload:
- cmake --build . --config %CONFIGURATION% --target package

# AppVeyor refuses to package files outside of the project directory, so we need to push them:
- dir
- appveyor PushArtifact -path BoxBackup-%compiled_version%.zip -DeploymentName BoxBackup-%compiled_version%
- appveyor PushArtifact -path BoxBackup-%compiled_version%.exe -DeploymentName BoxBackup-%compiled_version%

deploy:
- provider: GitHub
release: BoxBackup-$(boxbackup_version_full)
artifact: BoxBackup-$(compiled_version)
description: "Windows client binaries auto-built by AppVeyor"
draft: false
prerelease: true
auth_token:
secure: WZi3MJGA5zIIAAij0if4auYeltJlyWUOePTYlCGvrNrgEVjYRkqILHzvVKDnLn43
on:
branch:
- master
- windows_binary_packages

67 changes: 51 additions & 16 deletions infrastructure/cmake/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -78,25 +78,38 @@ foreach(file_to_configure ${files_to_configure})
"${base_dir}/${file_to_configure}.out")
endforeach()

# Work out the current Box version (requires Perl) and update lib/common/BoxVersion.h,
# but only if it has changed, to avoid unnecessary complete rebuilds due to timestamps.
execute_process(
COMMAND ${PERL_EXECUTABLE} ${base_dir}/infrastructure/cmake/getversion.pl
WORKING_DIRECTORY ${base_dir}/infrastructure
RESULT_VARIABLE status
OUTPUT_VARIABLE new_version_define
ERROR_VARIABLE command_output)
if(NOT status EQUAL 0)
message(FATAL_ERROR "Failed to execute: "
"${PERL_EXECUTABLE} ${base_dir}/infrastructure/cmake/getversion.pl: "
"status ${status}: ${command_output}")
# If BOXBACKUP_VERSION is defined when running CMake (as the AppVeyor config does), use it
# as-is, since it contains the full version number, branch, and platform (Win32/Win64):
if(BOXBACKUP_VERSION)
set(boxbackup_version ${BOXBACKUP_VERSION})
# Remove CPACK_SYSTEM_NAME from the default CPACK_PACKAGE_NAME, because it's already
# included in the CPACK_PACKAGE_VERSION:
set(CPACK_PACKAGE_FILE_NAME ${CMAKE_PROJECT_NAME}-${boxbackup_version})
else()
# Work out the current Box version (requires Perl) and update lib/common/BoxVersion.h,
# but only if it has changed, to avoid unnecessary complete rebuilds due to timestamps.
execute_process(
COMMAND ${PERL_EXECUTABLE} ${base_dir}/infrastructure/cmake/getversion.pl
WORKING_DIRECTORY ${base_dir}/infrastructure
RESULT_VARIABLE status
OUTPUT_VARIABLE boxbackup_version
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_VARIABLE command_output)
if(NOT status EQUAL 0)
message(FATAL_ERROR "Failed to execute: "
"${PERL_EXECUTABLE} ${base_dir}/infrastructure/cmake/getversion.pl: "
"status ${status}: ${command_output}")
endif()
endif()
file(WRITE "${base_dir}/lib/common/BoxVersion.h.new" "${new_version_define}")

file(WRITE "${base_dir}/lib/common/BoxVersion.h.new"
"#define BOX_VERSION \"${boxbackup_version}\"\n")
replace_file_if_different(
"${base_dir}/lib/common/BoxVersion.h"
"${base_dir}/lib/common/BoxVersion.h.new")

add_definitions(-DBOX_CMAKE -DNEED_BOX_VERSION_H)

if(WIN32)
add_definitions(-DWIN32)
endif()
Expand Down Expand Up @@ -331,6 +344,16 @@ foreach(module_dep ${module_deps})
endif()
endforeach()

if(WIN32)
install(FILES ${base_dir}/bin/bbackupd/win32/NotifySysAdmin.vbs
DESTINATION "." COMPONENT Extras)
install(FILES ${base_dir}/bin/bbackupd/win32/bbackupd.conf
DESTINATION "." COMPONENT Extras)
else()
install(FILES ${base_dir}/bin/bbackupd/bbackupd-config
DESTINATION "." COMPONENT Extras)
endif()

# We can't do anything conditional on CMAKE_BUILD_TYPE because that's not valid for multi-configuration
# generators such as MSVC. We need to use a generator expression instead.
target_compile_definitions(lib_common PUBLIC $<$<CONFIG:Release>:BOX_RELEASE_BUILD>)
Expand All @@ -353,9 +376,6 @@ if(WIN32)
target_link_libraries(lib_common PUBLIC ws2_32 gdi32)
endif()

# Link to ZLib
# http://stackoverflow.com/a/6174604/648162
include_directories(${base_dir}/../zlib-win32/include)
# On Windows we want to statically link zlib to make debugging and distribution easier,
# but FindZLIB.cmake doesn't offer that as an option, so we have to go through some
# contortions to "find" the correct library. ZLIB_ROOT is required in this case.
Expand Down Expand Up @@ -688,3 +708,18 @@ set_tests_properties(backupdiff PROPERTIES TIMEOUT 32)
set_tests_properties(bbackupd PROPERTIES TIMEOUT 1200)
set_tests_properties(s3store PROPERTIES TIMEOUT 20)
set_tests_properties(httpserver PROPERTIES TIMEOUT 40)

set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Box Backup is an open source, completely automatic, on-line backup system")
set(CPACK_PACKAGE_VENDOR "www.BoxBackup.org")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${base_dir}/README.md")
set(CPACK_RESOURCE_FILE_LICENSE "${base_dir}/LICENSE.txt")
set(CPACK_PACKAGE_VERSION ${boxbackup_version})
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Box Backup")
set(CPACK_COMPONENTS_ALL Applications Extras)
set(CPACK_GENERATOR "ZIP;NSIS")
set(CPACK_NSIS_DISPLAY_NAME "Box Backup")
set(CPACK_NSIS_HELP_LINK "http://www.boxbackup.org/")
set(CPACK_NSIS_URL_INFO_ABOUT "http://www.boxbackup.org/")
set(CPACK_NSIS_CONTACT "boxbackup@boxbackup.org")
set(CPACK_NSIS_MODIFY_PATH ON)
include(CPack)
2 changes: 1 addition & 1 deletion infrastructure/cmake/getversion.pl
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@

require "$basedir/infrastructure/BoxPlatform.pm.in";

print "#define BOX_VERSION \"$BoxPlatform::product_version\"\n";
print "$BoxPlatform::product_version\n";

exit 0;
12 changes: 7 additions & 5 deletions infrastructure/cmake/windows/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ ExternalProject_Add(zlib
URL "http://zlib.net/zlib-${ZLIB_VERSION}.tar.gz"
URL_HASH ${ZLIB_HASH}
DOWNLOAD_NO_PROGRESS 1
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${install_dir}
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${install_dir} ${SUB_CMAKE_EXTRA_ARGS}
# We need to build both versions, debug and release, because cmake requires both to be
# present to generate its multi-configuration project files for Visual Studio/MSBuild.
INSTALL_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target install --config Debug
Expand Down Expand Up @@ -86,7 +86,7 @@ ExternalProject_Add(pcre
SVN_REPOSITORY svn://vcs.exim.org/pcre/code/trunk
SVN_REVISION -r 1677
DOWNLOAD_NO_PROGRESS 1
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${install_dir}
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${install_dir} ${SUB_CMAKE_EXTRA_ARGS}
-DPCRE_SUPPORT_LIBREADLINE=OFF
-DPCRE_SUPPORT_LIBBZ2=OFF
# We need to build both versions, debug and release, because cmake requires both to be
Expand All @@ -100,9 +100,9 @@ ExternalProject_Add(boost
URL "http://downloads.sourceforge.net/project/boost/boost/${BOOST_VERSION}/boost_${BOOST_VERSION_UNDERSCORES}.tar.bz2"
URL_HASH ${BOOST_HASH}
# DOWNLOAD_NO_PROGRESS 1
CONFIGURE_COMMAND "" # none needed
BUILD_COMMAND ${CMAKE_COMMAND} -E echo "No build step needed" # none needed
INSTALL_COMMAND "" # none needed
CONFIGURE_COMMAND ${CMAKE_COMMAND} -E echo "No configure step needed"
BUILD_COMMAND ${CMAKE_COMMAND} -E echo "No build step needed"
INSTALL_COMMAND ${CMAKE_COMMAND} -E echo "No install step needed"
)

if(BOXBACKUP_VERSION)
Expand All @@ -119,8 +119,10 @@ ExternalProject_Add(boxbackup
-DPCRE_ROOT=${install_dir}
-DBOOST_ROOT=${CMAKE_BINARY_DIR}/Source/boost
-DBOX_SUPPORT_READLINE=OFF
-DCMAKE_INSTALL_PREFIX=${install_dir}
-DAPPVEYOR_MODE=1
-DDEBUG=${DEBUG}
${boxbackup_cmake_args}
${SUB_CMAKE_EXTRA_ARGS}
STEP_TARGETS configure build install
)
13 changes: 11 additions & 2 deletions test/common/testcommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -312,10 +312,19 @@ int test(int argc, const char *argv[])
// Check that using timer methods without initialisation
// throws an assertion failure. Can only do this in debug mode
#ifndef BOX_RELEASE_BUILD
TEST_CHECK_THROWS(Timer t1(900, "t1"), CommonException,
AssertFailed);
{
TEST_CHECK_THROWS(Timers::Cleanup(), CommonException,
AssertFailed);

Timer tim(0, "tim");
TEST_CHECK_THROWS(Timers::Add(tim), CommonException, AssertFailed);
Timers::Remove(tim);

TEST_CHECK_THROWS(Timer t1(900, "t1"), CommonException,
AssertFailed);

// TEST_CHECK_THROWS(Timers::Signal(), CommonException, AssertFailed);
}
#endif

// Check that we can initialise the timers
Expand Down

0 comments on commit a0fa0c4

Please sign in to comment.