# $Id$ ## @file # # kBuild Makefile for kLIBC (formerly known as InnoTek LIBC). # # Copyright (c) 2006 knut st. osmundsen # # # This file is part of kLIBC. # # kLIBC is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # kLIBC is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with kLIBC; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # Include the top-level Config.kmk. include $(PATH_ROOT)/Config.kmk # Undo the packing pass the toplevel config insists on. DEFAULT_PASSES := $(filter-out PACKING,$(DEFAULT_PASSES)) # For finding the klibc_alias unit. KBUILD_UNIT_PATHS := $(KBUILD_UNIT_PATHS) $(PATH_ROOT)/libc # # Configuration. # ifndef CFG_LIBC_NO_VARIANT_LIBS ifndef CFG_LIBC_LOGSTRICT_LIBS ifndef CFG_LIBC_PROFILED_LIBS CFG_LIBC_LOGSTRICT_LIBS := 1 CFG_LIBC_PROFILED_LIBS := 1 endif endif endif # # Global definitions. # DEFS = \ IN_INNOTEK_LIBC \ __IN_INNOTEK_LIBC__ \ __IN_KLIBC__ DEFS.os2 = __OS2__ DEFS.nt = __NT__ if defined(CFG_LIBC_USE_WATCOM) || defined(CFG_KNIX_USE_WATCOM) CFG_LIBC_USE_WATCOM = 1 KLIBC_FORCE_INC_OPT = -fi=$(call TOOL_OPENWATCOM_FIX_SLASHES,$1) else KLIBC_FORCE_INC_OPT = -include $1 endif # # Paths to directories and files. # PATH_LIBC_ROOT = $(PATH_ROOT)/libc PATH_LIBC_SRC = $(PATH_LIBC_ROOT)/src PATH_LIBC_INC = $(PATH_LIBC_ROOT)/include LIBC-STD.H = $(PATH_OBJ)/libc/libc-std.h LIBC_GENALIAS = $(PATH_TARGET)/genalias/genalias$(HOSTSUFF_EXE) LIBC_GENALIAS_FORMAT.nt = coff ifdef LIBC_GENALIAS_FORMAT.$(BUILD_TARGET) LIBC_GENALIAS_FORMAT := $(LIBC_GENALIAS_FORMAT.$(BUILD_TARGET)) else ifdef CFG_LIBC_USE_WATCOM LIBC_GENALIAS_FORMAT := omf else LIBC_GENALIAS_FORMAT := aout endif # # Templates # TEMPLATE_libc = libc template TEMPLATE_libc_DEPS = $(LIBC-STD.H) TEMPLATE_libc_INST = usr/lib/ TEMPLATE_libc_DEFS.os2 = NO_INCL_SAFE_HIMEM_WRAPPERS TEMPLATE_libc_INCS = $(PATH_LIBC_INC) $(dir $(LIBC-STD.H)) TEMPLATE_libc_INCS.nt = $(PATH_LIBC_SRC)/w32api/include TEMPLATE_libc_LIBSUFF = .a if defined(CFG_LIBC_USE_WATCOM) TEMPLATE_libc_TOOL = OPENWATCOM TEMPLATE_libc_CFLAGS = $(TEMPLATE_lib_CFLAGS) -za99 -aa -ecc TEMPLATE_libc_CFLAGS.os2 = $(TEMPLATE_lib_CFLAGS.os2) TEMPLATE_libc_CFLAGS.release = $(TEMPLATE_lib_CFLAGS.release) TEMPLATE_libc_ASTOOL = $(TEMPLATE_libcasm_ASTOOL) TEMPLATE_libc_ASFLAGS = $(TEMPLATE_libcasm_ASFLAGS) KLIBC_SUFF_AS = .asm else TEMPLATE_libc_TOOL = GCC3 TEMPLATE_libc_CFLAGS = $(TEMPLATE_lib_CFLAGS) -std=gnu99 -Wall -Wundef -Wmissing-prototypes TEMPLATE_libc_CFLAGS.os2 = $(TEMPLATE_lib_CFLAGS.os2) -mstack-arg-probe TEMPLATE_libc_CFLAGS.release = $(TEMPLATE_lib_CFLAGS.release) -O3 -mcpu=pentium KLIBC_SUFF_AS = .s endif TEMPLATE_libc.logstrict = . TEMPLATE_libc.logstrict_EXTENDS = libc TEMPLATE_libc.logstrict_EXTENDS_BY = appending TEMPLATE_libc.logstrict_DEFS = __LIBC_STRICT DEBUG_LOGGING TEMPLATE_libc.profiled = . TEMPLATE_libc.profiled_EXTENDS = libc TEMPLATE_libc.profiled_EXTENDS_BY = appending TEMPLATE_libc.profiled_DEFS = __LIBC_PROFILED TEMPLATE_libcsub = LIBC Sub-Library. TEMPLATE_libcsub_EXTENDS = libc TEMPLATE_libcsub_NOINST = 1 TEMPLATE_libcsub.logstrict = LIBC Sub-Library, Logging + Strict. TEMPLATE_libcsub.logstrict_EXTENDS = libc.logstrict TEMPLATE_libcsub.logstrict_NOINST = 1 TEMPLATE_libcsub.profiled = LIBC Sub-Library, Profiled. TEMPLATE_libcsub.profiled_EXTENDS = libc.profiled TEMPLATE_libcsub.profiled_NOINST = 1 # Intel assembly libs (default templates uses AT&T assembly with gcc). TEMPLATE_libcasm = . TEMPLATE_libcasm_LIBSUFF = .a if defined(CFG_LIBC_USE_WATCOM) TEMPLATE_libcasm_TOOL = OPENWATCOM else TEMPLATE_libcasm_TOOL = GCC3 TEMPLATE_libcasm_TOOL.os2 = GCC3OMF endif TEMPLATE_libcasm_INCS = $(PATH_LIBC_INC) $(dir $(LIBC-STD.H)) TEMPLATE_libcasm_INST = usr/lib/ ifeq (1,0) # ALP sucks. TEMPLATE_libcasm_ASTOOL = ALP TEMPLATE_libcasm_ASFLAGS = -Sv:ALP else # NASM sucks too, but in different ways... TEMPLATE_libcasm_ASTOOL = NASM TEMPLATE_libcasm_ASFLAGS = -f obj -w+orphan-labels endif TEMPLATE_libcasm.logstrict = . TEMPLATE_libcasm.logstrict_EXTENDS = libcasm TEMPLATE_libcasm.logstrict_EXTENDS_BY = appending TEMPLATE_libcasm.logstrict_DEFS = __LIBC_STRICT DEBUG_LOGGING TEMPLATE_libcasm.profiled = . TEMPLATE_libcasm.profiled_EXTENDS = libcasm TEMPLATE_libcasm.profiled_EXTENDS_BY = appending TEMPLATE_libcasm.profiled_DEFS = __LIBC_PROFILED TEMPLATE_libcsubasm = . TEMPLATE_libcsubasm_EXTENDS = libcasm TEMPLATE_libcsubasm_NOINST = 1 TEMPLATE_libcsubasm.logstrict = . TEMPLATE_libcsubasm.logstrict_EXTENDS = libcasm.logstrict TEMPLATE_libcsubasm.logstrict_NOINST = 1 TEMPLATE_libcsubasm.profiled = . TEMPLATE_libcsubasm.profiled_EXTENDS = libcasm.profiled TEMPLATE_libcsubasm.profiled_NOINST = 1 # Only permit #include . TEMPLATE_bldprog = Build programs TEMPLATE_bldprog_DEFS = __LIBC_BUILD_PROGRAM__ __KLIBC_BUILD_PROGRAM__ TEMPLATE_bldprog_LIBSUFF = .a if defined(CFG_LIBC_USE_WATCOM) TEMPLATE_bldprog_TOOL = OPENWATCOM TEMPLATE_bldprog_INCS = $(TOOL_OPENWATCOM_CXXINCS) $(PATH_LIBC_ROOT) TEMPLATE_bldprog_BLD_TRG_ARCH = x86 TEMPLATE_bldprog_CFLAGS = -za99 -aa -ecc -d2 TEMPLATE_bldprog_CFLAGS.win = -hc TEMPLATE_bldprog_LDFLAGS = -d2 TEMPLATE_bldprog_LDFLAGS.win = -hc else TEMPLATE_bldprog_TOOL = GCC3 TEMPLATE_bldprog_INCS = $(PATH_LIBC_ROOT) TEMPLATE_bldprog_CFLAGS = -g TEMPLATE_bldprog_CXXFLAGS = -g TEMPLATE_bldprog_LDFLAGS = -g TEMPLATE_bldprog_LDFLAGS.os2 = -Zomf endif # # Macro which configures additional library targets. # define def_libc_variants ifdef CFG_LIBC_LOGSTRICT_LIBS LIBRARIES += $(1)_l $(1)_l_TEMPLATE = $($(1)_TEMPLATE).logstrict $(1)_l_DEFS = $($(1)_DEFS) $(1)_l_DEFS.$(BUILD_TYPE) = $($(1)_DEFS.$(BUILD_TYPE)) $(1)_l_DEFS.$(BUILD_TARGET) = $($(1)_DEFS.$(BUILD_TARGET)) $(1)_l_DEFS.$(BUILD_TARGET_ARCH) = $($(1)_DEFS.$(BUILD_TARGET_ARCH)) $(1)_l_DEFS.$(BUILD_TARGET_CPU) = $($(1)_DEFS.$(BUILD_TARGET_CPU)) $(1)_l_INCS = $($(1)_INCS) $(1)_l_INCS.$(BUILD_TYPE) = $($(1)_INCS.$(BUILD_TYPE)) $(1)_l_INCS.$(BUILD_TARGET) = $($(1)_INCS.$(BUILD_TARGET)) $(1)_l_INCS.$(BUILD_TARGET_ARCH) = $($(1)_INCS.$(BUILD_TARGET_ARCH)) $(1)_l_INCS.$(BUILD_TARGET_CPU) = $($(1)_INCS.$(BUILD_TARGET_CPU)) $(1)_l_CFLAGS = $($(1)_CFLAGS) $(1)_l_CFLAGS.$(BUILD_TYPE) = $($(1)_CFLAGS.$(BUILD_TYPE)) $(1)_l_CFLAGS.$(BUILD_TARGET) = $($(1)_CFLAGS.$(BUILD_TARGET)) $(1)_l_CFLAGS.$(BUILD_TARGET_ARCH) = $($(1)_CFLAGS.$(BUILD_TARGET_ARCH)) $(1)_l_CFLAGS.$(BUILD_TARGET_CPU) = $($(1)_CFLAGS.$(BUILD_TARGET_CPU)) $(1)_l_SOURCES = $($(1)_SOURCES) $(1)_l_SOURCES.$(BUILD_TYPE) = $($(1)_SOURCES.$(BUILD_TYPE)) $(1)_l_SOURCES.$(BUILD_TARGET) = $($(1)_SOURCES.$(BUILD_TARGET)) $(1)_l_SOURCES.$(BUILD_TARGET_ARCH) = $($(1)_SOURCES.$(BUILD_TARGET_ARCH)) $(1)_l_SOURCES.$(BUILD_TARGET_CPU) = $($(1)_SOURCES.$(BUILD_TARGET_CPU)) endif # CFG_LIBC_LOGSTRICT_LIBS ifdef CFG_LIBC_PROFILED_LIBS LIBRARIES += $(1)_p $(1)_p_TEMPLATE = $($(1)_TEMPLATE).profiled $(1)_p_DEFS = $($(1)_DEFS) $(1)_p_DEFS.$(BUILD_TYPE) = $($(1)_DEFS.$(BUILD_TYPE)) $(1)_p_DEFS.$(BUILD_TARGET) = $($(1)_DEFS.$(BUILD_TARGET)) $(1)_p_DEFS.$(BUILD_TARGET_ARCH) = $($(1)_DEFS.$(BUILD_TARGET_ARCH)) $(1)_p_DEFS.$(BUILD_TARGET_CPU) = $($(1)_DEFS.$(BUILD_TARGET_CPU)) $(1)_p_INCS = $($(1)_INCS) $(1)_p_INCS.$(BUILD_TYPE) = $($(1)_INCS.$(BUILD_TYPE)) $(1)_p_INCS.$(BUILD_TARGET) = $($(1)_INCS.$(BUILD_TARGET)) $(1)_p_INCS.$(BUILD_TARGET_ARCH) = $($(1)_INCS.$(BUILD_TARGET_ARCH)) $(1)_p_INCS.$(BUILD_TARGET_CPU) = $($(1)_INCS.$(BUILD_TARGET_CPU)) $(1)_p_CFLAGS = $($(1)_CFLAGS) $(1)_p_CFLAGS.$(BUILD_TYPE) = $($(1)_CFLAGS.$(BUILD_TYPE)) $(1)_p_CFLAGS.$(BUILD_TARGET) = $($(1)_CFLAGS.$(BUILD_TARGET)) $(1)_p_CFLAGS.$(BUILD_TARGET_ARCH) = $($(1)_CFLAGS.$(BUILD_TARGET_ARCH)) $(1)_p_CFLAGS.$(BUILD_TARGET_CPU) = $($(1)_CFLAGS.$(BUILD_TARGET_CPU)) $(1)_p_SOURCES = $($(1)_SOURCES) $(1)_p_SOURCES.$(BUILD_TYPE) = $($(1)_SOURCES.$(BUILD_TYPE)) $(1)_p_SOURCES.$(BUILD_TARGET) = $($(1)_SOURCES.$(BUILD_TARGET)) $(1)_p_SOURCES.$(BUILD_TARGET_ARCH) = $($(1)_SOURCES.$(BUILD_TARGET_ARCH)) $(1)_p_SOURCES.$(BUILD_TARGET_CPU) = $($(1)_SOURCES.$(BUILD_TARGET_CPU)) endif # CFG_LIBC_PROFILED_LIBS endef # def_libc_variants define def_libc_variants2 LIBC_LIBRARIES += $(1) LIBC_SUB_LIBRARIES += $(1) $(def_libc_variants) endef LIBC_CONFIG_VARIANT_LIBS = $(eval $(call def_libc_variants2,$(1))) LIBC_CONFIG_VARIANT_LIBS_OTHER = $(eval $(call def_libc_variants,$(1))) # # Just stub this for sub makefile. # Need better solution later... # $(LIBC-STD.H): ifneq ($(SUB_DEPTH),.) std-update: $(MAKE) -C $(SUB_DEPTH) std-update endif