Windows build + instructions
This commit is contained in:
parent
bd0494ecd8
commit
5ef2e8e8d9
4 changed files with 117 additions and 41 deletions
3
Makefile
3
Makefile
|
@ -4,6 +4,9 @@ export CONFIG
|
||||||
all: $(CONFIG)
|
all: $(CONFIG)
|
||||||
+make -f Makefile.main
|
+make -f Makefile.main
|
||||||
|
|
||||||
|
run-tests:
|
||||||
|
+make -f Makefile.main run-tests
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
+make -f Makefile.main clean
|
+make -f Makefile.main clean
|
||||||
|
|
||||||
|
|
141
Makefile.main
141
Makefile.main
|
@ -1,23 +1,38 @@
|
||||||
include $(CONFIG)
|
include $(CONFIG)
|
||||||
|
ifeq ($(shell uname),Linux)
|
||||||
BUILD_FOR ?= linux
|
BUILD_FOR ?= linux
|
||||||
|
else
|
||||||
|
BUILD_FOR ?= win
|
||||||
|
endif
|
||||||
|
|
||||||
# Select compiler (g++ for linux, mingw-w64/posix for windows)
|
# Select compiler (g++ for linux, mingw-w64 for windows)
|
||||||
ifeq ($(BUILD_FOR),linux)
|
ifeq ($(BUILD_FOR),linux)
|
||||||
CXX=x86_64-linux-gnu-g++
|
CXX=x86_64-linux-gnu-g++
|
||||||
else
|
else
|
||||||
ifeq ($(BUILD_FOR),win)
|
ifeq ($(BUILD_FOR),win)
|
||||||
CXX=x86_64-w64-mingw32-g++-posix
|
CXX=x86_64-w64-mingw32-g++
|
||||||
else
|
else
|
||||||
$(error Invalid target "$(BUILD_FOR)")
|
$(error Invalid target "$(BUILD_FOR) (valid choices: linux win)")
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# FIXME: temporarily used for Windows build
|
# Output directory, based on target OS, unless defined manually
|
||||||
|
OUTDIR ?= $(OUTDIRBASE)/$(BUILD_FOR)
|
||||||
|
|
||||||
|
# CPPUnit
|
||||||
|
CPPUNIT = $(OUTDIR)/cppunit
|
||||||
|
CPPUNIT_SOURCE = $(OUTDIRBASE)/cppunit
|
||||||
|
CPPUNIT_BUILD = $(OUTDIR)/cppunit-build
|
||||||
|
ifeq ($(BUILD_FOR),linux)
|
||||||
|
CPPUNIT_HOST=x86_64-linux-gnu
|
||||||
|
endif
|
||||||
ifeq ($(BUILD_FOR),win)
|
ifeq ($(BUILD_FOR),win)
|
||||||
CPPFLAGS += -I/tmp/cppunit/include
|
CPPUNIT_HOST=x86_64-w64-mingw32
|
||||||
LDFLAGS += -L/tmp/cppunit/src/cppunit/.libs/
|
|
||||||
endif
|
endif
|
||||||
|
CPPFLAGS += -I$(CPPUNIT)/include
|
||||||
|
LDFLAGS += -L$(CPPUNIT)/lib
|
||||||
|
|
||||||
|
# Compiler and linker flags
|
||||||
CPPFLAGS += -Iinclude -I$(OUTDIR) -I$(OUTDIR)/data -DEBCL_BUILD -D_USE_MATH_DEFINES
|
CPPFLAGS += -Iinclude -I$(OUTDIR) -I$(OUTDIR)/data -DEBCL_BUILD -D_USE_MATH_DEFINES
|
||||||
CXXFLAGS += -std=c++14 -Wall -Wextra
|
CXXFLAGS += -std=c++14 -Wall -Wextra
|
||||||
LDFLAGS += -L$(OUTDIR) -pthread
|
LDFLAGS += -L$(OUTDIR) -pthread
|
||||||
|
@ -35,27 +50,24 @@ endif
|
||||||
# Libs for either Linux or Windows
|
# Libs for either Linux or Windows
|
||||||
ifeq ($(BUILD_FOR),linux)
|
ifeq ($(BUILD_FOR),linux)
|
||||||
LIBS_LIB = -ldl -latomic
|
LIBS_LIB = -ldl -latomic
|
||||||
else
|
endif
|
||||||
ifeq ($(BUILD_FOR),win)
|
ifeq ($(BUILD_FOR),win)
|
||||||
LIBS_LIB = -latomic
|
LIBS_LIB = -latomic
|
||||||
else
|
|
||||||
$(error Invalid target "$(BUILD_FOR)")
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Library and progam suffixes
|
# Library and progam suffixes
|
||||||
ifeq ($(BUILD_FOR),linux)
|
ifeq ($(BUILD_FOR),linux)
|
||||||
SUFFIX_LIB=.so
|
SUFFIX_LIB=.so
|
||||||
SUFFIX_EXE=
|
SUFFIX_EXE=
|
||||||
else
|
endif
|
||||||
ifeq ($(BUILD_FOR),win)
|
ifeq ($(BUILD_FOR),win)
|
||||||
SUFFIX_LIB=.dll
|
SUFFIX_LIB=.dll
|
||||||
SUFFIX_EXE=.exe
|
SUFFIX_EXE=.exe
|
||||||
else
|
|
||||||
$(error Invalid target "$(BUILD_FOR)")
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Library
|
||||||
|
include src/files.mk
|
||||||
|
LIB_OBJS = $(addprefix $(OUTDIR)/,$(addsuffix .o, $(subst src/,, $(basename $(LIB_SOURCES)))))
|
||||||
CXXFLAGS_LIB = $(CXXFLAGS)
|
CXXFLAGS_LIB = $(CXXFLAGS)
|
||||||
LIB_DYNAMIC = $(OUTDIR)/libebcorelib$(SUFFIX_LIB)
|
LIB_DYNAMIC = $(OUTDIR)/libebcorelib$(SUFFIX_LIB)
|
||||||
LIB_STATIC = $(OUTDIR)/libebcorelib.a
|
LIB_STATIC = $(OUTDIR)/libebcorelib.a
|
||||||
|
@ -68,14 +80,13 @@ ifeq ($(BUILD_STATIC_LIB),y)
|
||||||
LIB_TARGETS += $(LIB_STATIC)
|
LIB_TARGETS += $(LIB_STATIC)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include src/files.mk
|
# Tests
|
||||||
LIB_OBJS = $(addprefix $(OUTDIR)/,$(addsuffix .o, $(subst src/,, $(basename $(LIB_SOURCES)))))
|
|
||||||
|
|
||||||
include tests/list.mk
|
include tests/list.mk
|
||||||
TEST_SUITES := $(addsuffix $(SUFFIX_EXE), $(addprefix $(OUTDIR)/test-,$(TESTS)))
|
TEST_SUITES := $(addsuffix $(SUFFIX_EXE), $(addprefix $(OUTDIR)/test-,$(TESTS)))
|
||||||
TEST_ALL := $(OUTDIR)/run-all-tests$(SUFFIX_EXE)
|
TEST_ALL := $(OUTDIR)/run-all-tests$(SUFFIX_EXE)
|
||||||
TEST_MAIN := $(OUTDIR)/tests/run-test.o
|
TEST_MAIN := $(OUTDIR)/tests/run-test.o
|
||||||
TEST_OBJS := $(addsuffix .o,$(addprefix $(OUTDIR)/tests/,$(TESTS))) $(TEST_MAIN)
|
TEST_OBJS := $(addsuffix .o,$(addprefix $(OUTDIR)/tests/,$(TESTS))) $(TEST_MAIN)
|
||||||
|
# Required libraries
|
||||||
LIBS_TESTS = -lcppunit
|
LIBS_TESTS = -lcppunit
|
||||||
ifeq ($(BUILD_DYNAMIC_LIB),y)
|
ifeq ($(BUILD_DYNAMIC_LIB),y)
|
||||||
LIBS_TESTS += -lebcorelib
|
LIBS_TESTS += -lebcorelib
|
||||||
|
@ -84,14 +95,20 @@ else
|
||||||
LIBS_TESTS += $(OUTDIR)/libebcorelib.a $(LIBS_LIB)
|
LIBS_TESTS += $(OUTDIR)/libebcorelib.a $(LIBS_LIB)
|
||||||
TEST_NEEDS = $(LIB_STATIC)
|
TEST_NEEDS = $(LIB_STATIC)
|
||||||
endif
|
endif
|
||||||
|
# Linker flags
|
||||||
|
TEST_LDFLAGS =
|
||||||
|
ifeq ($(BUILD_FOR),win)
|
||||||
|
TEST_LDFLAGS += -mconsole
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Objects and dependencies
|
||||||
ALL_OBJS = $(LIB_OBJS)
|
ALL_OBJS = $(LIB_OBJS)
|
||||||
ifeq ($(BUILD_TESTS),y)
|
ifeq ($(BUILD_TESTS),y)
|
||||||
ALL_OBJS += $(TEST_OBJS)
|
ALL_OBJS += $(TEST_OBJS)
|
||||||
endif
|
endif
|
||||||
DEPS := $(addsuffix .d,$(ALL_OBJS))
|
DEPS := $(addsuffix .d,$(ALL_OBJS))
|
||||||
|
|
||||||
|
# Default targets
|
||||||
TARGETS = $(LIB_TARGETS)
|
TARGETS = $(LIB_TARGETS)
|
||||||
ifeq ($(BUILD_TESTS),y)
|
ifeq ($(BUILD_TESTS),y)
|
||||||
TARGETS += tests
|
TARGETS += tests
|
||||||
|
@ -106,37 +123,28 @@ run: tests
|
||||||
echo "\n\nPlease define E\n\n"; \
|
echo "\n\nPlease define E\n\n"; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
else \
|
else \
|
||||||
LD_LIBRARY_PATH=$(OUTDIR) $(OUTDIR)/$(E); \
|
LD_LIBRARY_PATH=$(OUTDIR):$(CPPUNIT)/lib $(OUTDIR)/$(E); \
|
||||||
fi
|
|
||||||
|
|
||||||
debug: tests
|
|
||||||
@if [ -z "$(E)" ]; then \
|
|
||||||
echo "\n\nPlease define E\n\n"; \
|
|
||||||
exit 1; \
|
|
||||||
else \
|
|
||||||
LD_LIBRARY_PATH=$(OUTDIR) debug $(OUTDIR)/$(E); \
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
run-tests: tests
|
run-tests: tests
|
||||||
LD_LIBRARY_PATH=$(OUTDIR) ./$(TEST_ALL)
|
LD_LIBRARY_PATH=$(OUTDIR):$(CPPUNIT)/lib ./$(TEST_ALL)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(TEST_SUITES) $(TEST_ALL) $(TEST_OBJS) \
|
rm -f $(TEST_SUITES) $(TEST_ALL) $(TEST_OBJS) \
|
||||||
$(LIB_OBJS) $(LIB_TARGETS)
|
$(LIB_OBJS) $(LIB_TARGETS)
|
||||||
|
|
||||||
fullclean: clean
|
fullclean:
|
||||||
rm -f $(DEPS)
|
rm --preserve-root -rf $(OUTDIR)
|
||||||
-rmdir $(sort $(dir $(TEST_OBJS)) $(dir $(LIB_OBJS)))
|
|
||||||
-rmdir $(OUTDIR)
|
|
||||||
|
|
||||||
tests: $(TEST_OBJS) $(TEST_SUITES) $(TEST_ALL)
|
tests: copy-libraries $(TEST_OBJS) $(TEST_SUITES) $(TEST_ALL)
|
||||||
|
|
||||||
|
|
||||||
.PHONY: all run debug run-tests clean fullclean tests
|
.PHONY: all run debug run-tests clean fullclean tests
|
||||||
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------- #
|
||||||
# Actual building
|
# - LIBRARY AND TESTS - #
|
||||||
|
# ---------------------------------------------------------------------------- #
|
||||||
|
|
||||||
-include $(DEPS)
|
-include $(DEPS)
|
||||||
|
|
||||||
|
@ -151,11 +159,10 @@ $(LIB_STATIC): $(LIB_OBJS)
|
||||||
|
|
||||||
# Tests
|
# Tests
|
||||||
$(TEST_SUITES): $(OUTDIR)/test-%$(SUFFIX_EXE): $(OUTDIR)/tests/%.o $(TEST_MAIN) $(TEST_NEEDS)
|
$(TEST_SUITES): $(OUTDIR)/test-%$(SUFFIX_EXE): $(OUTDIR)/tests/%.o $(TEST_MAIN) $(TEST_NEEDS)
|
||||||
$(CXX) $(LDFLAGS) -o $@ $< $(TEST_MAIN) $(LIBS_TESTS)
|
$(CXX) $(LDFLAGS) $(TEST_LDFLAGS) -o $@ $< $(TEST_MAIN) $(LIBS_TESTS)
|
||||||
|
|
||||||
$(TEST_ALL): $(TEST_OBJS)
|
$(TEST_ALL): $(TEST_OBJS)
|
||||||
$(CXX) $(LDFLAGS) -o $@ $(TEST_OBJS) $(LIBS_TESTS)
|
$(CXX) $(LDFLAGS) $(TEST_LDFLAGS) -o $@ $(TEST_OBJS) $(LIBS_TESTS)
|
||||||
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# .cc -> .o
|
# .cc -> .o
|
||||||
|
@ -165,8 +172,64 @@ $(LIB_OBJS): $(OUTDIR)/%.o: src/%.cc
|
||||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS_LIB) -c -o $@ $<
|
$(CXX) $(CPPFLAGS) $(CXXFLAGS_LIB) -c -o $@ $<
|
||||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS_LIB) -M -MF $@.d -MT $@ $<
|
$(CXX) $(CPPFLAGS) $(CXXFLAGS_LIB) -M -MF $@.d -MT $@ $<
|
||||||
|
|
||||||
$(TEST_OBJS): $(OUTDIR)/%.o: %.cc
|
$(TEST_OBJS): $(OUTDIR)/%.o: %.cc | cppunit
|
||||||
@if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi
|
@if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi
|
||||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
|
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
|
||||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -M -MF $@.d -MT $@ $<
|
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -M -MF $@.d -MT $@ $<
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------- #
|
||||||
|
# - CPPUNIT - #
|
||||||
|
# ---------------------------------------------------------------------------- #
|
||||||
|
|
||||||
|
cppunit: | $(CPPUNIT_SOURCE)/configure
|
||||||
|
+if [ ! -d "$(CPPUNIT)" ]; then \
|
||||||
|
if [ ! -d "$(CPPUNIT_BUILD)" ]; then \
|
||||||
|
mkdir -p "$(CPPUNIT_BUILD)"; \
|
||||||
|
fi; \
|
||||||
|
cd "$(CPPUNIT_BUILD)" && \
|
||||||
|
"$(abspath $(CPPUNIT_SOURCE))"/configure \
|
||||||
|
--host=$(CPPUNIT_HOST) \
|
||||||
|
--prefix="$(abspath $(CPPUNIT))" \
|
||||||
|
--disable-doxygen \
|
||||||
|
--enable-silent-rules && \
|
||||||
|
make && \
|
||||||
|
make install; \
|
||||||
|
fi
|
||||||
|
-rm -rf "$(CPPUNIT_BUILD)"
|
||||||
|
|
||||||
|
$(CPPUNIT_SOURCE)/configure: | cppunit-dl
|
||||||
|
cd "$(CPPUNIT_SOURCE)"; ./autogen.sh
|
||||||
|
|
||||||
|
cppunit-dl:
|
||||||
|
if [ ! -d "$(CPPUNIT_SOURCE)" ]; then \
|
||||||
|
git clone git://anongit.freedesktop.org/git/libreoffice/cppunit/ "$(CPPUNIT_SOURCE)"; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
.PHONY: cppunit cppunit-linux cppunit-windows cppunit-dl
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------- #
|
||||||
|
# - DLL COPYING - #
|
||||||
|
# ---------------------------------------------------------------------------- #
|
||||||
|
|
||||||
|
# On Windows, we need all the external DLLs to be copied to the output directory
|
||||||
|
|
||||||
|
ifeq ($(BUILD_FOR),win)
|
||||||
|
|
||||||
|
MINGW_DIR ?= /usr/x86_64-w64-mingw32/sys-root/mingw/bin
|
||||||
|
|
||||||
|
copy-libraries: | cppunit
|
||||||
|
cp $(CPPUNIT)/bin/*dll $(OUTDIR)
|
||||||
|
cp $(MINGW_DIR)/libgcc_s_seh-1.dll $(OUTDIR)
|
||||||
|
cp $(MINGW_DIR)/libatomic-1.dll $(OUTDIR)
|
||||||
|
cp $(MINGW_DIR)/libstdc++-6.dll $(OUTDIR)
|
||||||
|
cp $(MINGW_DIR)/libwinpthread-1.dll $(OUTDIR)
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
copy-libraries:
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: copy-libraries
|
||||||
|
|
|
@ -6,7 +6,7 @@ DEBUG = n
|
||||||
OPTIMIZE = y
|
OPTIMIZE = y
|
||||||
BUILD_TESTS = y
|
BUILD_TESTS = y
|
||||||
|
|
||||||
OUTDIR = output
|
OUTDIRBASE = output
|
||||||
|
|
||||||
export BUILD_STATIC_LIB BUILD_DYNAMIC_LIB DEBUG OPTIMIZE BUILD_TESTS
|
export BUILD_STATIC_LIB BUILD_DYNAMIC_LIB DEBUG OPTIMIZE BUILD_TESTS
|
||||||
export OUTDIR
|
export OUTDIRBASE
|
||||||
|
|
10
doc/WindowsBuild.txt
Normal file
10
doc/WindowsBuild.txt
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
1/ Install Babun from https://babun.github.io/
|
||||||
|
|
||||||
|
2/ Force an update using update.bat
|
||||||
|
|
||||||
|
3/ Install the mingw C++ compiler in the Babun terminal:
|
||||||
|
pact install mingw-x86_64-gcc-g++
|
||||||
|
|
||||||
|
4/ Copy the source directory somewhere, then build:
|
||||||
|
cd corelib
|
||||||
|
make
|
Loading…
Reference in a new issue