Makefile 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. MODULES := cloop tests tests/test1
  2. WITH_FPC := 1
  3. TARGET := release
  4. CC := $(CC)
  5. CXX := $(CXX)
  6. LD := $(CXX)
  7. SRC_DIR := src
  8. BUILD_DIR := build
  9. OUT_DIR := output
  10. SHRLIB_EXT := .so
  11. EXE_EXT :=
  12. OBJ_DIR := $(BUILD_DIR)/$(TARGET)
  13. BIN_DIR := $(OUT_DIR)/$(TARGET)/bin
  14. LIB_DIR := $(OUT_DIR)/$(TARGET)/lib
  15. SRC_DIRS := $(addprefix $(SRC_DIR)/,$(MODULES))
  16. OBJ_DIRS := $(addprefix $(OBJ_DIR)/,$(MODULES))
  17. SRCS_C := $(foreach sdir,$(SRC_DIRS),$(wildcard $(sdir)/*.c))
  18. SRCS_CPP := $(foreach sdir,$(SRC_DIRS),$(wildcard $(sdir)/*.cpp))
  19. OBJS_C := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRCS_C))
  20. OBJS_CPP := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRCS_CPP))
  21. C_FLAGS := -ggdb -fPIC -MMD -MP -W -Wall -Wno-unused-parameter
  22. CXX_FLAGS := $(C_FLAGS) -std=c++11
  23. FPC_FLAGS := -Mdelphi -Cg
  24. ifeq ($(shell uname),FreeBSD)
  25. DL_LIB :=
  26. else
  27. DL_LIB := -ldl
  28. endif
  29. ifeq ($(TARGET),release)
  30. CXX_FLAGS += -O3
  31. endif
  32. ifeq ($(shell uname),Darwin)
  33. CXX_FLAGS += -stdlib=libc++
  34. endif
  35. ifeq ($(TARGET),debug)
  36. FPC_FLAGS += -g
  37. LD_FLAGS += -ggdb
  38. endif
  39. vpath %.c $(SRC_DIRS)
  40. vpath %.cpp $(SRC_DIRS)
  41. define compile
  42. $1/%.o: %.c | $1
  43. $(CC) -c $$(C_FLAGS) $$< -o $$@
  44. $1/%.o: %.cpp | $1
  45. $(CXX) -c $$(CXX_FLAGS) $$< -o $$@
  46. endef
  47. .PHONY: all core mkdirs clean
  48. all: core tests
  49. core: mkdirs \
  50. $(BIN_DIR)/cloop
  51. tests: mkdirs \
  52. $(BIN_DIR)/test1-c$(SHRLIB_EXT) \
  53. $(BIN_DIR)/test1-c$(EXE_EXT) \
  54. $(BIN_DIR)/test1-cpp$(SHRLIB_EXT) \
  55. $(BIN_DIR)/test1-cpp$(EXE_EXT) \
  56. $(BIN_DIR)/test1-pascal$(SHRLIB_EXT) \
  57. $(BIN_DIR)/test1-pascal$(EXE_EXT)
  58. mkdirs: $(OBJ_DIRS) $(BIN_DIR) $(LIB_DIR)
  59. $(OBJ_DIRS) $(BIN_DIR) $(LIB_DIR):
  60. @mkdir -p $@
  61. clean:
  62. @rm -rf $(BUILD_DIR) $(OUT_DIR)
  63. $(foreach bdir,$(OBJ_DIRS),$(eval $(call compile,$(bdir))))
  64. -include $(addsuffix .d,$(basename $(OBJS_C)))
  65. -include $(addsuffix .d,$(basename $(OBJS_CPP)))
  66. $(BIN_DIR)/cloop: \
  67. $(OBJ_DIR)/cloop/Action.o \
  68. $(OBJ_DIR)/cloop/Expr.o \
  69. $(OBJ_DIR)/cloop/Generator.o \
  70. $(OBJ_DIR)/cloop/Lexer.o \
  71. $(OBJ_DIR)/cloop/Parser.o \
  72. $(OBJ_DIR)/cloop/Main.o \
  73. | $(BIN_DIR)
  74. $(LD) $(LD_FLAGS) $^ -o $@ $(LIBS)
  75. $(SRC_DIR)/tests/test1/CalcCApi.h: $(BIN_DIR)/cloop $(SRC_DIR)/tests/test1/Interface.idl
  76. $(BIN_DIR)/cloop $(SRC_DIR)/tests/test1/Interface.idl c-header $@ CALC_C_API_H CALC_I
  77. $(SRC_DIR)/tests/test1/CalcCApi.c: $(BIN_DIR)/cloop $(SRC_DIR)/tests/test1/Interface.idl $(SRC_DIR)/tests/test1/CalcCApi.h
  78. $(BIN_DIR)/cloop $(SRC_DIR)/tests/test1/Interface.idl c-impl $@ CalcCApi.h CALC_I
  79. $(SRC_DIR)/tests/test1/CalcCppApi.h: $(BIN_DIR)/cloop $(SRC_DIR)/tests/test1/Interface.idl
  80. $(BIN_DIR)/cloop $(SRC_DIR)/tests/test1/Interface.idl c++ $@ CALC_CPP_API_H calc I
  81. $(SRC_DIR)/tests/test1/CalcPascalApi.pas: $(BIN_DIR)/cloop \
  82. $(SRC_DIR)/tests/test1/Interface.idl \
  83. $(SRC_DIR)/tests/test1/CalcPascalApi.interface.pas \
  84. $(SRC_DIR)/tests/test1/CalcPascalApi.implementation.pas
  85. $(BIN_DIR)/cloop $(SRC_DIR)/tests/test1/Interface.idl pascal $@ CalcPascalApi \
  86. --uses "SysUtils" \
  87. --interfaceFile $(SRC_DIR)/tests/test1/CalcPascalApi.interface.pas \
  88. --implementationFile $(SRC_DIR)/tests/test1/CalcPascalApi.implementation.pas \
  89. --exceptionClass CalcException
  90. $(SRC_DIR)/tests/test1/CppTest.cpp: $(SRC_DIR)/tests/test1/CalcCppApi.h
  91. $(BIN_DIR)/test1-c$(SHRLIB_EXT): \
  92. $(OBJ_DIR)/tests/test1/CalcCApi.o \
  93. $(OBJ_DIR)/tests/test1/CTest.o \
  94. $(LD) $(LD_FLAGS) $^ -shared $(DL_LIB) -o $@ $(LIBS)
  95. $(BIN_DIR)/test1-c$(EXE_EXT): \
  96. $(OBJ_DIR)/tests/test1/CalcCApi.o \
  97. $(OBJ_DIR)/tests/test1/CTest.o \
  98. $(LD) $(LD_FLAGS) $^ $(DL_LIB) -o $@ $(LIBS)
  99. $(BIN_DIR)/test1-cpp$(SHRLIB_EXT): \
  100. $(OBJ_DIR)/tests/test1/CppTest.o \
  101. $(LD) $(LD_FLAGS) $^ -shared $(DL_LIB) -o $@ $(LIBS)
  102. $(BIN_DIR)/test1-cpp$(EXE_EXT): \
  103. $(OBJ_DIR)/tests/test1/CppTest.o \
  104. $(LD) $(LD_FLAGS) $^ $(DL_LIB) -o $@ $(LIBS)
  105. $(BIN_DIR)/test1-pascal$(SHRLIB_EXT): \
  106. $(SRC_DIR)/tests/test1/PascalClasses.pas \
  107. $(SRC_DIR)/tests/test1/PascalLibrary.dpr \
  108. $(SRC_DIR)/tests/test1/CalcPascalApi.pas \
  109. ifeq ($(WITH_FPC),1)
  110. fpc $(FPC_FLAGS) -fPIC -FU$(OBJ_DIR)/tests/test1 -o$(BIN_DIR)/test1-pascal$(SHRLIB_EXT) $(SRC_DIR)/tests/test1/PascalLibrary.dpr
  111. endif
  112. $(BIN_DIR)/test1-pascal$(EXE_EXT): \
  113. $(SRC_DIR)/tests/test1/PascalClasses.pas \
  114. $(SRC_DIR)/tests/test1/PascalTest.dpr \
  115. $(SRC_DIR)/tests/test1/CalcPascalApi.pas \
  116. ifeq ($(WITH_FPC),1)
  117. fpc $(FPC_FLAGS) -FU$(OBJ_DIR)/tests/test1 -o$(BIN_DIR)/test1-pascal$(EXE_EXT) $(SRC_DIR)/tests/test1/PascalTest.dpr
  118. endif