forked from pEp.foundation/libpEpAdapter
Compare commits
1 Commits
Author | SHA1 | Date |
---|---|---|
|
b4c8257c85 | 3 years ago |
@ -1,42 +0,0 @@
|
||||
BasedOnStyle: LLVM
|
||||
Language: Cpp
|
||||
Standard: c++11
|
||||
DerivePointerAlignment: true
|
||||
SortIncludes: false
|
||||
ReflowComments: false
|
||||
PointerAlignment: Left
|
||||
AlignAfterOpenBracket: AlwaysBreak
|
||||
AlignOperands: AlignAfterOperator
|
||||
BreakConstructorInitializers: AfterColon
|
||||
AlignTrailingComments: true
|
||||
AllowAllArgumentsOnNextLine: false
|
||||
AllowAllParametersOfDeclarationOnNextLine: false
|
||||
AllowShortEnumsOnASingleLine: false
|
||||
AllowShortFunctionsOnASingleLine: Empty
|
||||
AllowShortIfStatementsOnASingleLine: Never
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AlwaysBreakTemplateDeclarations: Yes
|
||||
BinPackArguments: false
|
||||
BinPackParameters: false
|
||||
ExperimentalAutoDetectBinPacking: true
|
||||
BreakBeforeBraces: Custom
|
||||
BraceWrapping:
|
||||
AfterFunction: true
|
||||
ColumnLimit: 100
|
||||
AllowAllConstructorInitializersOnNextLine: false
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
AlwaysBreakAfterReturnType: None
|
||||
PenaltyBreakBeforeFirstCallParameter: 0
|
||||
PenaltyReturnTypeOnItsOwnLine: 1000000
|
||||
PenaltyBreakAssignment: 1000000
|
||||
PenaltyExcessCharacter: 10
|
||||
IndentCaseLabels: true
|
||||
IndentWidth: 4
|
||||
MaxEmptyLinesToKeep: 2
|
||||
NamespaceIndentation: All
|
||||
SpaceAfterTemplateKeyword: false
|
||||
AccessModifierOffset: -4
|
||||
AllowShortBlocksOnASingleLine: Always
|
||||
IndentPPDirectives: BeforeHash
|
||||
Cpp11BracedListStyle: false
|
||||
BreakStringLiterals: false
|
@ -1,59 +0,0 @@
|
||||
*.o
|
||||
*.a
|
||||
*.d
|
||||
*.swp
|
||||
.DS_Store
|
||||
ws
|
||||
test_adapter
|
||||
.gnupg
|
||||
.pEp*
|
||||
lib
|
||||
local.conf
|
||||
build/
|
||||
# Default ignored files
|
||||
?idea/
|
||||
# Windows
|
||||
build-windows/Debug/
|
||||
build-windows/Release/
|
||||
build-windows/libpEpAdapter.vcxproj.user
|
||||
*.dSYM
|
||||
test_group
|
||||
test_adapter_cxx
|
||||
test_ensure_passphrase
|
||||
test_leave_device_group
|
||||
test_library
|
||||
test_message_cache
|
||||
test_passphrase_cache
|
||||
test_semaphore
|
||||
test_lm_dummy
|
||||
test_sqlite3
|
||||
test_pEpsqlite
|
||||
test_listmanager_dummy
|
||||
test_tofu_react
|
||||
test_pEpLog_basic
|
||||
/test/pitytest_data
|
||||
|
||||
*.db
|
||||
|
||||
/test/pitytest11/test/test_transport
|
||||
/test/pitytest11/test/test_processdirs
|
||||
/test/pitytest11/test/test_execmodes
|
||||
/test/pitytest11/test/test_linear
|
||||
/test/pitytest11/test/test_model
|
||||
/test/pitytest11/pitytest_data/*
|
||||
/test/pitytest11/test/test_swarm
|
||||
/test/test_update_ident
|
||||
/test/test_template_swarm_single
|
||||
/test/test_template_swarm_multi
|
||||
/test/pitytest11/test/test_copy
|
||||
/test/pitytest11/test/test_pitytree
|
||||
/test/test_suite_all
|
||||
/test/test_sync_init
|
||||
/test/test_tofu2
|
||||
/test/pitytest11/test/test_assert
|
||||
/test/test_tofu
|
||||
/test/test_tofu_one2many
|
||||
/test/test_swarm_group
|
||||
/test/pitytest11/test/pitytest_data/
|
||||
/test/test_pEpSQLite
|
||||
/test/test_swarm_tofu
|
@ -1,22 +0,0 @@
|
||||
.ensure_docker: &ensure_docker
|
||||
# Check for docker and install if missing
|
||||
- 'which docker || ( sudo apt-get update -y && sudo apt-get install docker.io -y )'
|
||||
|
||||
.ensure_rsync: &ensure_rsync
|
||||
# Install rsync and deps if missing
|
||||
- 'which ssh-agent || ( sudo apt-get update -y && sudo apt-get install openssh-client -y )'
|
||||
- 'which rsync || ( sudo apt-get update -y && sudo apt-get install rsync -y )'
|
||||
- 'which make || ( sudo apt-get update -y && sudo apt-get install make -y )'
|
||||
|
||||
.standard_job:
|
||||
tags: [kvm]
|
||||
before_script:
|
||||
- *ensure_docker
|
||||
- *ensure_rsync
|
||||
|
||||
.make_in_docker:
|
||||
extends: .standard_job
|
||||
script:
|
||||
- docker login -u ${DOCKER_REGISTRY_USER} -p ${DOCKER_REGISTRY_PASS} ${DOCKER_REGISTRY_HOST}
|
||||
- cd scripts/${CI_DISTRO_TARGET}
|
||||
- make
|
@ -1,27 +0,0 @@
|
||||
include:
|
||||
- '.gitlab-ci-files/common-prepare.yml'
|
||||
|
||||
stages:
|
||||
- build
|
||||
|
||||
|
||||
# Debian
|
||||
|
||||
debian10:build:
|
||||
extends: .make_in_docker
|
||||
stage: build
|
||||
variables:
|
||||
CI_DISTRO_TARGET: "debian10"
|
||||
DEBIAN_FRONTEND: "noninteractive"
|
||||
rules:
|
||||
- if: '$CI_COMMIT_TAG !~ /^Release_[0-9]+\.[0-9]+\.[0-9]+$/'
|
||||
|
||||
debian10:tagged-build:
|
||||
extends: .make_in_docker
|
||||
stage: build
|
||||
variables:
|
||||
CI_DISTRO_TARGET: "debian10"
|
||||
DEBIAN_FRONTEND: "noninteractive"
|
||||
TAGGED_BUILD: "true"
|
||||
rules:
|
||||
- if: '$CI_COMMIT_TAG =~ /^Release_[0-9]+\.[0-9]+\.[0-9]+$/'
|
@ -0,0 +1,13 @@
|
||||
syntax: glob
|
||||
*.o
|
||||
*.a
|
||||
*.swp
|
||||
ws
|
||||
test_adapter
|
||||
.gnupg
|
||||
.pEp*
|
||||
lib
|
||||
local.conf
|
||||
build/
|
||||
# Default ignored files
|
||||
.idea/workspace.xml
|
@ -0,0 +1,138 @@
|
||||
// This file is under GNU General Public License 3.0
|
||||
// see LICENSE.txt
|
||||
|
||||
#include "Adapter.hh"
|
||||
#include <sstream>
|
||||
#include <iomanip>
|
||||
#include <assert.h>
|
||||
#include "status_to_string.hh"
|
||||
#include "pEpLog.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace pEp {
|
||||
void throw_status(PEP_STATUS status)
|
||||
{
|
||||
if (status == PEP_STATUS_OK)
|
||||
return;
|
||||
if (status >= 0x400 && status <= 0x4ff)
|
||||
return;
|
||||
if (status == PEP_OUT_OF_MEMORY)
|
||||
throw bad_alloc();
|
||||
if (status == PEP_ILLEGAL_VALUE)
|
||||
throw invalid_argument("illegal value");
|
||||
|
||||
string _status = status_to_string(status);
|
||||
throw RuntimeError(_status, status);
|
||||
}
|
||||
|
||||
RuntimeError::RuntimeError(const std::string& _text, PEP_STATUS _status)
|
||||
: std::runtime_error(_text.c_str()), text(_text), status(_status)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
namespace Adapter {
|
||||
messageToSend_t _messageToSend = nullptr;
|
||||
notifyHandshake_t _notifyHandshake = nullptr;
|
||||
std::thread *_sync_thread = nullptr;
|
||||
|
||||
::utility::locked_queue< SYNC_EVENT, ::free_Sync_event > q;
|
||||
std::mutex m;
|
||||
|
||||
int _inject_sync_event(SYNC_EVENT ev, void *management)
|
||||
{
|
||||
try {
|
||||
if (ev == nullptr) {
|
||||
q.clear();
|
||||
q.push_back(ev);
|
||||
}
|
||||
else {
|
||||
q.push_front(ev);
|
||||
}
|
||||
}
|
||||
catch (exception&) {
|
||||
return 1;
|
||||
}
|
||||
if (ev == nullptr) {
|
||||
if (!on_sync_thread()) {
|
||||
if(_sync_thread->joinable()) {
|
||||
pEpLog("Waiting for Sync thread to join...");
|
||||
_sync_thread->join();
|
||||
delete _sync_thread;
|
||||
_sync_thread = nullptr;
|
||||
pEpLog("...thread joined");
|
||||
q.clear();
|
||||
} else {
|
||||
//FATAL
|
||||
pEpLog("FATAL: sync thread not joinable/detached");
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// threshold: max waiting time in seconds
|
||||
SYNC_EVENT _retrieve_next_sync_event(void *management, unsigned threshold)
|
||||
{
|
||||
SYNC_EVENT syncEvent = nullptr;
|
||||
const bool success = q.try_pop_front(syncEvent, std::chrono::seconds(threshold));
|
||||
|
||||
if (!success)
|
||||
return new_sync_timeout_event();
|
||||
|
||||
return syncEvent;
|
||||
}
|
||||
|
||||
bool on_sync_thread()
|
||||
{
|
||||
if (_sync_thread && _sync_thread->get_id() == this_thread::get_id())
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
PEP_SESSION session(session_action action)
|
||||
{
|
||||
std::lock_guard<mutex> lock(m);
|
||||
bool in_sync = on_sync_thread();
|
||||
|
||||
thread_local static PEP_SESSION _session = nullptr;
|
||||
PEP_STATUS status = PEP_STATUS_OK;
|
||||
|
||||
switch (action) {
|
||||
case release:
|
||||
if (_session) {
|
||||
::release(_session);
|
||||
_session = nullptr;
|
||||
}
|
||||
break;
|
||||
|
||||
case init:
|
||||
if (!_session)
|
||||
status = ::init(&_session, _messageToSend, _inject_sync_event);
|
||||
break;
|
||||
|
||||
default:
|
||||
status = PEP_ILLEGAL_VALUE;
|
||||
}
|
||||
|
||||
throw_status(status);
|
||||
return _session;
|
||||
}
|
||||
|
||||
void shutdown()
|
||||
{
|
||||
pEpLog("called");
|
||||
if (_sync_thread) {
|
||||
pEpLog("sync_is_running - injecting null event");
|
||||
_inject_sync_event(nullptr, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
bool is_sync_running()
|
||||
{
|
||||
return _sync_thread != nullptr;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
// This file is under GNU General Public License 3.0
|
||||
// see LICENSE.txt
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
#include <pEp/sync_api.h>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace pEp {
|
||||
|
||||
// throws std::bad_alloc if status==PEP_OUT_OF_MEMORY,
|
||||
// throws std::invalid_argument if status==PEP_ILLEGAL_VALUE,
|
||||
// throws RuntimeError when 'status' represents another exceptional value.
|
||||
void throw_status(PEP_STATUS status);
|
||||
|
||||
struct RuntimeError : std::runtime_error {
|
||||
RuntimeError(const std::string& _text, PEP_STATUS _status);
|
||||
std::string text;
|
||||
PEP_STATUS status;
|
||||
};
|
||||
|
||||
namespace Adapter {
|
||||
int _inject_sync_event(SYNC_EVENT ev, void *management);
|
||||
|
||||
template<class T = void>
|
||||
void startup(
|
||||
messageToSend_t messageToSend,
|
||||
notifyHandshake_t notifyHandshake,
|
||||
T *obj = nullptr,
|
||||
std::function< void (T *) > _startup = nullptr,
|
||||
std::function< void (T *) > _shutdown = nullptr
|
||||
) throw (RuntimeError);
|
||||
|
||||
// returns 'true' when called from the "sync" thread, 'false' otherwise.
|
||||
bool on_sync_thread();
|
||||
|
||||
enum session_action {
|
||||
init,
|
||||
release
|
||||
};
|
||||
PEP_SESSION session(session_action action = init);
|
||||
|
||||
// injects a NULL event into sync_event_queue to denote sync thread to shutdown,
|
||||
// and joins & removes the sync thread
|
||||
void shutdown();
|
||||
|
||||
bool is_sync_running();
|
||||
}
|
||||
}
|
||||
|
||||
#include "Adapter.hxx"
|
@ -0,0 +1,93 @@
|
||||
// This file is under GNU General Public License 3.0
|
||||
// see LICENSE.txt
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <thread>
|
||||
#include "locked_queue.hh"
|
||||
#include <cassert>
|
||||
#include "pEpLog.hh"
|
||||
|
||||
namespace pEp {
|
||||
namespace Adapter {
|
||||
using std::function;
|
||||
|
||||
extern messageToSend_t _messageToSend;
|
||||
extern notifyHandshake_t _notifyHandshake;
|
||||
extern std::thread *_sync_thread;
|
||||
|
||||
extern ::utility::locked_queue< SYNC_EVENT, ::free_Sync_event > q;
|
||||
extern std::mutex m;
|
||||
|
||||
SYNC_EVENT _retrieve_next_sync_event(void *management, unsigned threshold);
|
||||
|
||||
static std::exception_ptr _ex;
|
||||
static bool register_done = false;
|
||||
|
||||
template< class T > void sync_thread(T *obj, function< void(T *) > _startup, function< void(T *) > _shutdown)
|
||||
{
|
||||
_ex = nullptr;
|
||||
assert(_messageToSend);
|
||||
assert(_notifyHandshake);
|
||||
if (obj && _startup)
|
||||
_startup(obj);
|
||||
|
||||
session();
|
||||
|
||||
{
|
||||
PEP_STATUS status = register_sync_callbacks(session(), nullptr,
|
||||
_notifyHandshake, _retrieve_next_sync_event);
|
||||
try {
|
||||
throw_status(status);
|
||||
register_done = true;
|
||||
}
|
||||
catch (...) {
|
||||
_ex = std::current_exception();
|
||||
register_done = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pEpLog("sync protocol loop started");
|
||||
do_sync_protocol(session(), (void *)obj);
|
||||
pEpLog("sync protocol loop ended");
|
||||
unregister_sync_callbacks(session());
|
||||
|
||||
session(release);
|
||||
|
||||
if (obj && _shutdown)
|
||||
_shutdown(obj);
|
||||
}
|
||||
|
||||
template< class T > void startup(
|
||||
messageToSend_t messageToSend,
|
||||
notifyHandshake_t notifyHandshake,
|
||||
T *obj,
|
||||
function< void(T *) > _startup,
|
||||
function< void(T *) > _shutdown
|
||||
)
|
||||
throw (RuntimeError)
|
||||
{
|
||||
if (messageToSend)
|
||||
_messageToSend = messageToSend;
|
||||
|
||||
if (notifyHandshake)
|
||||
_notifyHandshake = notifyHandshake;
|
||||
|
||||
session();
|
||||
|
||||
if (!_sync_thread) {
|
||||
register_done = false;
|
||||
_sync_thread = new std::thread(sync_thread<T>, obj, _startup, _shutdown);
|
||||
while (!register_done)
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
|
||||
if (_ex) {
|
||||
delete _sync_thread;
|
||||
_sync_thread = nullptr;
|
||||
std::rethrow_exception(_ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
# 1st Party Dependencies
|
||||
## Prefer git tags instead of SHA hashes when possible.
|
||||
|
||||
# Change:
|
||||
# libpEpAdapter does not specify any dependencies atm.
|
||||
# libpEpAdapter is always being used as part of an adapter
|
||||
# This adapter has to specify the pEpEngine version .e.g
|
||||
|
||||
|
||||
# fdik: dep graph has to be taken from DEP file
|
||||
# fdik: dependencies need to be resolved recursively from top to bottom
|
||||
# fdik: stack then needs to be built from the bottom up
|
@ -1,40 +1,53 @@
|
||||
# Copyright 2018, pEp Foundation
|
||||
# This file is part of libpEpAdapter
|
||||
# This file is part of lib pEp Adapter
|
||||
# This file may be used under the terms of the GNU General Public License version 3
|
||||
# see LICENSE.txt
|
||||
|
||||
HERE:=$(dir $(lastword $(MAKEFILE_LIST)))
|
||||
|
||||
TARGET=libpEpAdapter.a
|
||||
|
||||
# Build config
|
||||
# Defaults
|
||||
DEBUG=1
|
||||
PREFIX?=$(HOME)
|
||||
|
||||
CXXFLAGS+=-std=c++11 -fPIC
|
||||
PREFIX=$(HOME)
|
||||
CXXFLAGS=-std=c++11
|
||||
|
||||
# Overrides
|
||||
-include $(HERE)local.conf
|
||||
# Build target
|
||||
BUILD_FOR:=$(shell uname)
|
||||
|
||||
# Constants
|
||||
CXXFLAGS+=-std=c++11 -fPIC
|
||||
CXXFLAGS+=-I$(PREFIX)/include
|
||||
LDFLAGS+=-L$(PREFIX)/lib
|
||||
|
||||
ifneq (,$(findstring g++,$(CXX)))
|
||||
CXXFLAGS+=-fdiagnostics-color=always
|
||||
else ifneq (,$(findstring clang,$(CXX)))
|
||||
CXXFLAGS+=-fcolor-diagnostics
|
||||
ifeq ($(BUILD_FOR),Linux)
|
||||
$(info Building for Linux)
|
||||
CXX=g++
|
||||
CXXFLAGS+=-fdiagnostics-color=always -O0 $(ENGINE_INC) -fPIC
|
||||
else ifeq ($(BUILD_FOR),Darwin)
|
||||
$(info Building for Darwin)
|
||||
CXX=clang
|
||||
CXXFLAGS+=-fcolor-diagnostics -O0 $(ENGINE_INC)
|
||||
endif
|
||||
|
||||
# Debug or Release build
|
||||
DEBUG=1
|
||||
ifeq ($(DEBUG),1)
|
||||
CXXFLAGS+=-g -O0
|
||||
$(info Debug build (set DEBUG=0 for release build))
|
||||
CXXFLAGS+=-g
|
||||
else
|
||||
CXXFLAGS+=-DNDEBUG=1 -O3
|
||||
$(info Release Build (set DEBUG=1 for debug build))
|
||||
CXXFLAGS+=-DNDEBUG=1
|
||||
endif
|
||||
|
||||
ifndef ENGINE_TEST
|
||||
ENGINE_TEST = \"$(HOME)/dev/pEpEngine/test\"
|
||||
######### Engine #########
|
||||
ENGINE_LIB_PATH=$(HOME)/lib
|
||||
ENGINE_INC_PATH=$(HOME)/include
|
||||
|
||||
######### Overrides #########
|
||||
-include $(HERE)/local.conf
|
||||
|
||||
# Add -L Prefixes to LIB/INC paths,
|
||||
# if not already explicitly set in local.conf
|
||||
ifndef ENGINE_LIB
|
||||
ENGINE_LIB=-L$(ENGINE_LIB_PATH)
|
||||
endif
|
||||
ifndef ENGINE_INC
|
||||
ENGINE_INC=-I$(ENGINE_INC_PATH)
|
||||
endif
|
||||
|
||||
ifdef BUILD_CONFIG
|
||||
include $(BUILD_CONFIG)
|
||||
endif
|
||||
|
@ -1,450 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Text Include="ReadMe.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\*.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\*.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -0,0 +1,8 @@
|
||||
// this file is under GNU GPL 3.0, see LICENSE.txt
|
||||
|
||||
#include "call_with_lock.hh"
|
||||
|
||||
namespace pEp
|
||||
{
|
||||
std::mutex call_with_lock_mutex;
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
// this file is under GNU GPL 3.0, see LICENSE.txt
|
||||
|
||||
#ifndef PEP_CALL_WITH_LOCK_HH
|
||||
#define PEP_CALL_WITH_LOCK_HH
|
||||
|
||||
#include <mutex>
|
||||
|
||||
namespace pEp
|
||||
{
|
||||
extern std::mutex call_with_lock_mutex;
|
||||
|
||||
// TODO: use && and std::forward<> to avoid copying of the arguments.
|
||||
// It is not relevant, yet, because at the moment we use this function template only
|
||||
// for init() and release() which have cheap-to-copy pointer parameters only
|
||||
template<class R, class... Args>
|
||||
R call_with_lock( R(*fn)(Args...), Args... args)
|
||||
{
|
||||
std::lock_guard<std::mutex> L(call_with_lock_mutex);
|
||||
return fn(args...);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // PEP_CALL_WITH_LOCK_HH
|
@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Text Include="ReadMe.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\Adapter.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\status_to_string.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\call_with_lock.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\slurp.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\Adapter.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\locked_queue.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\pc_container.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\Adapter.hxx">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\status_to_string.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\slurp.hh">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -1,16 +0,0 @@
|
||||
# This is an Example build config file (local.conf)
|
||||
# you might not need this file, but if the defaults dont work for you
|
||||
# You can override them here.
|
||||
# Tweak the values to your needs and rename it to local.conf
|
||||
|
||||
######### C++ Compiler #########
|
||||
# Should work with clang and g++
|
||||
# CXX=g++
|
||||
# DEBUG=1 # DEBUG Build (Default)
|
||||
# DEBUG=0 # RELEASE Build
|
||||
|
||||
############# DIRS #############
|
||||
# PREFIX=$(HOME)/local
|
||||
# ENGINE_LIB_PATH=$(PREFIX)/lib
|
||||
# ENGINE_INC_PATH=$(PREFIX)/include
|
||||
# ENGINE_TEST=
|
@ -0,0 +1,7 @@
|
||||
// TODO: put into not yet existing libpEpAdapter_utils.h, to be across whole libpEpAdapter
|
||||
#ifdef NDEBUG
|
||||
#define pEpLog(msg) do{}while(0)
|
||||
#else
|
||||
#include <iostream>
|
||||
#define pEpLog(msg) do{std::cerr << __FILE__ << "::" << __FUNCTION__ << " - " << msg << '\n';} while(0)
|
||||
#endif
|
@ -1,15 +0,0 @@
|
||||
CURRENT_DISTRO=$(shell basename $(shell pwd))
|
||||
LIBPEPADAPTER_VERSION=$(shell git rev-parse --short=8 HEAD)
|
||||
IMAGE_NAME=${DOCKER_REGISTRY_HOST}/pep-$(CURRENT_DISTRO)-libpepadapter
|
||||
DOCKERFILE=libpEpAdapter.$(CURRENT_DISTRO).Dockerfile
|
||||
all:
|
||||
-docker pull $(IMAGE_NAME):latest
|
||||
cd ../../ && docker build --build-arg CURRENT_DISTRO=$(CURRENT_DISTRO) \
|
||||
--build-arg DOCKER_REGISTRY_HOST=${DOCKER_REGISTRY_HOST} \
|
||||
--build-arg LIBPEPADAPTER_VERSION=$(LIBPEPADAPTER_VERSION) \
|
||||
--cache-from $(IMAGE_NAME):latest \
|
||||
--tag=$(IMAGE_NAME):$(LIBPEPADAPTER_VERSION) \
|
||||
--tag=$(IMAGE_NAME):latest \
|
||||
-f scripts/${CURRENT_DISTRO}/$(DOCKERFILE) .
|
||||
docker push $(IMAGE_NAME):${LIBPEPADAPTER_VERSION}
|
||||
docker push $(IMAGE_NAME):latest
|
@ -1,8 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
set -exo
|
||||
|
||||
echo "ENGINE_LIB_PATH=${INSTPREFIX}/lib" >> local.conf
|
||||
echo "ENGINE_INC_PATH=${INSTPREFIX}/include" >> local.conf
|
||||
|
||||
make
|
||||