Skip to content

Commit b510c50

Browse files
authored
support for absolute paths (psi29a#17)
* add support for paths that start with / or \, fix memory leak and flow logic * include stdlib * add appveyor support: initial rename * try this instead * try using cmake * try making the build dir first * use sf2pat instead * cut down on the noise * set the lib manually * static or not, set name accordingly * use the right name * try hardcode first * build type * release * try to set the right define flag * try to add getopt header * the right getopt * try to use cmake variables for names * try setting the build directories for win32 * try this instead * use archive instead * use archive instead, add library too
1 parent 764f6f5 commit b510c50

File tree

5 files changed

+167
-9
lines changed

5 files changed

+167
-9
lines changed

CMakeLists.txt

+114-5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ IF(NOT CMAKE_BUILD_TYPE)
1919
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
2020
FORCE)
2121
ENDIF()
22+
2223
IF(NOT CMAKE_DEBUG_POSTFIX)
2324
SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
2425
"Library postfix for debug builds. Normally left blank."
@@ -43,6 +44,83 @@ endif()
4344

4445

4546
SET(LIBNAME "UnSF")
47+
IF(WIN32)
48+
ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0502")
49+
50+
# This option is mainly for static linking UnSF into another project
51+
# that already defines the IDs. It is up to that project to ensure all
52+
# required IDs are defined.
53+
OPTION(UNSF_NO_UID_DEFS "Do not define GUIDs, IIDs, CLSIDs, or PropertyKeys" OFF)
54+
55+
IF(MINGW)
56+
OPTION(UNSF_BUILD_IMPORT_LIB "Build an import .lib using dlltool (requires sed)" ON)
57+
IF(NOT DLLTOOL)
58+
IF(HOST)
59+
SET(DLLTOOL "${HOST}-dlltool")
60+
ELSE()
61+
SET(DLLTOOL "dlltool")
62+
ENDIF()
63+
ENDIF()
64+
ENDIF()
65+
ENDIF()
66+
67+
SET(EXTRA_CFLAGS "")
68+
IF(MSVC)
69+
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
70+
ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
71+
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} /wd4098")
72+
73+
OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
74+
IF(FORCE_STATIC_VCRT)
75+
FOREACH(flag_var
76+
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
77+
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
78+
IF(${flag_var} MATCHES "/MD")
79+
STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
80+
ENDIF()
81+
ENDFOREACH(flag_var)
82+
ENDIF()
83+
ELSE()
84+
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Winline -Wall")
85+
#CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
86+
IF(HAVE_W_EXTRA)
87+
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wextra")
88+
ENDIF()
89+
90+
IF(UNSF_WERROR)
91+
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Werror")
92+
ENDIF()
93+
94+
# We want RelWithDebInfo to actually include debug stuff (define _DEBUG
95+
# instead of NDEBUG)
96+
FOREACH(flag_var CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO)
97+
IF(${flag_var} MATCHES "-DNDEBUG")
98+
STRING(REGEX REPLACE "-DNDEBUG" "-D_DEBUG" ${flag_var} "${${flag_var}}")
99+
ENDIF()
100+
ENDFOREACH()
101+
102+
#CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
103+
# int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
104+
105+
option(UNSF_STATIC_LIBGCC "Force -static-libgcc for static GCC runtimes" OFF)
106+
if(UNSF_STATIC_LIBGCC)
107+
set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
108+
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} -static-libgcc)
109+
check_c_source_compiles(
110+
"#include <stdlib.h>
111+
int main()
112+
{
113+
return 0;
114+
}"
115+
HAVE_STATIC_LIBGCC_SWITCH
116+
)
117+
if(HAVE_STATIC_LIBGCC_SWITCH)
118+
set(EXTRA_LIBS ${EXTRA_LIBS} -static-libgcc)
119+
endif()
120+
set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
121+
unset(OLD_REQUIRED_LIBRARIES)
122+
endif()
123+
ENDIF()
46124

47125
# create our pkg-config: unsf.pc
48126
SET(prefix ${CMAKE_INSTALL_PREFIX})
@@ -62,22 +140,53 @@ SET(UNSF_OBJS libunsf.c)
62140

63141
IF(LIBTYPE STREQUAL "STATIC")
64142
ADD_LIBRARY(${LIBNAME} STATIC ${UNSF_OBJS})
65-
SET(libUnSF_LOCATION "${CMAKE_BINARY_DIR}/lib${LIBNAME}.a")
143+
IF(MSVC)
144+
SET(libUnSF_LOCATION "${CMAKE_BINARY_DIR}\\${LIBNAME}.lib")
145+
ELSE()
146+
SET(libUnSF_LOCATION "${CMAKE_BINARY_DIR}/lib${LIBNAME}.a")
147+
ENDIF()
66148
ELSE()
67149
ADD_LIBRARY(${LIBNAME} SHARED ${UNSF_OBJS})
68-
SET(libUnSF_LOCATION "${CMAKE_BINARY_DIR}/lib${LIBNAME}.so")
150+
IF(MSVC)
151+
SET(libUnSF_LOCATION "${CMAKE_BINARY_DIR}\\${LIBNAME}.dll")
152+
ELSE()
153+
SET(libUnSF_LOCATION "${CMAKE_BINARY_DIR}/lib${LIBNAME}.so")
154+
ENDIF()
69155
ENDIF()
70156

157+
158+
if ( MSVC )
159+
set_target_properties( ${LIBNAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} )
160+
set_target_properties( ${LIBNAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR} )
161+
set_target_properties( ${LIBNAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR} )
162+
set_target_properties( ${LIBNAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_BINARY_DIR} )
163+
set_target_properties( ${LIBNAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR} )
164+
set_target_properties( ${LIBNAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} )
165+
set_target_properties( ${LIBNAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR} )
166+
set_target_properties( ${LIBNAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR} )
167+
set_target_properties( ${LIBNAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_BINARY_DIR} )
168+
set_target_properties( ${LIBNAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR} )
169+
endif ( MSVC )
170+
171+
add_definitions(-DUNSF_STATIC)
172+
71173
SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS})
72174

73175
IF(WIN32 AND UnSF_NO_UID_DEFS)
74176
SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS NO_UID_DEFS)
177+
ELSEIF(NOT WIN32)
178+
SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY POSITION_INDEPENDENT_CODE TRUE)
75179
ENDIF()
76180

77181
SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
78182
SOVERSION ${LIB_MAJOR_VERSION})
79183

80184
# build executable
81-
ADD_EXECUTABLE(unsf unsf.c libunsf.h)
82-
ADD_DEPENDENCIES(unsf ${LIBNAME})
83-
TARGET_LINK_LIBRARIES(unsf ${libUnSF_LOCATION} ${EXTRA_LIBS})
185+
IF (MSVC)
186+
SET(GETOPT getopt.c)
187+
ELSE ()
188+
SET(GETOPT)
189+
ENDIF ()
190+
ADD_EXECUTABLE(sf2pat unsf.c libunsf.h ${GETOPT})
191+
ADD_DEPENDENCIES(sf2pat ${LIBNAME})
192+
TARGET_LINK_LIBRARIES(sf2pat ${libUnSF_LOCATION} ${EXTRA_LIBS})

appveyor.yml

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
version: "{build}"
2+
3+
branches:
4+
only:
5+
- master
6+
- /unsf-.*$/
7+
8+
environment:
9+
matrix:
10+
- GEN: "Visual Studio 14 2015"
11+
CFG: Release
12+
- GEN: "Visual Studio 14 2015 Win64"
13+
CFG: Release
14+
15+
matrix:
16+
fast_finish: true
17+
18+
# For the Qt, Boost, CMake, etc installs
19+
os: unstable
20+
21+
# We want the git revision for versioning,
22+
# so shallow clones don't work.
23+
clone_depth: 1
24+
25+
clone_folder: C:\projects\unsf
26+
27+
before_build:
28+
- del "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common.targets\ImportAfter\Xamarin.Common.targets"
29+
30+
build_script:
31+
- mkdir build
32+
- cd build
33+
- cmake .. -G"%GEN%"
34+
- cmake --build . --config %CFG% --clean-first
35+
# - cmd: msbuild unsf.sln /t:Build /p:Configuration=%configuration% /m:2 /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"

libunsf.c

+14-2
Original file line numberDiff line numberDiff line change
@@ -1049,14 +1049,26 @@ static int unsf_mkdir(char *dir) {
10491049
char *path;
10501050
char *old_path;
10511051
char *tok_thread;
1052+
int absolute_path = 0;
10521053

10531054
assert(dir && *dir);
10541055

10551056
dup_dir = strdup(dir);
10561057

1058+
if (dup_dir[0] == '/' || dup_dir[0] == '\\')
1059+
absolute_path = 1;
1060+
10571061
/* get the first token */
10581062
token = strtok_r(dup_dir, "\\/", &tok_thread);
1059-
path = unsf_concat(token, "/");
1063+
if (absolute_path) {
1064+
path = unsf_concat("/", token);
1065+
old_path = path;
1066+
path = unsf_concat(path, "/");
1067+
free(old_path);
1068+
} else {
1069+
path = unsf_concat(token, "/");
1070+
}
1071+
10601072
/* walk through other tokens */
10611073
while( token != NULL ) {
10621074
if (sys_mkdir(path) == -1) {
@@ -3160,8 +3172,8 @@ UNSF_SYMBOL void unsf_convert_sf_to_gus(UnSF_Options *options) {
31603172

31613173
if (!options->opt_no_write) {
31623174
if (!(options->cfg_fd = fopen(config_file_path, "wb"))) {
3163-
free(config_file_path);
31643175
printf("Couldn't open %s for writing.\n", config_file_path);
3176+
free(config_file_path);
31653177
return;
31663178
} else
31673179
printf("Opened %s for writing.\n", config_file_path);

libunsf.h

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#ifndef UNSF_LIBUNSF_H
22
#define UNSF_LIBUNSF_H
33

4+
#include <stdlib.h>
5+
46
/* set our symbol export visiblity */
57
#if defined _WIN32 || defined __CYGWIN__
68
/* ========== NOTE TO WINDOWS DEVELOPERS:

unsf.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ int main(int argc, char *argv[]) {
116116

117117
unsf_convert_sf_to_gus(&options);
118118

119-
free(options.basename);
120-
if (!options.opt_no_write) fclose(options.cfg_fd);
119+
if (options.basename) free(options.basename);
120+
if (!options.opt_no_write && options.cfg_fd) fclose(options.cfg_fd);
121121
printf("Finished!\n");
122122

123123
return 0;

0 commit comments

Comments
 (0)