project(musl C ASM ) cmake_minimum_required(VERSION 3.0) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ -fPIC \ -nostdinc \ -fsanitize=address \ -fexceptions\ -Wall \ -std=c99 \ -isysroot${CMAKE_SOURCE_DIR}/include \ -D_XOPEN_SOURCE=700\ -Os\ -pipe" ) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -nostdlib -shared -Wl,-e,_dlstart" ) include_directories( "${CMAKE_SOURCE_DIR}/arch/generic/" "${CMAKE_SOURCE_DIR}/arch/${CMAKE_HOST_SYSTEM_PROCESSOR}" "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/arch" ) file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/arch/bits/") add_custom_target(alltypes COMMAND sed -f "${CMAKE_SOURCE_DIR}/tools/mkalltypes.sed" "${CMAKE_SOURCE_DIR}/arch/${CMAKE_HOST_SYSTEM_PROCESSOR}/bits/alltypes.h.in" "${CMAKE_SOURCE_DIR}/include/alltypes.h.in" >> "${CMAKE_CURRENT_BINARY_DIR}/arch/bits/alltypes.h" ) add_custom_target(syscall COMMAND sed -n -e s/__NR_/SYS_/p < "${CMAKE_SOURCE_DIR}/arch/${CMAKE_HOST_SYSTEM_PROCESSOR}/bits/syscall.h.in" >> "${CMAKE_CURRENT_BINARY_DIR}/arch/bits/syscall.h" ) execute_process( COMMAND sh tools/version.sh COMMAND_ECHO STDOUT RESULT_VARIABLE version WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) file(WRITE "${CMAKE_BINARY_DIR}/version.h" "#define VERSION \"${version}\"") file(GLOB internalSrcs "${CMAKE_SOURCE_DIR}/src/internal/*.c" ) file( GLOB muslSrcs "${CMAKE_SOURCE_DIR}/src/*.c" "${CMAKE_SOURCE_DIR}/src/aio/*.c" "${CMAKE_SOURCE_DIR}/src/conf/*.c" "${CMAKE_SOURCE_DIR}/src/ctype/*.c" "${CMAKE_SOURCE_DIR}/src/env/*.c" "${CMAKE_SOURCE_DIR}/src/exit/*.c" "${CMAKE_SOURCE_DIR}/src/fenv/${CMAKE_HOST_SYSTEM_PROCESSOR}/*.s" "${CMAKE_SOURCE_DIR}/src/ldso/*.c" "${CMAKE_SOURCE_DIR}/src/linux/*.c" "${CMAKE_SOURCE_DIR}/src/malloc/*.c" "${CMAKE_SOURCE_DIR}/src/misc/*.c" "${CMAKE_SOURCE_DIR}/src/mq/*.c" "${CMAKE_SOURCE_DIR}/src/network/*.c" "${CMAKE_SOURCE_DIR}/src/prng/*.c" "${CMAKE_SOURCE_DIR}/src/regex/*.c" "${CMAKE_SOURCE_DIR}/src/search/*.c" "${CMAKE_SOURCE_DIR}/src/setjmp/*.c" "${CMAKE_SOURCE_DIR}/src/stat/*.c" "${CMAKE_SOURCE_DIR}/src/stdlib/*.c" "${CMAKE_SOURCE_DIR}/src/temp/*.c" "${CMAKE_SOURCE_DIR}/src/thread/*.c" "${CMAKE_SOURCE_DIR}/src/unistd/*.c" "${CMAKE_SOURCE_DIR}/src/complex/*.c" "${CMAKE_SOURCE_DIR}/src/crypt/*.c" "${CMAKE_SOURCE_DIR}/src/dirent/*.c" "${CMAKE_SOURCE_DIR}/src/errno/*.c" "${CMAKE_SOURCE_DIR}/src/fcntl/*.c" "${CMAKE_SOURCE_DIR}/src/include/*.c" "${CMAKE_SOURCE_DIR}/src/ipc/*.c" "${CMAKE_SOURCE_DIR}/src/legacy/*.c" "${CMAKE_SOURCE_DIR}/src/locale/*.c" "${CMAKE_SOURCE_DIR}/src/mman/*.c" "${CMAKE_SOURCE_DIR}/src/multibyte/*.c" "${CMAKE_SOURCE_DIR}/src/passwd/*.c" "${CMAKE_SOURCE_DIR}/src/process/*.c" "${CMAKE_SOURCE_DIR}/src/sched/*.c" "${CMAKE_SOURCE_DIR}/src/select/*.c" "${CMAKE_SOURCE_DIR}/src/signal/*.c" "${CMAKE_SOURCE_DIR}/src/stdio/*.c" "${CMAKE_SOURCE_DIR}/src/string/*.c" "${CMAKE_SOURCE_DIR}/src/termios/*.c" "${CMAKE_SOURCE_DIR}/src/time/*.c" ) macro(replace_list_item LIST OLD_VALUE NEW_VALUE) list(FIND ${LIST} ${OLD_VALUE} OLD_VALUE_INDEX) if(OLD_VALUE_INDEX GREATER_EQUAL 0) list(REMOVE_AT ${LIST} ${OLD_VALUE_INDEX}) list(INSERT ${LIST} ${OLD_VALUE_INDEX} ${NEW_VALUE}) endif() endmacro() foreach(arfp ${arch_fpenvSrcs}) get_filename_component(arfname ${arfp} NAME_WLE) foreach(fp ${fpenvSrcs}) get_filename_component(fpfname ${fp} NAME_WLE) if(${fpfname} STREQUAL ${arfname}) replace_list_item(fpenvSrcs ${fp} ${arfp}) endif() endforeach() endforeach() file (GLOB arch_mathsrc "${CMAKE_SOURCE_DIR}/src/math/${CMAKE_SYSTEM_PROCESSOR}/*.c" "${CMAKE_SOURCE_DIR}/src/math/${CMAKE_SYSTEM_PROCESSOR}/*.s" ) file (GLOB mathsrc "${CMAKE_SOURCE_DIR}/src/math/*.c" ) foreach(arfp ${arch_mathsrc}) get_filename_component(arfname ${arfp} NAME_WLE) foreach(fp ${mathsrc}) get_filename_component(fpfname ${fp} NAME_WLE) if(${fpfname} STREQUAL ${arfname}) replace_list_item(mathsrc ${fp} ${arfp}) endif() endforeach() endforeach() #obj/crt/rcrt1.o obj/ldso/dlstart.lo obj/ldso/dynlink.lo: $(srcdir)/src/internal/dynlink.h $(srcdir)/arch/$(ARCH)/reloc.h #obj/crt/crt1.o obj/crt/scrt1.o obj/crt/rcrt1.o obj/ldso/dlstart.lo: $(srcdir)/arch/$(ARCH)/crt_arch.h #obj/crt/rcrt1.o: $(srcdir)/ldso/dlstart.c #obj/crt/Scrt1.o obj/crt/rcrt1.o: CFLAGS_ALL += -fPIC add_library(internal OBJECT ${internalSrcs} ) target_include_directories (internal PRIVATE "${CMAKE_SOURCE_DIR}/src/include" ) target_include_directories (internal PUBLIC "${CMAKE_SOURCE_DIR}/include/" ) target_precompile_headers(internal PUBLIC "${CMAKE_BINARY_DIR}/arch/bits/alltypes.h" "${CMAKE_BINARY_DIR}/arch/bits/syscall.h" PRIVATE "${CMAKE_SOURCE_DIR}/src/internal/stdio_impl.h" "${CMAKE_SOURCE_DIR}/src/internal/pthread_impl.h" "${CMAKE_SOURCE_DIR}/src/internal/locale_impl.h" "${CMAKE_SOURCE_DIR}/src/internal/libc.h" ) add_dependencies(internal syscall alltypes) #shared build add_library(musl SHARED ${muslSrcs} ${fpenvSrcs} ${mathsrc} ) add_dependencies(musl internal) target_link_libraries(musl PRIVATE internal) target_include_directories(musl PRIVATE "${CMAKE_SOURCE_DIR}/src/include" "${CMAKE_SOURCE_DIR}/src/internal" ) set_target_properties(musl PROPERTIES OUTPUT_NAME c) #statiuc build add_library(musl-static STATIC ${muslSrcs} ${fpenvSrcs} ${mathsrc} ) add_dependencies(musl-static internal) target_link_libraries(musl-static PRIVATE internal) target_include_directories(musl-static PRIVATE "${CMAKE_SOURCE_DIR}/src/include" "${CMAKE_SOURCE_DIR}/src/internal" ) set_target_properties(musl-static PROPERTIES OUTPUT_NAME c) install( TARGETS musl musl-static DESTINATION lib )