forked from google/j2objc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstatic_framework.mk
146 lines (129 loc) · 5.77 KB
/
static_framework.mk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# 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.
# Provides rules for creating a static library framework.
#
# The including makefile must define these variables:
# STATIC_FRAMEWORK_NAME
#
# The including makefile may define these variables:
# STATIC_FRAMEWORK_RESOURCE_FILES
# STATIC_FRAMEWORK_HEADERS (defaults to TRANSLATE_HEADERS)
# STATIC_FRAMEWORK_PUBLIC_HEADERS (defaults to STATIC_FRAMEWORK_HEADERS)
# STATIC_LIBRARY_NAME (defaults to FAT_LIB_NAME)
# STATIC_HEADERS_DIR (defaults to GEN_OBJC_DIR)
#
# This file defines the following to be used by the including file:
# STATIC_FRAMEWORK_DIR
# STATIC_FRAMEWORK_RESOURCES_DIR
#
# Author: Tom Ball
ifndef STATIC_FRAMEWORK_HEADERS
ifndef TRANSLATE_HEADERS
$(error STATIC_FRAMEWORK_HEADERS not defined)
else
STATIC_FRAMEWORK_HEADERS = $(TRANSLATE_HEADERS)
endif
endif
ifndef STATIC_LIBRARY_NAME
ifndef FAT_LIB_NAME
$(error STATIC_LIBRARY_NAME not defined)
else
STATIC_LIBRARY_NAME = $(FAT_LIB_NAME)
endif
endif
ifndef STATIC_HEADERS_DIR
ifndef GEN_OBJC_DIR
$(error STATIC_HEADERS_DIR not defined)
else
STATIC_HEADERS_DIR = $(GEN_OBJC_DIR)
endif
endif
ifndef STATIC_FRAMEWORK_PUBLIC_HEADERS
STATIC_FRAMEWORK_PUBLIC_HEADERS = $(STATIC_FRAMEWORK_HEADERS)
endif
STATIC_FRAMEWORK_DIR = $(DIST_FRAMEWORK_DIR)/$(STATIC_FRAMEWORK_NAME).framework
STATIC_LIBRARY = $(BUILD_DIR)/lib$(STATIC_LIBRARY_NAME).a
FRAMEWORK_HEADER = $(BUILD_DIR)/$(STATIC_FRAMEWORK_NAME).h
MODULE_MAP = $(BUILD_DIR)/module.modulemap
STATIC_FRAMEWORK_RESOURCES_DIR = $(STATIC_FRAMEWORK_DIR)/Versions/A/Resources
RESOURCE_FILES = $(STATIC_FRAMEWORK_RESOURCE_FILES:%=$(STATIC_FRAMEWORK_RESOURCES_DIR)/%)
# These are warnings that are suppressed for J2ObjC headers and generated code.
#
# c++98-compat: NS_ENUM/CF_ENUM fails with this warning.
# direct-ivar-access: direct access is faster than accessor invocations.
# documentation: Javadoc formatting is more lenient than clang's.
# dollar-in-identifier-extension: follows Java inner-class naming.
# objc-interface-ivars: non-private fields are valid in Java.
# overriding-method-mismatch: supports parameterized types.
# reserved-id-macro: external headers (Apple, ICU) have header guards with leading underscores.
# super-class-method-mismatch: overridden methods with parameters with type variables are valid.
DISALLOWED_WARNINGS = \
-Wno-c++98-compat \
-Wno-c++98-compat-pedantic \
-Wno-direct-ivar-access \
-Wno-documentation \
-Wno-documentation-unknown-command \
-Wno-dollar-in-identifier-extension \
-Wno-objc-interface-ivars \
-Wno-old-style-cast \
-Wno-overriding-method-mismatch \
-Wno-reserved-id-macro \
-Wno-super-class-method-mismatch
# Check that headers compile with most compiler flags.
VERIFY_FLAGS := -I$(STATIC_FRAMEWORK_DIR)/Headers -I$(DIST_INCLUDE_DIR) \
-Werror -Weverything $(DISALLOWED_WARNINGS)
framework: dist $(STATIC_FRAMEWORK_DIR) resources
@:
$(STATIC_FRAMEWORK_DIR): $(STATIC_LIBRARY) $(FRAMEWORK_HEADER) $(MODULE_MAP)
@echo building $(STATIC_FRAMEWORK_NAME) framework
@mkdir -p $(STATIC_FRAMEWORK_DIR)/Versions/A/Headers
@/bin/ln -sfh A $(STATIC_FRAMEWORK_DIR)/Versions/Current
@/bin/ln -sfh Versions/Current/Headers $(STATIC_FRAMEWORK_DIR)/Headers
@/bin/ln -sfh Versions/Current/$(STATIC_FRAMEWORK_NAME) \
$(STATIC_FRAMEWORK_DIR)/$(STATIC_FRAMEWORK_NAME)
@tar cf - -C $(STATIC_HEADERS_DIR) $(STATIC_FRAMEWORK_HEADERS:$(STATIC_HEADERS_DIR)/%=%) \
| tar xfp - -C $(STATIC_FRAMEWORK_DIR)/Versions/A/Headers
@cp $(STATIC_LIBRARY) $(STATIC_FRAMEWORK_DIR)/Versions/A/$(STATIC_FRAMEWORK_NAME)
@install -m 0644 $(FRAMEWORK_HEADER) $(STATIC_FRAMEWORK_DIR)/Versions/A/Headers
@install -m 0644 $(MODULE_MAP) $(STATIC_FRAMEWORK_DIR)/Versions/A/Headers/
@touch $@
# Creates a framework "master" header file that includes all the framework's header files.
# This header is then test-compiled with all allowed warnings to verify it can be included
# by other projects.
$(FRAMEWORK_HEADER):
@echo "//\n// $(STATIC_FRAMEWORK_NAME).h\n//\n" > $@
@for f in $(STATIC_FRAMEWORK_PUBLIC_HEADERS:$(STATIC_HEADERS_DIR)/%=%); do\
echo '#include <'$${f}'>'; done >> $@
test_warnings: $(FRAMEWORK_HEADER)
@clang -c -o $(FRAMEWORK_HEADER:%.h=%.o) $(VERIFY_FLAGS) -x objective-c -std=c11 $@
@clang -c -o $(FRAMEWORK_HEADER:%.h=%.o) $(VERIFY_FLAGS) -x objective-c -std=c11 -fobjc-arc $@
@clang -c -o $(FRAMEWORK_HEADER:%.h=%.o) $(VERIFY_FLAGS) -x objective-c -std=c11 -fno-objc-arc $@
@clang -c -o $(FRAMEWORK_HEADER:%.h=%.o) $(VERIFY_FLAGS) -x objective-c++ -std=c++11 $@
@clang -c -o $(FRAMEWORK_HEADER:%.h=%.o) $(VERIFY_FLAGS) -x objective-c++ -std=c++11 -fobjc-arc $@
@clang -c -o $(FRAMEWORK_HEADER:%.h=%.o) $(VERIFY_FLAGS) -x objective-c++ -std=c++11 \
-fno-objc-arc $@
@rm $(FRAMEWORK_HEADER:%.h=%.o)
$(MODULE_MAP):
@echo "module" $(STATIC_FRAMEWORK_NAME) "{" > $(MODULE_MAP)
@echo " umbrella header" '"'$(STATIC_FRAMEWORK_NAME).h'"' >> $(MODULE_MAP)
@echo >> $(MODULE_MAP)
@echo " export *" >> $(MODULE_MAP)
@echo " module * { export * }" >> $(MODULE_MAP)
@echo "}" >> $(MODULE_MAP)
resources: $(RESOURCE_FILES)
@:
$(STATIC_FRAMEWORK_RESOURCES_DIR):
@mkdir -p $(STATIC_FRAMEWORK_RESOURCES_DIR)
@/bin/ln -sfh Versions/Current/Resources $(STATIC_FRAMEWORK_DIR)/Resources
$(STATIC_FRAMEWORK_RESOURCES_DIR)/%: % | $(STATIC_FRAMEWORK_RESOURCES_DIR)
@mkdir -p $$(dirname $@)
@install -m 0644 $< $@