]> rtime.felk.cvut.cz Git - omk.git/blob - snippets/Makefile.rules.test
Fixed selection of linker command
[omk.git] / snippets / Makefile.rules.test
1
2 # -*- makefile-gmake -*-
3 include base.omk #omkbuild
4
5 USER_INCLUDE_DIR := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/include
6 USER_LIB_DIR     := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/lib
7 USER_UTILS_DIR   := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin-utils
8 USER_TESTS_DIR   := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin-tests
9 USER_BIN_DIR     := $(OUTPUT_DIR)/$(COMPILED_DIR_NAME)/bin
10 USER_BUILD_DIR   := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/user
11 #LINK_BUILD_DIR   := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/link
12
13 check-dir::
14         @$(call mkdir_def,$(USER_BUILD_DIR))
15         @$(call mkdir_def,$(USER_INCLUDE_DIR))
16         @$(call mkdir_def,$(USER_LIB_DIR))
17         @$(call mkdir_def,$(USER_BIN_DIR))
18         @$(call mkdir_def,$(USER_UTILS_DIR))
19         @$(call mkdir_def,$(USER_TESTS_DIR))
20
21 # Avoid double slash at the end in the top-level directory
22 USER_OBJS_DIR = $(USER_BUILD_DIR)$(RELATIVE_DIR:%=/%)
23 KERN_OBJS_DIR = $(KERN_BUILD_DIR)$(RELATIVE_DIR:%=/%)
24
25 ############
26 # Programs #
27 ############
28
29 ifeq ($(BUILD_OS),)
30   # Check for target
31   ifeq ($(OS),Windows_NT)
32     BUILD_OS := win32
33   else
34     BUILD_OS := $(shell uname | tr '[A-Z]' '[a-z]' )
35     #$(warning BUILD_OS=$(BUILD_OS))
36   endif
37 endif
38
39 ifeq ($(TARGET_OS),)
40   TARGET_OS := $(BUILD_OS)
41 endif
42
43 export TARGET_OS
44 export BUILD_OS
45
46 # Assign default values to CFLAGS variable. If the variable is defined
47 # earlier (i.g. in config.omk), it is not overriden here.
48 CFLAGS ?= -O2 -Wall
49 CXXFLAGS ?= -O2 -Wall
50
51
52 CPPFLAGS  += -I $(USER_INCLUDE_DIR)
53 LOADLIBES += -L$(USER_LIB_DIR) 
54 LOADLIBES += $(lib_LOADLIBES:%=-l%)
55
56 LIB_CPPFLAGS += $(CPPFLAGS)
57 LIB_CFLAGS   += $(CFLAGS)
58
59 ifeq ($(TARGET_OS),win32)
60   SOLIB_EXT = dll
61 else
62   SOLIB_EXT = so
63   SOLIB_PICFLAGS += -fpic
64 endif
65
66 # Check GCC version for user build
67 ifndef CC_MAJOR_VERSION
68 CC_MAJOR_VERSION := $(shell $(CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/')
69 # TODO: export CC_MAJOR_VERSION to save the above shell invocation in
70 # submakes. This will work only if CC is not changed in Makefile.omk.
71 endif
72 # Prepare suitable define for dependency building
73 ifeq ($(CC_MAJOR_VERSION),2)
74 CC_DEPFLAGS = -Wp,-MD,"$$@.d.tmp"
75 else
76 CC_DEPFLAGS = -MT $$@ -MD -MP -MF "$$@.d.tmp"
77 endif
78
79 c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
80         $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER
81
82 cc_o_COMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
83         $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DOMK_FOR_USER
84
85 S_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
86         $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) $(ASFLAGS) -DOMK_FOR_USER
87
88 c_o_cmd = \
89         if $(c_o_COMPILE) $(CC_DEPFLAGS) -o $$@ -c $$< ; \
90         then mv -f "$$@.d.tmp" "$$@.d"; \
91         else rm -f "$$@.d.tmp"; exit 1; \
92         fi
93
94 cc_o_cmd = \
95         if $(cc_o_COMPILE) $(CC_DEPFLAGS) -o $$@ -c $$< ; \
96         then mv -f "$$@.d.tmp" "$$@.d"; \
97         else rm -f "$$@.d.tmp"; exit 1; \
98         fi
99
100 S_o_cmd = \
101         if $(S_o_COMPILE) -D__ASSEMBLY__ $(CC_DEPFLAGS) $($(1)_CFLAGS) -o $$@ -c $$< ; \
102         then mv -f "$$@.d.tmp" "$$@.d" ; \
103         else rm -f "$$@.d.tmp" ; exit 1; \
104         fi
105 # TODO: Implement $($(1)_CFLAGS)
106
107 # Default values for IDL_* variable are suitable for ORBit-like IDL compilers
108 IDL_CLIENT_SOURCES ?= $(1:%.idl=%-stubs.c) $(1:%.idl=%-common.c)
109 IDL_SERVER_SOURCES ?= $(1:%.idl=%-skels.c) $(1:%.idl=%-common.c)
110 IDL_TARGETS ?= $(1:%.idl=%-stubs.c) $(1:%.idl=%-skels.c) $(1:%.idl=%-common.c) $(1:%.idl=%.h)
111 IDL_FLAGS ?= --output-dir=$(USER_OBJS_DIR)
112
113 idl_src_cmd = $(IDL_COMPILER) $(IDL_FLAGS) $($(1)_IDLFLAGS) $$<
114
115 # TODO: Implement CMETRIC
116
117 _linker = $(if $(call c++sources,$($(1)_SOURCES) $($(1)_GEN_SOURCES)),$(CXX),$(CC))
118 _map_file = $(USER_OBJS_DIR)/$(1).exe.map
119 _dep_file = $(USER_OBJS_DIR)/$(1).exe.d
120 program_cmd = set -e; \
121         $(_linker) $($(1)_OBJS) $($(1)_LIBS:%=-l%) $(LOADLIBES) $(LDFLAGS) \
122                 -Wl,-rpath-link,$(USER_LIB_DIR) -Wl,-Map,$(_map_file) -o $$@; \
123         echo "$$@: \\" >$(_dep_file); \
124         sed -n -e 's|^LOAD \(.*\)$$$$|  \1  \&|p' $(_map_file)\
125         |tr '&' '\134' >>$(_dep_file); \
126         echo >>$(_dep_file)
127
128 library_cmd = $(AR) rcs $$@ $$^
129
130 solib_cmd = set -e; \
131         $(_linker) $($(1)_OBJS) $($(1)_LIBS:%=-l%) $(LOADLIBES) $(LDFLAGS) \
132                 -Wl,-rpath-link,$(USER_LIB_DIR) -Wl,-Map,$(_map_file) -o $$@; \
133         echo "$$@: \\" >$(_dep_file); \
134         sed -n -e 's|^LOAD \(.*\)$$$$|  \1  \&|p' $(_map_file)\
135         |tr '&' '\134' >>$(_dep_file); \
136         echo >>$(_dep_file)
137
138
139 include cprog.omk #omkbuild