Add a makefile

Replace the python scripts for building the shared lib and tests with a
Makefile, which makes it easier to handle a mix of C and C++.
This commit is contained in:
Richard van der Hoff 2016-05-13 11:36:41 +01:00
parent acae4e8438
commit b3a7a6b36c
4 changed files with 78 additions and 79 deletions

69
Makefile Normal file
View file

@ -0,0 +1,69 @@
#!/usr/bin/make -f
BUILD_DIR := build
OPTIMIZE_FLAGS ?= -g -O3
TEST_OPTIMIZE_FLAGS ?= -g -O0
CC = gcc
TARGET := $(BUILD_DIR)/libolm.so
SOURCES := $(wildcard src/*.cpp) $(wildcard src/*.c)
OBJECTS := $(patsubst src/%,$(BUILD_DIR)/%,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES))))
TEST_SOURCES := $(wildcard tests/test_*.cpp) $(wildcard tests/test_*.c)
TEST_BINARIES := $(patsubst tests/%,$(BUILD_DIR)/%,$(patsubst %.c,%,$(patsubst %.cpp,%,$(TEST_SOURCES))))
CPPFLAGS += -Iinclude -Ilib
CFLAGS += -Wall --std=c89 -fPIC
CXXFLAGS += -Wall --std=c++11 -fPIC
LDFLAGS += -Wall
# generate .d files when compiling
CPPFLAGS += -MMD
### per-target variables
$(OBJECTS): CFLAGS += $(OPTIMIZE_FLAGS)
$(OBJECTS): CXXFLAGS += $(OPTIMIZE_FLAGS)
$(TARGET): LDFLAGS += $(OPTIMIZE_FLAGS)
$(TEST_BINARIES): CPPFLAGS += -Itests/include
$(TEST_BINARIES): LDLIBS += -lolm
$(TEST_BINARIES): LDFLAGS += $(TEST_OPTIMIZE_FLAGS) -L$(BUILD_DIR)
### top-level targets
$(TARGET): $(OBJECTS)
$(CXX) $(LDFLAGS) --shared -fPIC $^ $(OUTPUT_OPTION)
clean:;
rm -rf $(OBJECTS) $(OBJECTS:.o=.d) \
$(TEST_BINARIES) $(TEST_BINARIES:=.d) \
$(TARGET)
build_tests: $(TEST_BINARIES)
test: build_tests
for i in $(TEST_BINARIES); do \
echo $$i; \
LD_LIBRARY_PATH=$(BUILD_DIR) $$i || exit $$?; \
done
### rules for building objects
$(BUILD_DIR)/%.o: src/%.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
$(BUILD_DIR)/%.o: src/%.cpp
$(COMPILE.cc) $(OUTPUT_OPTION) $<
$(BUILD_DIR)/%: tests/%.c
$(LINK.c) $< $(LOADLIBES) $(LDLIBS) -o $@
$(BUILD_DIR)/%: tests/%.cpp
$(LINK.cc) $< $(LOADLIBES) $(LDLIBS) -o $@
### dependencies
$(TEST_BINARIES): $(TARGET)
-include $(OBJECTS:.o=.d)
-include $(TEST_BINARIES:=.d)

View file

@ -14,14 +14,13 @@ To build olm as a shared library run:
.. code:: bash .. code:: bash
./build_shared_library.py make
To run the tests run: To run the tests run:
.. code:: bash .. code:: bash
./test.py make test
To build the javascript bindings, install emscripten from http://kripken.github.io/emscripten-site/ and then run: To build the javascript bindings, install emscripten from http://kripken.github.io/emscripten-site/ and then run:
@ -43,6 +42,11 @@ Design
Olm is designed to be easy port to different platforms and to be easy Olm is designed to be easy port to different platforms and to be easy
to write bindings for. to write bindings for.
It was originally implemented in C++, with a plain-C layer providing the public
API. As development has progressed, it has become clear that C++ gives little
advantage, and new functionality is being added in C, with C++ parts being
rewritten as the need ariases.
Error Handling Error Handling
~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
@ -78,13 +82,13 @@ the ratchet. While this decreases the performance it makes it much easier
to compile the library for different architectures. to compile the library for different architectures.
What's an olm? What's an olm?
~~~~~~~~~~~~~~ --------------
It's a really cool species of European troglodytic salamander. It's a really cool species of European troglodytic salamander.
http://www.postojnska-jama.eu/en/come-and-visit-us/vivarium-proteus/ http://www.postojnska-jama.eu/en/come-and-visit-us/vivarium-proteus/
Legal Notice Legal Notice
~~~~~~~~~~~~ ------------
The software may be subject to the U.S. export control laws and regulations The software may be subject to the U.S. export control laws and regulations
and by downloading the software the user certifies that he/she/it is and by downloading the software the user certifies that he/she/it is

View file

@ -1,36 +0,0 @@
#! /usr/bin/env python
# Copyright 2015 OpenMarket Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import subprocess
import glob
import os
import sys
if not os.path.exists("build"):
os.mkdir("build")
source_files = glob.glob("src/*.cpp")
compile_args = "g++ -Wall -O3 -Iinclude -Ilib --std=c++11 --shared -fPIC".split()
compile_args += source_files
compile_args += sys.argv[1:]
library = "build/libolm.so"
def run(args):
print " ".join(args)
subprocess.check_call(args)
run(compile_args + ["-o", library])

38
test.py
View file

@ -1,38 +0,0 @@
#! /usr/bin/env python
# Copyright 2015 OpenMarket Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import glob
import os
import subprocess
import sys
if not os.path.exists("build/libolm.so"):
print >> sys.stderr, \
"libolm has not been built. Run ./build_shared_library.py first."
exit(1)
test_files = glob.glob("tests/test_*.cpp")
compile_args = ("g++ -g -O0 -Itests/include -Iinclude -Ilib --std=c++11 "+
"-L build").split()
def run(args, *xargs, **kwargs):
print " ".join(args)
subprocess.check_call(args, *xargs, **kwargs)
for test_file in test_files:
exe_file = "build/" + test_file[6:-4]
run(compile_args + [test_file, "-lolm", "-o", exe_file])
run([exe_file], env={'LD_LIBRARY_PATH':'./build'})